Читаем Графика DirectX в Delphi полностью

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;

Range := 2.5;

end;

with FD3DDevice do begin SetLight(0, LightO);

SetLight(l, Lightl);

SetLight(2, Light2);

LightEnable(0, True);

LightEnable(1, True);

LightEnable (2, True);

end;

end;

Все объекты сцены, за исключением человечков, освещаются тремя источниками света. При воспроизведении человечков точечный источник выключается.

При воспроизведении сцены голову наблюдателя "помещаем" в точку, соответствующую его текущему положению в пространстве, и поворачиваем ее в направлении RotY:

procedure TfrmDSD.DrawScene;

var

i : Integer;

matView : TD3DMatrix;

begin

// Видовая матрица, в соответствии с текущими параметрами игрока

SetViewMatrix(matView, D3DVector(XPos, 0.25, ZPos).,

D3DVector (XPos + cos (RotY) ,* 0.25 + Lookupdown,

ZPos - sin (RotY)), ZVector);

with FD3DDevice do begin

SetTransform(D3DTS_VIEW, matView);

SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);

SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);

SetRenderState(D3DRS_LIGHTING, DWORD (True));

end;

// При необходимости выводим значение

FPS if flgFPS then DrawLetters; // Рисуем человечков

DrawManl; // Красный

DrawMan2; // Синий

DrawMan3; // Зеленый

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных