Мобильная версия сайта | |||||||||
[Главная] | [Новости] | [Статьи] |
[Проекты] |
[Ссылки] |
[Автор] |
||||
[Архив новостей] | |||||||||
[Форум] | на форуме можно задать вопрос, посмотреть ответы на часто задаваемые вопросы | ||||||||
Здравствуйте! Вы попали на информационно-образовательный сайт посвященный информатике, информационным технологиям и компьютерным играм. Подробнее о целях и задачах сайта в разделе Главная. [English version of this page here...] | |||||||||
[Базовые уроки по DirectX] [Основы DirectMusic на Delphi] [Основы DirectInput8 на Delphi] [Основы DirectSound8 на Delphi] | |||||||||
[Разработка компьютерной игры] [Пример игры Donuts3D] [Delphi DirectX] | |||||||||
Эмулятор электронной игры Электроника ИМ-02 "Ну, Погоди!" | |||||||||
скачайте полную версию игры, зарегистрируйтесь и получите бесплатно полный исходный код игры для компиляции в delphi 7 или 2006 и уроки delphi directx 8.1 содержащие статьи по созданию собственной 2D/3D игры в среде delphi directx | |||||||||
Урок 1 Введение в Delphi DirectX 8.1. Создание шаблона стартового приложения. | |||||||||
О том, что потребуется для данного урока читайте в основном разделе - уроки delphi directx 8.1 | |||||||||
Далее у читателя подразумевается наличие базовых знаний языка Delphi. | |||||||||
[назад] [страница 2] [далее] [к содержанию] | |||||||||
В секцию интерфейса добавьте полное описание класса TD3DGameApp - TD3DGameApp
= class(TD3DAbstractApp)
protected
// Internal variables used for timing
m_dwWindowStyle: Cardinal;
m_DesktopMode: D3DDISPLAYMODE;
//m_bFullScreen, // Whether app is fullscreen (or windowed) 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
function
OneTimeSceneInit(hWindow: HWND): HRESULT;
function Render3DEnvironment: HRESULT;
// Input functions
//
Display functions
function RestoreDisplayObjects: HRESULT;
function InvalidateDisplayObjects: HRESULT;
// Rendering functions
// работа со звуком procedure Cleanup3DEnvironment;
public m_bPaused: Boolean;
fAspectRatio: Single; m_hWndMain: HWND; // Main window
m_pd3dDevice: IDIRECT3DDEVICE8; // Class to handle D3D 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 //AppRootDir: string;m_bShowFPSOn, bShowHelpText: Boolean; //HardLevel: Integer; //уровень сложности игры
function Create_(hInstance: LongWord): HResult;
//debug functions procedure CountFPS;
// Error handling
|
|||||||||
В секцию реализации (implementation) добавьте реализацию всех описанных методов. Строки помеченные данным цветом можно пока опустить Лучше всего это делать по одному методу, тогда Вам легче будет отследить ошибки. Поскольку все описанные выше методы уже описаны в модуле Main.pas архива с исходным кодом игры "Ну, Погоди!", то просто откройте этот файл из Delphi или даже просто блокнотом, а затем находите реализации нужных методов и вставляйте их в свой код. |
|||||||||
Например, находим в модуле Main.pas метод constructor TD3DGameApp.Create; Копируем весь код реализации этого метода - { TD3DGameApp } constructor
TD3DGameApp.Create;
WindowProc := WindowProcedure;
m_strAppName := 'Nu, Pogodi!';
m_bIsActive := False;
m_bFrameMoving := True; m_dwAppState := asBeginInit; m_pd3dDevice := nil; m_pGameFont := nil; m_Camera := nil;
m_bShowFPSOn := True;
m_DXInput := nil; //Area := -1;
{GameMode := gmRestart;
WinCartoon := nil;} и вставляем в код модуля формы 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 как //
состояния в которых может находиться приложение |
|||||||||
Чтобы выводить картинку не на всю рабочую область окна приложения, а лишь в область заданных размеров можно воспользоваться компонентом TPanel. Вам нужно всего лишь добавить его на форму окна приложения, разместить нужным образом, назвать например RenderWindowPanel. Тогда код который Вы добавите из модуля Main.pas исходного кода игры "Ну, Погоди!" Вам станет ясен и всё встанет на свои места. |
|||||||||
Когда Вы закончите с добавлением всех необходимых методов, полей, переменных, констант и прочего у Вас сразу же возникнет вопрос: Как реализовать метод ApplicationEventsIdle ? Для этого Вам достаточно добавить на форму окна компонент TApplicationEvents, назвать его например ApplicationEvents, он находится на вкладке Additional палитры компонентов Delphi 2006. Добавив его для него нужно создать событие OnIdle и вставить в него код из аналогично обработчка модуля Main.pas исходного кода игры "Ну, Погоди!". Таким образом, если Вы добавили весь необходимый код, попробовали откомпилировать и не получили никаких ошибок во временя компиляции, то Вам осталось сделать совсем немного, чтобы приложение заработало как нам нужно. Еще раз взгляните на реализацию метода procedure
TMainForm.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
// Do not render if the app is minimized
// Update and render a frame
if g_d3dApp.m_bDisplayReady then
// Keep requesting more idle time и на схему функционирования D3D-приложения - |
|||||||||
Код создания необходимых объектов D3D добавлен и реализован внутри FormShow, код освобождения выделенных ресурсов также добавлен и реализован внутри FormDestroy. Код внутри UpdateInput, частично внутри FrameMove пока можно опустить. Остается лишь метод Render3DEnvironment, а внутри него метод Render - function
TD3DGameApp.Render: HRESULT;
// Render the scene based on current state of the app asInit: ;
asReady: begin //asGame: DrawGameView; end;
result := S_OK; |
|||||||||
Если Вы еще не поняли до конца что нужно сделать, тогда рассмотрим более детально как будет работать наше приложение. Итак, (для лучшего понимания ориентируйтесь по схеме и исходному коду) program DelphiDirectXStartTemplate; uses {$R *.res} begin Т. е. среда Delphi инициализирует приложение, создает его форму MainForm и запускает цикл прокачки сообщений (Run). Во время показа формы (FormShow) будет вызван код этого метода. Внутри него как мы видим вызывается метод InitD3DApp Он вызывает создание объекта класса TD3DGameApp и вызывает метод его инициализации Create_ Внутри данного метода происходит создание еще одного окна. Зачем? Это связано с тем, что существуют два режима работы D3D-приложения: оконный и полноэкранный. Для каждого из них должно быть создано своё окно. Это указано также в английских комментариях к коду, которые были сохранены при конверсии примеров из DX SDK на C++. В нашем случае приложение пока не потребует полноэкранного режима, но создание отдельного окна все равно требуется для корректной работы создаваемых объектов DirectX. Далее вызывается метод OneTimeSceneInit, внутри которого происходит создание объектов DirectX - Direct3D, Direct3DDevice и т.д. Там же происходит загрузка необходимых текстур, звуков, моделей, текста и прочего. Но для нас сейчас важно не это. Важно, что в конце реализации данного метода приложение переходит в состояние - m_dwAppState := asBeginInit; Если посмотрим далее, в ту часть кода метода FrameMove, которую Вам нужно было оставить - function
TD3DGameApp.FrameMove: HRESULT;
asReady: {UpdateInput};
result := S_OK; Здесь состояние переходит в asReady. Текстуры и прочее мы пока опускаем из-за упрощенных задач, которые пока стоят перед нами. Нам остается заглянуть внутрь метода Render - function
TD3DGameApp.Render: HRESULT;
// Render the scene based on current state of the app asInit: ;
asReady: begin //asGame: DrawGameView; end;
result := S_OK; |
|||||||||
Здесь Вам остается раскомментировать строку //DrawGameView; DrawGameView; А далее, добавить описание и реализацию этого метода в класс TD3DGameApp - описание - protected {...} // Rendering functions procedure DrawGameView; {...} реализация - procedure
TD3DGameApp.DrawGameView;
// Begin the scene //DrawGameScene;
|
|||||||||
Теперь Вам нужно скомпилировать Ваше приложение и попробовать его запустить. Если Вы получаете сообщения об отсутствии dll, значит Вы забыли поместить в папку с проектом файлы D3DX81ab.dll DXErr81ab.dll При запуске приложения оно должно давать примерно такой результат - |
|||||||||
Положение окна Direct3D (черная область) будет зависеть от того, как расположить компонент TPanel, который Вы добавили на форму. | |||||||||
Если расположить его во всю рабочую область окна, а цвет очистки задать другой, то можно получить следующий результат - | |||||||||
На рисунке также видно как задать в коде иной цвет заполнения рабочей области окна D3D-приложения. | |||||||||
Вы можете скачать исходный код шаблона D3D-приложения (17,2 Кб) пригодный для работы с библиотекой Delphi DirectX 8.1 в среде Delphi 2006 и выше. Однако помните, что для компиляции и работы Вам обязательно потребуется код библиотеки Delphi DirectX 8.1 (папка с общим кодом common). Ее Вы можете скачать на странице Delphi DirectX - что это такое? или получить ее более свежую и обновленную версию вместе с полным исходным кодом игры "Ну, Погоди!" - ТОЛЬКО ДЛЯ ЗАРЕГИСТРИРОВАННЫХ ПОЛЬЗОВАТЕЛЕЙ ПОЛНОЙ ВЕРСИИ ИГРЫ "Ну, Погоди!". Стать зарегистрированным пользователем игры "Ну, Погоди!" просто - скачайте ее полную версию, прочтите условия регистрации приложенные к архиву и выполните их. |
|||||||||
В следующем уроке: Мы познакомимся с тем, как создать меню окна приложения и обрабатывать его команды, а также реализуем некоторые из пунктов меню - [далее] |
|||||||||
[назад] [страница 2] [далее] [к содержанию] | |||||||||
по всем вопросам пишите на megainformatic@mail.ru или оставьте сообщение на форуме | |||||||||
Обновления
и новости о развитии Delphi DirectX проекта http://www.megainformaticsite.pochta.ru http://www.megainformatic.boom.ru http://www.megainformatic.narod.ru
|
|||||||||
Cвои пожелания, вопросы или заметки отправляйте на: megainformatic@mail.ru или пишите на форуме |
|||||||||
Обмен ссылками | |||||||||
|
|||||||||
(с) МЕГА ИНФОРМАТИК 2006-2009 | |||||||||