Чтение онлайн

на главную - закладки

Жанры

Графика DirectX в Delphi

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

Шрифт:

D3DFVF_NORMDIFFTEXTVERTEX = D3DFVF_XYZ or D3DFVF_NORMAL or

D3DFVF_DIFFUSE or D3DFVFJTEX1; // FVF-флаг для треугольников человечков

D3DFVFJSIORMVERTEX = D3DFVF_XYZ or D3DFVFJTORMAL;

// Имя файла с описанием мира

WorldFile = 'Data/World.txt';

// Имя файла с треугольниками символов, для вывода FPS

NumbersFile = 'Data/Numbers.txt';

// Количество треугольников в описании окружения

NumTriangles = 58;

($1 legoman.pas) // Данные модели

var

frmD3D: TfrmD3D;

Frames : Integer =0; //

Счетчик кадров

FpsOut : String = ''; // Значение FPS

// Вспомогательная матрица, для вывода символов FPS

LetTrans : TDSDMatrix;

// Используется как вспомогательный массив для хранения образа текстуры

TexPointer : Pointer;

// Характеристики образа текстуры

wrkTexWidth, wrkTexHeight :

Integer;

// Флаг, выводить ли FPS

flgFPS : BOOL = True;

// Угол зрения по вертикали

Lookupdown : Single = 0.0;

// Вспомогательный вектор для оптимизации

ZVector : TD3DVector;

// Угол зрения по горизонтали и положение игрока

RotY, XPos, ZPos : Single;

// Массив описания мира

World : Array [0..NumTriangles - 1] of TTriangle;

// Переменные для обработки устройств ввода

DInput : IDIRECTINPUT8 = nil;

DIMouse : IDIRECTINPUTDEVICE8 = nil;

DIKeyboard : IDirectlnputDeviceS;

KeyBuffer : TDIKeyboardState;

// Угол поворота красного человечка

Angle : Single = 0.0;

// Угол поворота конечностей человечков

AngleFoot : Single = 0.0;

StepFoot : Single = 0.1;

// Тестовая точка для определения столкновений с препятствиями

TestPointX, TestPointY : DWORD;

В файле описания окружения данных идут в следующем порядке:

строка комментария; номер текстуры; цвет треугольника; три строки описания вершин треугольника, которые включают координаты в пространстве; нормаль и текстовые координаты каждой вершины треугольника.

*

Вот что записано в текстовом файле для первого треугольника:

// Потолок

4

$00FF0000

– 3.0 1.0 3.0 0.0 -1.0 0.0 0.0 0.0

– 3.0 1.0 -3.0 0.0 -1.0 0.0 0.0 12.0

1.0 3.0 0.0 -1.0 0.0 12.0 0.0

Пол и потолок комнаты представляют собой квадраты с координатами точек углов по диагонали (-3; -3) и (3; 3). Координата Y для всех вершин пола нулевая, для вершин потолка - единичная. При считывании данных предусматриваем обработку исключений на случай отсутствия файла данных или присутствия ошибки при описании треугольников:

procedure TfrmD3D.SetupWorld;

var

t : TextFile;

i, j : Integer;

Vertices : /4TNormDiffTextVertex;

wrkStr : tring;

begin

if FileExists(WorldFile) then begin AssignFile(t, WorldFile);

try

Reset(t); FD3DVB.Lock(0, NumTriangles * 3 * SizeOf(TNormDiffTextVertex),

PByte(Vertices), 0) ;

for i := 0 to NumTriangles - 1 do begin

//

Строка комментария, в программе не используется

ReadLn (t, wrkStr) ;

ReadLn (t, World[i].NumTexture); // Текстура треугольника

ReadLn (t, World[i].DIFFUSE); // Цвет вершин треугольника

for j := 0 to 2 do begin // Три вершины треугольника

ReadLn (t, Vertices.X, Vertices.Y, Vertices.Z,

Vertices.nX, Vertices.nY, Vertices.nZ,

Vertices.U, Vertices.V);

Vertices.DColor := World[i].DIFFUSE;

Inc(Vertices);

end;

end;

FD3DVB.Unlock;

except // Данные на треугольник заданы неверно

raise EAbort.Create ('Can''t read file: ' + WorldFile);

end;

CloseFile(t) ;

end else raise EAbort.Create ('Can''t read file: ' + WorldFile);

end;

При возникновении исключений программа завершается, описание ошибки выводится в текстовый файл.

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

Координаты игрока задаются значениями переменных xpos и Zpos, переменная RotY определяет угол поворота головы наблюдателя вокруг своей оси, а переменная Lookupdown - наклон головы по вертикали. Сразу после запуска игрок "располагается" в точке (0, 0, 0), направление взгляда параллельно оси X.

Текстуры треугольников задаются обычным образом, но текстуры, накладываемые на квадраты выходов из сектора, инициализируются отдельной функцией:

procedure TfrmD3D.FormCreate(Sender: TObject);

var

hRet : HRESULT;

matView, matProj : TD3DMatrix;

wrkMat : TDSDMatrix; // Вспомогательная матрица разворота человечков

begin

// Приложение полноэкранное, курсор отключаем

ShowCursor (False);

Randomize;

hRet := InitDSD;

if Failed (hRet) then ErrorOut ('InitD3D', hRet);

hRet := InitVB;

if Failed (hRet) then ErrorOut ('InitVertex', hRet);

try

InitVBLetter; // Считываются треугольники цифр

except // Возможно, файл удален

Поделиться:
Популярные книги

Дракон - не подарок

Суббота Светлана
2. Королевская академия Драко
Фантастика:
фэнтези
6.74
рейтинг книги
Дракон - не подарок

Бастард Императора. Том 8

Орлов Андрей Юрьевич
8. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 8

Чужая дочь

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Чужая дочь

Эра Мангуста. Том 2

Третьяков Андрей
2. Рос: Мангуст
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эра Мангуста. Том 2

Идеальный мир для Лекаря 14

Сапфир Олег
14. Лекарь
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 14

Один на миллион. Трилогия

Земляной Андрей Борисович
Один на миллион
Фантастика:
боевая фантастика
8.95
рейтинг книги
Один на миллион. Трилогия

Помещицы из будущего

Порохня Анна
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Помещицы из будущего

Шлейф сандала

Лерн Анна
Фантастика:
фэнтези
6.00
рейтинг книги
Шлейф сандала

Черный маг императора 2

Герда Александр
2. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
6.00
рейтинг книги
Черный маг императора 2

Император

Рави Ивар
7. Прометей
Фантастика:
фэнтези
7.11
рейтинг книги
Император

Бандит 2

Щепетнов Евгений Владимирович
2. Петр Синельников
Фантастика:
боевая фантастика
5.73
рейтинг книги
Бандит 2

На границе империй. Том 9. Часть 2

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Князь Серединного мира

Земляной Андрей Борисович
4. Страж
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Князь Серединного мира

Чайлдфри

Тоцка Тала
Любовные романы:
современные любовные романы
6.51
рейтинг книги
Чайлдфри