fle game engine - движок для создания игр
fle game engine - движок для создания игр


Balls and holes PC game / Balls and Holes PC игра
Вакансии
Игродельня
Сегодня
26 июля 2017
1:51
Вход Регистрация Забыли пароль ?

megainformatic - игра "Веселый Буквоежка" - инструменты разработки
                   
подробнее...

Теги

создание сайтов, создание игр, дизайн, игры, информатика, уроки photshop, php, c++, музыка, delphi, cms, робосайт

Статьи сайта

megainformatic - Мастер-класс: Создание модели и текстуры Коммандного Центра (как в StarCraft 2) Часть 2

megainformatic - Мастер-класс: Создание модели и текстуры Коммандного Центра (как в StarCraft 2) Часть 3

megainformatic - Мастер-класс: Создание модели и текстуры Коммандного Центра (как в StarCraft 2) Часть 4

megainformatic - Мастер-класс: Создание модели и текстуры Коммандного Центра (как в StarCraft 2) Часть 5

megainformatic - Мастер-класс: Создание модели и текстуры Коммандного Центра (как в StarCraft 2) Часть 6

Система управления сайтом - megainformatic cms e-shop

Система управления сайтом - megainformatic cms e-shop

Система управления сайтом - megainformatic cms e-shop

megainformatic - Уроки 3ds max - Введение в 3ds max

megainformatic - ГАЛЕРЕЯ 3D-моделей

megainformatic - СОЗДАНИЕ МАКЕТА ПОМЕЩЕНИЯ

megainformatic - Создание макета помещения - этап 2

megainformatic - МОДЕЛИРОВАНИЕ НА УРОВНЕ МНОГОУГОЛЬНИКОВ

megainformatic - СОЗДАНИЕ ПРЕДМЕТОВ ОБСТАНОВКИ ПОМЕЩЕНИЯ

megainformatic - Моделирование обстановки помещения

megainformatic - Создание модели автомобиля

megainformatic - Создание текстурной развертки для модели автомобиля

megainformatic - Создание анимации вращающихся колес автомобиля

megainformatic - игра Нечто: Необъяснимое и в плену желаний

megainformatic - Основы 3D-анимации, экспорт скелетной анимации

megainformatic - Подготовка модели к использованию скелетной анимации

megainformatic - Продолжаем Создание скелета для данной модели

megainformatic - Построение ирерархических связей между объектами и основы 3d анимирования

megainformatic - Особенности экспорта моделей и анимации экспортером kWXPort080719 из 3ds max 2009 

megainformatic - Создание модели броневика (Хэд)

megainformatic cms e-mailer

megainformatic cms e-mailer

megainformatic cms e-mailer

Бесплатная Система Управления Вашим Сайтом - megainformatic cms free

megainformatic - Путешествие в мир 3d

megainformatic - Путешествие в мир 3d - страница 2

megainformatic - Путешествие в мир 3d - страница 3

megainformatic - Путешествие в мир 3d - страница 4

megainformatic - Путешествие в мир 3d - страница 5

megainformatic - Путешествие в мир 3d - страница 6

megainformatic - Создание модели броневика (Хэд) - Анимация вращения колес

megainformatic cms express files

megainformatic cms express files

megainformatic cms express files

megainformatic - Уроки Photoshop - Чудеса

megainformatic cms express files - Развертывание сайта на Вашем хостинге

megainformatic - Настольная игра "Веселый Буквоежка"

megainformatic - Уроки delphi directx 8.1

megainformatic - Уроки delphi directx 8.1 - Урок 1 - Введение в Delphi DirectX 8.1. Создание шаблона стартового приложения.

megainformatic - Уроки delphi directx 8.1 - Урок 1 - Введение в Delphi DirectX 8.1. Создание шаблона стартового приложения. Страница 2

megainformatic - Урок 2 Создаем и обрабатываем команды меню.

megainformatic - Урок 2 Создаем и обрабатываем команды меню. Страница 2

megainformatic - Урок 3 Оконный и полноэкранный режимы работы D3D-приложения. Управление игрой средствами DirectInput8

megainformatic - Урок 3 Оконный и полноэкранный режимы работы D3D-приложения. Управление игрой средствами DirectInput8 - Страница 2

