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

ЖАНРЫ

Графика DirectX в Delphi

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

Шрифт:

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 // Возможно, файл удален

on E : EAbort do ErrorOut (PChar(E.Message), S_FALSE);

end;

InitMan; // Инициализация буфера вершин человечков

try

SetupWorld; // Считываем данные мира

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

ZVector := D3DVector(0, 1, 0);

// Матрица

перемещений букв при выводе FPS

LetTrans := IdentityMatrix;

LetTrans._42 := 0.5;

LetTrans._43 := 0.9;

// Первоначальные положения человечков

transManl := IdentityMatrix;

transMan2 := IdentityMatrix;

transMan2._41 := 3.1; // Синий человечек перемещается по оси X

transManS := IdentityMatrix;

// Зеленый человечек устанавливается в первоначальное положение

transMan3._41:= МапЗРозХ;

transMan3._43 := ManSPosZ;

// Разворот модели человечков

SetRotateYMatrix (wrkMat, -Pi / 2);

SetRotateXMatrix (matWrkl, -Pi / 2) ;

matWrk2 := MatrixMul (wrkMat, Matwrkl);

matWrk3 := matWrk2;

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

SetTranslateMatrix(transFootl, 0, 0, -0.1);

SetTranslateMatrix(transFoot2, 0, 0, 0.1);

SetTranslateMatrix(transHandl, 0.25, 0.0, -0.2);

SetTranslateMatrix(transHand2, -0.25, 0.0, 0.2);

SetupLights;

// Первоначальные установки, в дальнейшем переопределяются

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

ZVector);

FDSDDevice.SetTransform(D3DTS_VIEW, matView);

SetProjectionMatrixfmatProj, 1, 1, 0.01, 6) ;

FDSDDevice.SetTransform(D3DTS_PROJECTION, matProj);

// Инициализация текстур

try

InitTexture (FD3DTextures [0], 'data/0.bmp');

InitTexture (FD3DTextures [1], 'data/1.bmp1);

InitTexture (FD3DTextures [2], 'data/2.bmp');

InitTexture (FD3DTextures [3], 'data/3.bmp');

InitTexture (FD3DTextures [4], 'data/4.bmp');

InitTexture (FDSDTextures [5], 'data/5.bmp');

BukupTexture (FD3DTextures [6], 'data/6.bmp1);

except

on E : EAbort do ErrorOut (PChar(E.Message), S_FALSE) ;

end;

OnCreateDevice; // Инициализация устройств ввода

end;

Всего предусмотрено три источника света: два направленных и один точечный, располагающийся под потолком в центре комнаты:

procedure TfrmD3D.SetupLights;

var

LightO : TD3DLight8;

Lightl : TD3DLight8;

Light2 : TD3DLight8;

begin

// Направленные источники светят во взаимно противоположных направлениях

LightO := InitDirectionalLight(D3DVector(-0.5, -0.5, -1) , 0.5,

0.5, 0.5, 0); Lightl := InitDirectionalLight(VectorNormalize(DSDVector(0.5, 0.5, D),

0.5, 0.5, 0.5, 0); // Точечный источник

ZeroMemory(@Light2, SizeOf(Light2));

with Light2 do begin

JType := D3DLIGHT_POINT;

Diffuse.r := 0.5;

Diffuse.g := 0.5;

Diffuse.b := 0.5;

Specular := Diffuse;

Ambient := Diffuse;

Position := DSDVector(0.0, 1.0, 0.0);

Attenuation0 := 1.0;

Attenuationl := 0.0;

Attenuation2 := 0.0;

Поделиться с друзьями: