Заметки по работе с DirectX8.1 SDK и по созданию 3D-игр  
     
   
     
  [Все уроки по DirectX] [Уроки по DirectSound8]  
     
 

Открытый проект Дорога в Город (Road To City)

===============================================
Открытый код игры Дорога В Город (версия 18.10.2006)
===============================================
автор: Синицин А.С.
дата публикации: 30.03.2007

 

Road2City Opensource

 

Введение

 

Вашему вниманию предлагается исходный код игры на Delphi 7 с использованием библиотек DelphiX 1.07 (by Jaro Benes) или UnDelphiX под Delphi 7. О том где взять эти библиотеки см. ниже!

 

Игра создавалась около года, это первый игровой (пока некоммерческий) проект автора.
Для компиляции требуется библиотека DelphiX или UnDelphiX c кодом, адаптированным для среды Delphi7.
Исходный код игры также написан в Delphi7, в других версиях не тестировалось,
так что будьте готовы к модификациям кода, если используете другую версию
Delphi.

 

Особенности примера

 

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

- пример создания 2D-игры на Delphi в DelphiX для DirectX7;

- игра содержит 10 уровней.

- показано движение спрайтов, анимация, скроллинг экрана (сверху-вниз), проверка столкновений для эффекта аварий, сбора ресурсов, остановки возле зданий;

- воспроизведение звуков; для музыки используется внешний плеер ModPlug Player;

- при помощи инструментов редактирования DelphiX можно посмотреть графическую реализацию графики и анимации - содержимое файлов *.dxg;

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

 

Планы развития проекта:

- Создание редактора карт;

- Разумное поведение других авто на дороге;

- Миди-музыка;

- Реализация начальной заставки, игрового меню;

- Развитие игры;

- Учет времени shareware-версии.

исходный код - 235Кб  
     
 

Путеводитель по исходному коду

Основной код приложения реализован в классе TMainForm, остальные типы - производные от TImageSprite и служат для управления игровыми спрайтами - в игре они статичные и анимированные. Тип TGamePaused служит для вывода картинки "Game Paused" во время паузы в игре (по F3); Тип TScrollBackground представляет прокручиваемый фон (трава). Дорога выводится динамически. Класс игрока - TPlayerSprite.

Для лучшего понимания работы приложения Road2City необходимо представлять порядок вызова методов класса TMainForm. Он следующий:

{методы design time} - при помещении новых компонентов DelphiX на форму приложения добавляется соотвествующий код (автоматически). Однако для нормальной работы компонентов во время runtime необходимо правильно их настроить. Главный компонент вашего приложения, занимающий всю площадь формы - это TDXDraw. Он отвечает за отрисовку графики и инкапсулирует соотвествующие методы DirectX 7. Что значит инкапсулирует? Это значит, что в его составе есть соотвествующие описания методов, а мы их вызываем и используем для своих целей. Некоторые из них вызываются автоматически за счет компонентной природы (TDXDraw происходит от TComponent).

Для любой игры на DelphiX Вам потребуются следующие компоненты на форме -

TDXDraw, TDXTimer, TDXSpriteEngine, TDXImageList, TDXInput, TDXSound, TDXWaveList и , возможно, некоторые другие (которые Вы найдете в обновленных библиотеках DelphiX).

Ядром библиотеки DelphiX является DirectX, поэтому особо не удивляйтесь величию DelphiX. Он только служит оболочкой, описывающей обращение к методам DirectX, а также выполняет некоторые дополнительные (но весьма рутинные) операции типа создания списка изображений, его загрузки, вывода спрайтов.

TDXTimer - используется для периодического вызова определенных методов, главным образом метода TDXDraw.Flip без которого просто ничего не появится на экране. TDXDraw.Flip вызывает показ сформированного в буферной памяти кадра игры в предоставленной ему области (окне приложения или на всем экране - в полноэкранном режиме). Установите необходимый интервал времени (свойство Interval), лучше просто - 0 (самый быстрый интервал !)

TDXSpriteEngine - отвечает за анимацию, т.е. последовательный вызов метода Move для каждого из принадлежащих ему спрайтов. Свойство TDXSpriteEngine.DXDraw должно содержать ссылку на компонент TDXDraw, иначе не будет анимации!