megainformatic - Урок 3 Оконный и полноэкранный режимы работы D3D-приложения. Управление игрой средствами DirectInput8 - Страница 3

megainformatic - Урок 4 Построение класса приложения

megainformatic - Урок 4 Построение класса приложения - Страница 2

megainformatic - Урок 5 Построение классов игровых объектов и других необходимых классов

megainformatic - Урок 5 Построение классов игровых объектов и других необходимых классов - Страница 2

megainformatic - Урок 6 Игровая логика

megainformatic - Заметки по joomla - JFolder::create: Path not in open_basedir paths. Что это?

     
 
Урок 1 Введение в Delphi DirectX 8.1. Создание шаблона стартового приложения.
 
О том, что потребуется для данного урока читайте в основном разделе - уроки delphi directx 8.1
 
Далее у читателя подразумевается наличие базовых знаний языка Delphi.
 
[назад] [страница 2] [далее] [к содержанию]
 

В секцию интерфейса добавьте полное описание класса TD3DGameApp -

TD3DGameApp = class(TD3DAbstractApp)
private
// fAppForm: TMainForm;

protected
FOldWndProc: Pointer;
m_strAppName: PChar;

// Internal variables used for timing
m_bFrameMoving: Boolean;
m_bSingleStep: Boolean;

m_dwWindowStyle: Cardinal;
m_rcWindowBounds: TRect; // Saved window bounds for mode switches
m_rcWindowClient: TRect;

m_DesktopMode: D3DDISPLAYMODE;
m_d3dfmtFullscreen: D3DFORMAT; // Pixel format for fullscreen modes

//m_bFullScreen, // Whether app is fullscreen (or windowed)
m_bIsActive, // Whether app is active

m_bMouseVisible: Boolean; // Whether mouse is visible

// DirectDraw/Direct3D objects

m_d3dpp: D3DPRESENT_PARAMETERS;

//m_UserInput: TUserInput; // Struct for storing user input

// Variables for timing
m_fFPS: Single; // Instanteous frame rate
m_strFrameStats: array[0..89] of Char; // String to hold frame stats


// Variables for timing
m_fTime: Single; // Current time in seconds

function OneTimeSceneInit(hWindow: HWND): HRESULT;
function FrameMove: HRESULT;
function Render: HRESULT;
function FinalCleanup: HResult;

function Render3DEnvironment: HRESULT;

// Input functions
procedure SetDefaultDefKeys;
procedure CreateInputObjects;
procedure DestroyInputObjects;
function UpdateInput: HResult;

// Display functions
function CreateDisplayObjects(h_Wnd: HWND): HRESULT;

function RestoreDisplayObjects: HRESULT;
procedure SetDefaultRenderStates;

function InvalidateDisplayObjects: HRESULT;
function DestroyDisplayObjects: HRESULT;

// Rendering functions
procedure ShowFrame;

// работа со звуком
//function CreateSoundObjects(h_Wnd: HWND): HRESULT;
//procedure DestroySoundObjects;

procedure Cleanup3DEnvironment;

public
m_fElapsedTime: Single; // Time elapsed since last frame

m_bPaused: Boolean;

fAspectRatio: Single;
m_dwScreenWidth, // Dimensions for fullscreen modes
m_dwScreenHeight: Cardinal;

m_hWndMain: HWND; // Main window

m_pd3dDevice: IDIRECT3DDEVICE8; // Class to handle D3D device
m_d3dCaps: TD3DCaps8; // Caps for the device

m_bDisplayReady: Boolean; // Whether display class is initialized

m_d3dfmtTexture: D3DFORMAT; // Pixel format for textures

m_light: TD3DLIGHT8;

m_dwAppState: TAppStates; // Current state the app is in

m_DXInput: TDXInput; //управление игрой через DirectInput

m_pGameFont: CD3DFont;//TD3DGameFont;

m_Camera: CD3DCamera; // Camera used for 3D scene

// DirectMusic objects
//m_pMusicManager: CMusicManager; // Class to manage DMusic objects

//AppRootDir: string;m_bShowFPSOn, bShowHelpText: Boolean;

