Михаил Краснов - Графика DirectX в Delphi

Здесь есть возможность читать онлайн «Михаил Краснов - Графика DirectX в Delphi» — ознакомительный отрывок электронной книги совершенно бесплатно, а после прочтения отрывка купить полную версию. В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Графика DirectX в Delphi: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Графика DirectX в Delphi»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Графика DirectX в Delphi — читать онлайн ознакомительный отрывок

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Графика DirectX в Delphi», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

hRet := FDSTextBMP.LockRect(0, d3dlr, nil, 0);

if FAILED(hRet) then begin

Result := hRet;

Exit;

end;

// Копируем в него первоначальный растр

CopyMemory (d3dlr.pBits, TexPointer, 4 * wrkTexWidth * wrkTexHeight);

dwDstPitch := d3dlr.Pitch;

// Произвольные точки текстуры закрашиваем черным

for i := 1 to 10000 do

PDWORD (DWORD(d3dlr.pBits) + DWORD(random(wrkTexHeight)) * dwDstPitch +

DWORD(random(wrkTexWidth)) * 4)Л := 0; Result := FD3TextBMP.OnlockRect(0);

end;

Одно из самых важных мест кода - управление игроком. Перемещения мыши изменяют его положение и угол поворота головы по горизонтали, клавиши управления курсором отвечают за положение игрока в пространстве, клавиши и ответственны за угол поворота головы по вертикали:

function TfrmD3D.ReadImmediateData : HRESULT;

var

hRet : HRESULT; dims2 : TDIMOUSESTATE2;

NewXPos, NewZPos : Single;

begin

Zero-Memory (8dims2, SizeOf (dims2) ) ;

hRet := DIMouse.GetDeviceState(SizeOf(TDIMOUSESTATE2), @dims2);

if Failed (hRet) then begin

hRet := DIMouse.Acquire;

while hRet = DIERR_INPUTLOST do

hRet := DIMouse.Acquire; end;

// Перемещение курсора мыши влево-вправо

if dims2.1X <> О

// Меняем угол поворота головы по горизонтали

then RotY := RotY + 0.01 * dims2.1X; // Перемещение курсора мыши вперед-назад

if dims2.1Y > 0 then begin // Движение игрока назад

// Вычисляем новое положение

NewXPos := XPos + sin(RotY - Pi / 2) * 0.05;

NewZPos := ZPos + cos(RotY - Pi / 2) * 0.05;

// Нет ли препятствий к движению назад, голову разворачиваем

if TestRender (NewXPos, NewZPos, RotY - Pi) then begin

XPos := NewXPos; // Препятствий нет, перемещаем игрока

ZPos := NewZPos;

end

end else if dims2.1Y < 0 then begin // Движение вперед

NewXPos := XPos + sin(RotY + Pi / 2) * 0.05;

NewZPos := ZPos + cos(RotY + Pi / 2) * 0.05;

// Есть ли препятствия к движению

if TestRender (NewXPos, NewZPos, RotY) then begin

XPos := NewXPos; ZPos := NewZPos;

end;

end;

// Обработка клавиатуры

Result := DIKeyboard.GetDevicestate(SizeOf(KeyBuffer), @KeyBuffer);

if KeyBuffer[DIK_ESCAPE] and $80 <> 0 then begin // Esc

Close;

Exit;

end;

// Нажата клавиша "вправо", вычисляем новое положение в пространстве

if KeyBuffer[DIK_RIGHT] and $80 <> 0 then begin

XPos := XPos - sin(RotY) * 0.05;

ZPos := ZPos - cos(RotY) * 0.05;

end;

// Нажата клавиша "влево"

if KeyBuffer[DIK_LEFT] and $80 <> 0 then begin

XPos := XPos + sin(RotY) * 0.05;

ZPos := ZPos + cos(RotY) * 0.05;

end;

// Нажата клавиша "вниз"

if KeyBuffer[DIK_DOWN] and $80 о 0 then begin

XPos := XPos + sin(RotY - Pi / 2) * 0.05;