TDXImageList - загрузка списка изображений, их отрисовка. Для свойства DXDraw также укажите ссылку на TDXDraw иначе не будет отрисовки или даже ошибки будут!!

TDXInput - ввод от клавиатуры, мышки, джойстика и других устройств ввода. Здесь ничего указывать не требуется, можете только изменить значения клавиш для виртуальных IsButton1-32. Это делается двойным щелчком по компоненту.

TDXSound, TDXWaveList - используются для вывода звуков. TDXSound - интерфейс IDirectSound7, а TDXWaveList, то же, что и TDXImageList, но для списка звуков. Следовательно свойство TDXImageList.DXSound должно содержать ссылку на TDXSound.

{методы runtime} - рассмотрим что происходит при исполнении нашего приложения.

методы TMainForm.FormCreate, FormDestroy, FormClose содержат весь код инициализации, вызываемый при создании/уничтожении формы, закрытии окна приложения. Посмотрев код внутри этих методов Вы увидите что примерно требуется делать при создании/уничтожении окна формы вашей игры.

После того, как форма успешно создана/уничтожена происходит дальнейшая работа/завершение работы приложения. Обратите внимание! Я не случайно указал эти методы в паре Создание/Разрушение. Всегда создавая новый объект сразу же прописывайте и соответствующий код разрушения (Destroy, к-ый вызывается ч/з Free). Большинство ошибок начинающих писателей игр связано именно с тем, что забываем создать/уничтожить требуемые объекты!!!

Итак, если приложение все-таки заработало, что происходит дальше? Т.к. у нас на форме установлен TDXTimer, то дальше всё основывается на периодически вызываемых методах внутри метода TDXTimer.OnTimer

Загляните внутрь него и сами всё увидите!!!

Ладно, вообщем в кратце этого достаточно. Остальное я думаю, сможете постигнуть сами! Если Вы настоящие писатели игр или желаете стать таковыми. В этом Вам помогут всевозможные Help'ы по DelphiX и желательно раздобыть по DirectX SDK!!!, исходники и много много терпения и упорства!

 
     
 

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

http://www.torry.ru/pages.php?id=169

по этим ссылкам вы найдете стартовые странички, с которых можно скачать последние версии компонентов DelphiX и UnDelphiX.

 
     
 

Некоторые замечания по поводу работы с DelphiX (и UnDelphiX, далее просто DelphiX, подразумевая все последние обновления и модификации).

Когда Вы начнете работу с примером и создание собственного проекта у Вас, естественно будут возникать различные вопросы. Я надеюсь, что упорства Вам не занимать, иначе браться за создание собственной игры лучше и не стоит.

Однако вот Вам первое полезное замечание - Если Вы хотите изменить содержимое одного из файлов данных с графикой или звуками - *.dxg или *.dxw поступайте следующим образом:

- откройте форму вашего приложения и найдите соответствующий компонент, используемый для работы со списком изображений или списком звуков - DXImageList или DXSoundList;

- щелкните по нему правой кнопкой мыши и выберите Open для открытия файла данных, найдите и откройте требуемый файл;

- произведите необходимые изменения файла - т.е. загрузку/удаление новых пунктов/файлов в список;

- сохраните изменения в файл правым щелчком по компоненту DXImageList или DXSoundList на форме и выбором Save, указав требуемые имя и путь в соответствующем окне диалога;

- закройте проект вашего приложения БЕЗ СОХРАНЕНИЯ ИЗМЕНЕНИЙ!!! Это очень важно! В противном случае будут наблюдаться некие негативные последствия: рост объема исполнимого файла и "торможение" среды Delphi при работе с проектом.

Почему?

Потому что, если сделать это, то файл данных остается внутри соответствующего компонента - DXImageList или DXSoundList и тем самым увеличивает объем исполнимого файла, кроме того "затормаживается работа" среды Delphi при открытии такого проекта, что будет вызывать у Вас искреннее удивление!