//HardLevel: Integer; //уровень сложности игры

function Create_(hInstance: LongWord): HResult;
function Run: Integer;
function MsgProc(hWnd:HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
constructor Create;
destructor Destroy; override;
procedure WindowProcedure(var Message: TMessage); override;

//debug functions
procedure ShowFPS;

procedure CountFPS;

// Error handling
procedure CleanupAndDisplayError(dwError: Cardinal);


end;


 

В секцию реализации (implementation) добавьте реализацию всех описанных методов.

Строки помеченные данным цветом можно пока опустить

Лучше всего это делать по одному методу, тогда Вам легче будет отследить ошибки.

Поскольку все описанные выше методы уже описаны в модуле Main.pas архива с исходным кодом игры "Ну, Погоди!", то просто откройте этот файл из Delphi или даже просто блокнотом, а затем находите реализации нужных методов и вставляйте их в свой код.

 

Например, находим в модуле Main.pas метод constructor TD3DGameApp.Create;

Копируем весь код реализации этого метода -

{ TD3DGameApp }

constructor TD3DGameApp.Create;
begin
inherited Create;

WindowProc := WindowProcedure;
FOldWndProc := nil;

m_strAppName := 'Nu, Pogodi!';
m_hWndMain := 0;
m_hWnd := m_hWndMain;
m_dwScreenWidth := 631;
m_dwScreenHeight := 380;
fAspectRatio := m_dwScreenWidth / m_dwScreenHeight;

m_bIsActive := False;
m_bDisplayReady := False;
m_bMouseVisible := True;

m_bFrameMoving := True;
m_bSingleStep := False;

m_dwAppState := asBeginInit;

m_pd3dDevice := nil;

m_pGameFont := nil;

m_Camera := nil;

m_bShowFPSOn := True;
bShowHelpText := True;

m_DXInput := nil;
m_bPaused := False;

//Area := -1;

{GameMode := gmRestart;
HardLevel := 3;

WinCartoon := nil;}
end;

и вставляем в код модуля формы TMainForm нашего проекта.

 
Код который пока не имеет отношения к нашим задачам нужно опускать.
 

Аналогично добавьте код в секцию интерфейса и реализации для всех описанных на схеме функционирования D3D-приложения и для вложенных методов.

Попробуйте откомпилировать приложение.

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

Например, класс TD3DGameApp является производным от TD3DAbstractApp, который в свою очередь нигде не объявлен.

Что же делать?

Вам всего лишь нужно настроить Ваш проект на использование модулей из библиотеки Delphi DirectX, которая есть в папке common исходного кода игры "Ну, Погоди!", а затем подключать нужные модули в пункте uses в секции интерфейса или реализации.

Так для указанного выше примера Вам нужно вызвать настройки вашего проекта

для среды Delphi 2006 выбрать пункты меню

Project > Options > Directories/Conditionals и в пункте Search Path указать абсолютные (или лучше относительные) пути к исходным файлам библиотеки Delphi DirectX например так

 
 
В этом примере папка common с исходным кодом библиотеки Delphi DirectX 8.1 располагается на три уровня выше папки с текущим проектом
 
Относительные пути удобнее тем, что если располагать нужные файлы библиотек и проектов внутри папок одной и той же корневой папки, то пути будут одни и те же в разных системах если копировать или формировать эту корневую папку целиком. Если же Вы укажете абсолютные пути, то для каждой системы Вам придется их каждый раз корректировать применительно к расположению папок внутри указанной системы.
 

Теперь остается подключить нужные модули из библиотеки в пункте uses нужной секции (интерфейса или реализации).

Если Вы знакомы с основами программирования на Delphi, то должны знать, что сразу в обоих секциях ссылка не ставится.

Если ставите ссылку на модуль в пункте uses секции интерфейса, то весь общедоступный (public) код этого модуля становится доступен как в интерфейсной, так и в реализационной части данного модуля проекта.

Если ставите ссылку на модуль в пункте uses секции реализации, то его общедоступный код будет доступен только внутри секции реализации данного модуля проекта.

 

В нашем примере класс TD3DAbstractApp объявлен в модуле D3DAbstractApp.pas внутри папки common библиотеки Delphi DirectX.

Следовательно для его подключения в пунке uses секции интерфейса нужно указать имя подключаемого модуля -

 
 

Как узнать какие классы в каких модулях библиотеки Delphi DirectX найти?

Для этого нужно посмотреть исходный код модулей библиотеки, чтобы познакомиться с ним поближе, можно выполнить поиск требуемой фразы по файлам внутри папки библиотеки, можно также ориентироваться на исходный код игры "Ну, Погоди!" из которого будет ясно (если навести указатель мыши) какой тип к какому модулю относится.

 
Таким образом следующим Вашим заданием будет являться поиск и подключение необходимых модулей из библиотеки Delphi DirectX, чтобы устранить ошибки связанные с использованием типов и классов из данной библиотеки.
 
Тип TAppStates и некоторые другие недостающие поля и типы, являющиеся локальными для данного модуля нужно описать дополнительно, как это сделано в модуле Main.pas исходного кода проекта игры "Ну, Погоди!"
 

Так например указанный тип TAppStates описан перед описанием класса TD3DGameApp как

// состояния в которых может находиться приложение
TAppStates = (asBeginInit, asInit, asEndInit, asReady, asGame);

 

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

Вам нужно всего лишь добавить его на форму окна приложения, разместить нужным образом, назвать например RenderWindowPanel.

Тогда код который Вы добавите из модуля Main.pas исходного кода игры "Ну, Погоди!" Вам станет ясен и всё встанет на свои места.

 

Когда Вы закончите с добавлением всех необходимых методов, полей, переменных, констант и прочего у Вас сразу же возникнет вопрос:

Как реализовать метод ApplicationEventsIdle ?

Для этого Вам достаточно добавить на форму окна компонент TApplicationEvents, назвать его например ApplicationEvents, он находится на вкладке Additional палитры компонентов Delphi 2006. Добавив его для него нужно создать событие OnIdle и вставить в него код из аналогично обработчка модуля Main.pas исходного кода игры "Ну, Погоди!".

Таким образом, если Вы добавили весь необходимый код, попробовали откомпилировать и не получили никаких ошибок во временя компиляции, то Вам осталось сделать совсем немного, чтобы приложение заработало как нам нужно.

Еще раз взгляните на реализацию метода

procedure TMainForm.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
begin
inherited;
Done:= True;

// Do not render if the app is minimized
if IsIconic(Application.Handle) then Exit;

// Update and render a frame
if g_d3dApp <> nil then begin

if g_d3dApp.m_bDisplayReady then
begin
g_d3dApp.Render3DEnvironment;
end;
end;

// Keep requesting more idle time
Done:= False;
end;

и на схему функционирования D3D-приложения -

 
 

Код создания необходимых объектов D3D добавлен и реализован внутри FormShow, код освобождения выделенных ресурсов также добавлен и реализован внутри FormDestroy. Код внутри UpdateInput, частично внутри FrameMove пока можно опустить.

Остается лишь метод Render3DEnvironment, а внутри него метод Render -

function TD3DGameApp.Render: HRESULT;
begin

// Render the scene based on current state of the app
case m_dwAppState of

asInit: ;

asReady: begin
//DrawGameView;
//ShowFrame;
end;

//asGame: DrawGameView;

end;

result := S_OK;
end;

 

Если Вы еще не поняли до конца что нужно сделать, тогда рассмотрим более детально как будет работать наше приложение.

Итак,

(для лучшего понимания ориентируйтесь по схеме и исходному коду)

program DelphiDirectXStartTemplate;

uses
Forms,
Main in 'Main.pas' {MainForm};

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.

Т. е. среда Delphi инициализирует приложение, создает его форму MainForm и запускает цикл прокачки сообщений (Run).

Во время показа формы (FormShow) будет вызван код этого метода. Внутри него как мы видим вызывается метод InitD3DApp

Он вызывает создание объекта класса TD3DGameApp и вызывает метод его инициализации Create_

Внутри данного метода происходит создание еще одного окна. Зачем?

Это связано с тем, что существуют два режима работы D3D-приложения: оконный и полноэкранный. Для каждого из них должно быть создано своё окно. Это указано также в английских комментариях к коду, которые были сохранены при конверсии примеров из DX SDK на C++.

В нашем случае приложение пока не потребует полноэкранного режима, но создание отдельного окна все равно требуется для корректной работы создаваемых объектов DirectX.

Далее вызывается метод OneTimeSceneInit, внутри которого происходит создание объектов DirectX - Direct3D, Direct3DDevice и т.д. Там же происходит загрузка необходимых текстур, звуков, моделей, текста и прочего.

Но для нас сейчас важно не это. Важно, что в конце реализации данного метода приложение переходит в состояние -

m_dwAppState := asBeginInit;

Если посмотрим далее, в ту часть кода метода FrameMove, которую Вам нужно было оставить -

function TD3DGameApp.FrameMove: HRESULT;
begin
case m_dwAppState of
asBeginInit: begin
//LoadGameTextures;
//RestoreGameTextures;
m_dwAppState := asInit;
end;
asInit: m_dwAppState := asEndInit;
asEndInit: m_dwAppState := asReady;

asReady: {UpdateInput};
asGame: {FrameMoveGameScene};
end;

result := S_OK;
end;

Здесь состояние переходит в asReady. Текстуры и прочее мы пока опускаем из-за упрощенных задач, которые пока стоят перед нами.

Нам остается заглянуть внутрь метода Render -

function TD3DGameApp.Render: HRESULT;
begin

// Render the scene based on current state of the app
case m_dwAppState of

asInit: ;

asReady: begin
//DrawGameView;
//ShowFrame;
end;

//asGame: DrawGameView;

end;

result := S_OK;
end;

 

Здесь Вам остается раскомментировать строку //DrawGameView;

DrawGameView;

А далее, добавить описание и реализацию этого метода в класс TD3DGameApp -

описание -

protected

{...}

// Rendering functions

procedure DrawGameView;

{...}

реализация -

procedure TD3DGameApp.DrawGameView;
begin
if not Assigned(m_pd3dDevice) then Exit;

// Begin the scene
if SUCCEEDED(m_pd3dDevice.BeginScene) then
begin
// Erase the screen
m_pd3dDevice.Clear( 0, nil, D3DCLEAR_TARGET or D3DCLEAR_ZBUFFER, $FF000000,
1.0, 0 );

//DrawGameScene;


//CountFPS;
// End the scene
m_pd3dDevice.EndScene;
end;


end;

 

Теперь Вам нужно скомпилировать Ваше приложение и попробовать его запустить. Если Вы получаете сообщения об отсутствии dll, значит Вы забыли поместить в папку с проектом файлы

D3DX81ab.dll

DXErr81ab.dll

При запуске приложения оно должно давать примерно такой результат -

 
 
Положение окна Direct3D (черная область) будет зависеть от того, как расположить компонент TPanel, который Вы добавили на форму.
 
Если расположить его во всю рабочую область окна, а цвет очистки задать другой, то можно получить следующий результат -
 
 
На рисунке также видно как задать в коде иной цвет заполнения рабочей области окна D3D-приложения.
 

Вы можете скачать исходный код шаблона D3D-приложения (17,2 Кб)

Скачиваний : 1

пригодный для работы с библиотекой Delphi DirectX 8.1 в среде Delphi 2006 и выше. Однако помните, что для компиляции и работы Вам обязательно потребуется код библиотеки Delphi DirectX 8.1 (папка с общим кодом common).

Ее Вы можете скачать на странице Delphi DirectX - что это такое?

 
 
 

В следующем уроке:

Мы познакомимся с тем, как создать меню окна приложения и обрабатывать его команды, а также реализуем некоторые из пунктов меню - [далее]

 
 
 
[назад] [страница 2] [далее] [к содержанию]
 
     
     
     
     
     
     
     
     
 

Оставленные комментарии



fle game engine - движок для создания игр
fle game engine - движок для создания игр


Something: Unexplained 2 captive of desires / Нечто: Необъяснимое 2 в плену желаний
Костя Коробкин Комикс Коллекционное издание - 6 комиксов, 81 страница, 220 mp3 треков
megainformatic Размещение баннерной рекламы у нас
Время загрузки: 0,9075