Графика DirectX в Delphi
вернуться

Краснов Михаил

Шрифт:

end;

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

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;

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

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

Lookupdown := Lookupdown + 0.05;

if Lookupdown > 1 then Lookupdown := 1;

end;

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

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;

  • Читать дальше
  • 1
  • ...
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153

Private-Bookers - русскоязычная библиотека для чтения онлайн. Здесь удобно открывать книги с телефона и ПК, возвращаться к сохраненной странице и держать любимые произведения под рукой. Материалы добавляются пользователями; если считаете, что ваши права нарушены, воспользуйтесь формой обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • help@private-bookers.win