ZPos := ZPos + cos(RotY - Pi / 2) * 0.05;

end;

// Нажата клавиша "вверх" if KeyBuffer[DIK_UP] and $80 <> 0 then begin

XPos := XPos + sin(RotY + Pi / 2) * 0.05;

ZPos := ZPos + cos(RotY + Pi / 2) * 0.05;

end;

// Нажата клавиша "F", показывать ли значение FPS

if KeyBuffer[DIK_F] and $80 <> 0 then begin

flgFPS := not flgFPS; // Обращение значения флага

Sleep (50); // Маленькая пауза

end;

// Клавиша , голову задираем вверх

if KeyBuffer[DIK_PRIOR] and $80 <> 0 then begin

Lookupdown := Lookupdown + 0.05;

if Lookupdown > 1 then Lookupdown := 1;

end;

// Клавиша , голову опускаем вниз

if KeyBuffer[DIK_NEXT] and $80 <> 0 then begin

Lookupdown := Lookupdown - 0.05;

if Lookupdown < -1 then Lookupdown := -1;

end;

end;

Обратите внимание, что при перемещении с помощью мыши осуществляется проверка, нет ли на пути движения препятствия, стены комнаты или ящика. При нажатии клавиш такую проверку не произвожу, и игрок свободно проходит через все препятствия. Опускаю я проверку, чтобы определить, сильно ли она замедляет работу программы.

Для проверки того, свободен ли путь, я применяю самый простой метод: в заднем буфере сцена воспроизводится в новой точке, взгляд наблюдателя при этом повернут в направлении движения. Глаз наблюдателя опускаем ближе к полу, и выясняем цвет точки, расположенной прямо по ходу движения. Поскольку пол окрашивается красным, а препятствия и фон - синим, то синий цвет контрольной точки означает, что игрок вплотную подошел к непреодолимому препятствию или выходит за границу сектора:

function TfrmD3D.TestRender (const XPos, ZPos, RotY : Single) : BOOL;

var

i : Integer; matView : TD3DMatrix; d3dlr : TD3DLOCKED_RECT;

dwDstPitch : DWORD; DWColor : DWORD;

В : Byte; // Доля синего пиксела контрольной точки

begin

В := 0; // Предотвращение замечаний компилятора

// Смотрим на сцену из новой точки, по вертикали - ближе к полу

SetViewMatrix(matView, D3DVector(XPos, 0,1, ZPos),

D3DVector(XPos + cos(RotY), 0.1,

ZPos -sin(RotY)), ZVector); // Упрощенное воспроизведение сцены

with FD3DDevice do begin

Clear(0, nil, D3DCLEAR_TARGET or D3DCLEAR_ZBUFFER,

$000000FF, 1.0, 0); BeginScene;

// Отключаем источники света

-SetRenderState(D3DRS_LIGHTING, DWORD (False)); // Использовать диффузный компонент описания вершин SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1);

SetTransform(D3DTS_VIEW, matView);

SetStreamSource(0, FD3DVB, SizeOf(TNormDiffTextVertex));

SetVertexShader(D3DFVF_NORMDIFFTEXTVERTEX); SetTransform(D3DTS_WORLD, IdentityMatrix);

end;

// Рисуем только комнату

for i := 0 to NumTriangles - 1 do with FD3DDevice do

DrawPrimitive(D3DPT_TRIANGLELIST, 1*3, 1);

with FD3DDevice do begin

EndScene;

// Получаем доступ к заднему буферу

GetBackBuffer (О, D3DBACKBUFFER_TYPE_MONO, FD3SurfBack);

SetRenderState(D3DRS_LIGHTING, DWORD (True));

end;

// Запираем задний буфер

FD3SurfBack.LockRect (d3dlr, nil, D3DLOCK_READONLY);

dwDstPitch := d3dlr.Pitch;

// Определяем долю синего в контрольной точке case

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Графика DirectX в Delphi»

Представляем Вашему вниманию похожие книги на «Графика DirectX в Delphi» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Графика DirectX в Delphi»

Обсуждение, отзывы о книге «Графика DirectX в Delphi» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x