Вместо этого сохраняйте содержимое измененного файла *.dxg или *.dxw правым щелчком по компоненту DXImageList или DXSoundList и выбором Save, а измененный проект закрывайте БЕЗ ИЗМЕНЕНИЙ!!! (т.е. не сохраняя).

Таким образом, Вы оставите компонент пустым, это не будет приводить к указанным выше последствиям (росту исполнимого файла и "торможению" Delphi при открытии проекта).

Обновленные версии DelphiX к тому же содержат специальные инструменты (DXGEdit, DXWEdit) для изменения содержимого файлов *.dxg или *.dxw, поэтому также можете использовать и их!

Загрузка файлов данных *.dxg или *.dxw в соответствующие компоненты будет производиться Вами на стадии runtime (т.е. во время нормальной работы приложения). Как это делается показано в исходном коде!

 

Желаю Вам приятной работы по освоению DelphiX !!!

 
     
   
 
 
  исходный код игры (236 Кб)
road2city_opensource - 235Кб
       
             
 

Как работать с исходным кодом?
===============================================

Внимание!!! Здесь описано как использовать исходный код игры с библиотеками
UnDelphiX и DelphiX 1.07a (by Jaro Benes).

Для использования кода и нормальной компиляции необходима установка
одной из этих библиотек!!!

Содержание -

Как заставить код работать под DelphiX (by Jaro Benes).
Как заставить код работать под UnDelphiX;


******************************************************************************
Как заставить код работать под DelphiX (by Jaro Benes).
===============================================

- установить библиотеку;

- в опциях среды Delphi указать путь к DelphiX\Source:
Tools -> Environment Options -> Library -> Library path -> ... -> используя диалог найти Delphix\Source ->
Add
Теперь в проекте ссылку на DelphiX\Source можно не указывать.

- открыть проект Road2City.dpr
попробовать откомпилировать.

> Если сообщения об отсутствии *.dcu, то
добавить в путь поиска проекта ссылку на Source DelphiX

> Сообщение об отсутствии DirectDraw.dcu
в разделе interface секции uses вместо DirectDraw задать DirectX

uses
..., DirectX;


компилируем.


Как заставить код работать под UnDelphiX;
===============================================

Установить библиотеку -

пример установки UnDelphiX:

запустить соответствующий вашей версии Delphi файл с расширением dpk -
например для Delphi 7 это файл (из папки Source) - DelphiX_for7.dpk

нажать кнопки Compile, затем Install

сохранить изменения в проект.

в пути поиска используемого проекта или среды Delphi добавить ссылки на папку Source
с кодом DelphiX -
Project > Options > Directories/Conditionals > ... > ... Add > [DelphiXpath]\Source > OK
, где [DelphiXpath] - путь к папке, куда вы скопировали библиотеку DelphiX

библиотека установлена!

=================================================

Теперь как работать с исходным кодом проекта Road2City :


- Запускаем файл проекта - двойным щелчком по Road2City.dpr

получаем сообщение об ошибке -
Error reading SpriteEngine.Items: Property Items does not exist.
Ignore the error and continue? ...

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

Метод устранения - нажимаем кнопочку Ignore и ничего страшного не произойдет!


------------------------------
Замечания:

22/03/2007
Как настроить среду Delphi, чтобы при использовании
комбинации Ctrl + LMouseButton (команда Find Declaration контекстного меню редактора кода)
осуществлялся переход на описания методов и типов, по которым производился щелчек?

30/03/2007

ответ:
Если на названии какого-либо типа или модуля не срабатывает команда Find Declaration,
то в этом модуле имеются ошибки (Errors), предупреждения (Warnings).


*****************************************************************************

Файлы, необходимые для нормальной работы игры вы можете получить,
скачав дистрибутив со странички - Road2City

 

 

 

 

Cвои пожелания, вопросы или заметки отправляйте на:

megainformatic@mail.ru

 
     
 

Обновления и новости о развитии проекта Мега Информатик
смотри на сайтах:

http://www.megainformaticsite.pochta.ru

http://www.megainformatic.narod.ru

 
     
         Яндекс цитирования  
               
(с) МЕГА ИНФОРМАТИК 2006-2010

 

Hosted by uCoz