[Главная] [Новости] [Статьи] [Игры] [Проекты] | [Автор] | |||
Основы 3D-программирования DirectX8.1 в Delphi 6-7: теоретические и практические основы создания игр. | ||||
Вывод
2D-спрайтов в 3D-сцене и указателя мыши |
||||
Продолжаем серию уроков, посвященных разработке Delphi DirectX игры. В данном уроке показано как вывести 2D-спрайт на поверхность 3D-сцены. Дополнительно показан один из способов "затухания" экрана для эффектного вывода фирменной заставки. Кроме того, показана реализация вывода курсора мыши аппаратными средствами графического адаптера. | ||||
[Все уроки] | ||||
Урок построен в форме упражнений. В упражнениях даются примеры модификаций исходного кода и краткое описание того, что при этом наблюдается и как это объясняется. | Выполняя упражнения Вы лучше вникнете в суть проблемы. | |||
ПОСТАНОВКА ЗАДАЧИ: Требуется организовать вывод 2D-спрайтов в 3-х мерной сцене. Под 2D-спрайтами имеются в виду анимированные или статичные 2D-изображения.
|
В чём суть проблемы? При использовании класса TD3DImage2D реализующем вывод 2D-изображений по принципам класса CD3DFont из модуля D3DFont.pas объекты привязаны к плоскости экрана. Если потребуется изменение положения в пространстве, то это будет возможно только изменением Z-порядка отрисовки. Поэтому встала задача разработки класса для вывода 2D-изображений альтернативным способом. |
|||
Особенности урока: - показан альтернативный способ вывода 2D-изображений по технологии 2D-спрайтов (из примера игры Donuts3D). - показано как разработать новый класс для расширения возможностей Delphi DirectX 8.1. - реализация вывода указателя мыши аппаратными средствами. |
||||
Для выполнения упражнений Вам понадобится: - архив с исходным кодом; (1,19 Мб) - архив с ОБЩИМ КОДОМ; (772 Кб) |
Архив с исходным кодом содержит пример решения поставленной задачи и все необходимые медиа-файлы (модели, текстуры, шейдеры и т.д.), архив с общим кодом - содержит дополнительный общий код необходимый при разработке всех Delphi DirectX 8.1 - приложений. | |||
Для начала откомпилируйте пример и запустите приложение. Убедитесь, что всё работает. (Если нет, то читайте файлы readme.txt приложенные к архивам) |
![]() |
|||
Нормально работающий пример (см. файл pmk.exe внутри архива Other2D.rar) должен давать следующий результат: создание нормального Windows-окна, постепенное проявление на экране анимированной заставки, выдерживание ее некоторое время, затухание, вывод некототорой 3D-сцены (3d-модель). Клавишами Вверх/Вниз можно перемещать камеру вызывая тем самым перемещение камеры. Выход из приложения - [Escape]. |
||||
Рассмотрим содержание примера с исходным кодом (pmk.dpr). Приложение построено на принципах стандартного WinAPI-приложения. Для лучшего уяснения того, что это такое обратитесь к предыдущим урокам. Хорошим стартом в понимании разработки Delphi DirectX - игр является также пример игры - Donuts3D. |
||||
Класс приложения - TD3DGameApp. Название класса чисто условное и его легко изменить в своих приложениях. Если Вы заглянете в исходный код (файл Main.pas проекта pmk.dpr), то увидите что данный класс производится от TD3DAbstractApp. Основа данного класса приложения - из Donuts3D с небольшими изменениями. | ||||
Лучше уяснить структуру и функционирование данного класса можно рассмотрев пример Donuts3D. В контексте данного урока важны следующие опорные моменты: SpriteSplash: TD3DSprite;//внутри класса объявлено следующее поле В методе TD3DGameApp.DrawScreenSplash помимо прочего вызывается метод - SpriteSplash.Draw(0.0, -0.03, 0.9, DrawD3DSprite_Filtered, Alpha); Это и есть вывод заставки на экран. |
||||
Как видим, для вывода 2D-изображения в 3D-сцене используется класс TD3DSprite. Реализация этого класса находится в модуле D3DGUI.pas. Этот модуль и этот класс могут послужить Вам примером того, как разработать новые классы для выполнения необходимых действий по подготовке игрового процесса. Ссылка на D3DGUI добавлена в uses модуля Main.pas | ||||
Обратите внимание! Вывод 2D-изображения в 3D-сцене с использованием TD3DSprite обязательно требует использования камеры (CD3DCamera)! Забыв про это Вы будете ломать голову почему всё написано правильно, а 2D-изображения так и нет в сцене. | ||||
Для лучшего уяснения функционирования примера типового D3D-WinAPI-приложения, обратитесь к схеме Структура функционирования типового DirectX-приложения, а также к исходному коду. Внутри метода TD3DGameApp.Draw2DPictures показан способ вывода 2D-спрайта в 3D-сцене. Этот же код перенесен в метод Draw класса TD3DSprite. |
||||
Расскажем теперь о правилах использования класса TD3Sprite (эти правила касаются использования любых Direct3D8-производных объектов сцены - т.е. всего того, что будет отрисовываться на экране через D3D или помогать этому процессу - моделей, текстур, эффектов (шейдеры) и т.п.). | ||||
- внутри класса приложения или в виде отдельной переменной объявить поле с данным типом - SomeSprite: TD3DSprite; - в методе создания приложения создать экземпляр класса
- в методе RestoreDeviceObjects приложения вызвать метод
//m_Camera - класс CD3DCamera - камера используемая в данном приложении - в методе InvalidateDeviceObjects приложения SomeSprite.InvalidateDeviceObjects;
- в методе DestroyDeviceObjects приложения - в методе FrameMove приложения произвести анимацию (как? - показано в исходном коде); - в методе Render приложения произвести отрисовку (см. TD3DGameApp.DrawScreenSplash); ============================================================
Для задания ключевого (прозрачного) цвета служит свойство SomeSprite.ColorKey := $00000000;
Для хранения имени и пути загруженного файла текстуры свойство- SomeFilename := SomeSprite.TexFilename; свойство SomeSprite.fSize задает размер спрайта в 3D-сцене.
SomeSprite.Draw(x, y, z, Flags, Alpha);Some2DImage.Draw(x,
y, Flags, Alpha);Some2DImage.Draw(x, y, Flags, Alpha); метод DrawScale позволяет выводить прямоугольные спрайты. Реализация других особенностей показана в исходном коде примера. |
||||
Чтобы лучше уяснить себе использование данного класса настоятельно рекомендуется поэкспериментировать с исходным кодом! | ||||
В методе TD3DGameApp.DrawScreenSplash происходит вывод заставки - Реализация вывода подобна особенностям описанным в уроке Вывод Заставки с тем лишь отличием, что используется другой класс (вместо TD3DImage2D его аналог TD3DSprite). Кроме того, возможности класса TD3DSprite были расширены для того, чтобы использовать анимацию. Это и показано в исходном коде. Для анимации также были добавлены новые вызовы внутри функции TD3DGameApp.FrameMove Шагающий человечек - это 2D-спрайт. Его особенности реализованы в объекте GoingMan. Замечание: после внесения изменений в код не забывайте перекомпилировать приложение, а уж после запускать и смотреть что получилось! |
||||
Комментарии к реализации плавного затухания заставки Вы найдете в уроке Вывод Заставки. Аппаратный указатель мыши реализован следующим образом: 1) изображение курсора должно быть в формате *.ICO; 2) установка свойств отображаемого курсора происходит внутри метода TD3DGameApp.MsgProc - слегка видоизменен обработчик события WM_ACTIVATEAPP; внутри обработчика события WM_SETCURSOR происходит установка вида курсора. Из-за ограничений формата ICO (поддержка лишь 16 цветов) невозможно вывести полноцветный курсор. Однако можно подавить вывод аппаратного курсора и производить вывод указателя программным способом как это показано в уроке Создание игрового меню. |
||||
Для лучшего уяснения данного материала нужно обязательно написать собственное приложение и тщательно проработать все показанные особенности. | ||||
Данный урок носит скорее вид заметок нежели исчерпывающие описания. Однако все ответы ищите в исходном коде! Основной целью было показать альтернативный способ вывода 2D-спрайтов и сообщить что развитие проекта Нечто: Необъяснимое продолжается. Реализация меню с использованием классов TD3DImage2D и TD3DSprite и другие особенности реализации игрового проекта будут показаны в следующих уроках. Следите за новостями проекта! |
||||
Пример использования игрового меню с улучшенным игровым курсором можно скачать здесь - - архив с исходным кодом; (1,27 Мб) Данный пример содержит указатель мыши сочетающий достоинства аппаратного курсора и возможности программной реализации его возможностей (т.к. курсор выводится как объект класса TD3DImage2D для него можно использовать размер более 32х32, количество цветов как в текстуре, а не как у системной иконки и анимацию любой сложности! с учетом ее реализации в классе TD3DImage2D как в классе TD3DSprite). |
||||
[Назад] [Все уроки] | ||||
[Главная] [Новости] [Статьи] [Игры] | ||||
(c) Мега Информатик 2006-2007 |