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


Balls and holes PC game / Balls and Holes PC игра
Вакансии
Игродельня
Today
20 февраля 2019 19:03
Вход Регистрация Забыли пароль ?

megainformatic - Начало работы с fle game engine. Создание стартового шаблона приложения - будущей игры на c++ directx 9
Начало работы с fle game engine. Создание стартового шаблона приложения - будущей игры на c++ directx 9 Итак, Вы решили создать собственную игру и выбрали для этого движок с полностью открытым кодом - fle game engine
подробнее...

Теги создание сайтов, создание игр, дизайн, игры, информатика, уроки photshop, php, c++, музыка, delphi, cms, робосайт
Статьи сайта
megainformatic - Рельефные изображения

Добавление статей на сайт под управлением megainformatic cms express

megainformatic - Воспроизведение файлов в форматах it, xm, s3m, mod

megainformatic - Воспроизведение файлов в форматах it, xm, s3m, mod - страница 2

megainformatic - Воспроизведение в игре музыки в формате XM

megainformatic - Воспроизведение файлов в формате OGG Vorbis

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

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

megainformatic - Как анимировать паука ?

megainformatic - Уроки Photoshop

megainformatic - Купить Уроки Photoshop - Чудеса

megainformatic - Купить Уроки Photoshop - Рисуем и Анимируем

megainformatic - Эмулятор игры Ну, Погоди!

сайт megainformatic - Говорящий Комикс Веселый Буквоежка

megainformatic - Что нужно для создания собственного сайта ?

megainformatic - Моделируем девушку в 3d используя 3ds max

megainformatic - Уроки Fruity Loops Studio - пишем свою музыку

megainformatic - Уроки Fruity Loops Studio - пишем свою музыку - урок 1 - Быстрый старт

megainformatic - Сброник статей по дизайну и компьютерной графике. Обзор.

megainformatic - Уроки 3d на delphi directx - Вывод Заставки

Добро пожаловать в систему управления сайтом megainformatic cms

megainformatic - Создание эскиза и макета страницы сайта

megainformatic - Верстка созданного макета

megainformatic - Добавление модулей обеспечивающих минимально необходимый функционал

megainformatic - Основы добавления контента на сайт, управления и поддержки сайта

megainformatic - Проверка работы сайта, установка на хостинг

megainformatic - Основы продвижения созданного сайта

megainformatic - Создание шаблонов

megainformatic - Создание интернет-магазина

megainformatic - Музыкальные миры - композиция Морозное утро - 10 версий

ЛЕТО

megainformatic - Нечто Необъяснимое - пре релиз

megainformatic cms admin

megainformatic cms admin

megainformatic - Основы создания 3d игр - проект Тайны Морских Глубин

megainformatic - уроки delphi directx 8.1 3d - Основы Вращений и Управления камерой

megainformatic cms seo

megainformatic cms admin

megainformatic - Моделируем девушку в 3d - Подготовка 2d-эскиза тела человека

megainformatic cms stat kit

megainformatic cms seo

megainformatic - Теория и практика 3d игр - О Кватернионах

megainformatic - Теория и практика 3d игр - Основы теории векторов

megainformatic - Теория и практика 3d игр - Важные замечания

megainformatic - Моделируем девушку в 3d используя 3ds max - Подготовка к моделированию ноги - готовим ширму

megainformatic - Моделируем девушку в 3d используя 3ds max - Выполняем моделирование ноги

megainformatic - Моделируем девушку в 3d используя 3ds max - Улучшаем созданную модель женской ножки

megainformatic cms stat kit

megainformatic - Подводная лодка и подводный мир

megainformatic - megainformatic cms - Форма для смены шаблонов сайта - модуль template selector

megainformatic cms social

megainformatic cms social Руководство пользователя

megainformatic - megainformatic cms - Форма для смены шаблонов сайта - модуль template selector

модуль слайдера

ТЗ на сайт коллективных покупок

модуль slider

подробнее

     
 

Видео урок посвященный созданию игры на примере игры Ну, Погоди ! - рождение игры часть 2.

Элементарные и простые игры на примере которых можно в delphi 7 на directx 8.1 api научиться создавать игры.

 
     
 
Урок 4 Построение класса приложения
 
О том, что потребуется для данного урока читайте в основном разделе - уроки delphi directx 8.1
 
Далее у читателя подразумевается наличие базовых знаний языка Delphi.
 
[назад] [страница 1] [далее] [к содержанию]
 
Из предыдущих уроков вы уже почерпнули некоторую информацию о том, как строится и функционирует типичное D3D-приложение. Эта информация является общей для всех приложений DirectX написанных как на C++, так и на Delphi. Разница лишь связана с синтаксическими особенностями данных языков программирования и средами программирования в которых происходит работа.
 
Здесь и далее мы познакомимся с основными особенностями Direct3D-приложения, которые необходимо учитывать при разработке его базового класса.
 
За основу мы возьмем класс CD3DApplication, рассмотрим и протестируем на конкретных примерах его особенности, а далее покажем класс, который используется в игре "Ну, Погоди!" и проведем небольшое сравнение.
 
С исходным кодом класса CD3DApplication вы можете познакомиться заглянув в модуль D3DApp.pas из папки common библиотеки delphi directx 8.1
 
Данный класс является абстрактным (также как и например TForm), поэтому нужно сначала создать производный класс от данного, а затем уже работать с новым созданным классом, используя его для своих целей, что и происходит во всех примерах из DirectX SDK.
 

CD3DApplication производится напрямую от TObject.

Основное назначение класса - обеспечение работы WinAPI-приложения с использованием также DirectX API, другими словами данный класс предоставляет удобный для работы интерфейс для вызова необходимых приложению интерфейсов Windows и главным образом интерфейсов DirectX.

 

Основные методы этого класса - это

Create

Destroy

Create_

Run

MsgProc

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

OneTimeSceneInit

InitDeviceObjects

RestoreDeviceObjects

FrameMove

Render

InvalidateDeviceObjects

DeleteDeviceObjects

FinalCleanup

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

 
В качестве основы для изучения данного класса и экспериментов с ним мы возьмем пример SwitchScreenModes
[downloads:12] из предыдущего урока. Для экспериментов над кодом класса CD3DApplication советую Вам взять файл D3DApp.pas и его копию разместить внутри папки того проекта в котором Вы будете проводить эксперименты. При этом среда Delphi будет использовать локальную копию вместо копии из папки common, а Вы сможете проводить какие угодно изменения не вмешиваясь в оригинальный код D3DApp.pas
 
Класс приложения CD3DApplication функционирует абсолютно по тем же правилам, которые мы рассмотрели в предыдущих уроках.
 

Метод Create задает начальные значения для множества полей данного класса,

в частности запоминается ссылка на самого себя -

g_pD3DApp := Self;

задаются начальные размеры окна приложения

m_dwCreationWidth := 400;
m_dwCreationHeight := 300;

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

 
Данный метод - метод конструктора класса, вызывается при создании нового объекта данного класса и выполняет базовую начальную инициализацию заданных полей класса теми значениями, которые заданы в реализации данного конструктора, все остальные поля обнуляются или выставляются в nil (если это указатели)
 

Метод Destroy - метод деструктора класса, вызывается при удалении объекта класса. При этом освобождается память занятая объектом и связанными с ним ресурсами. Если таких ресурсов достаточно много и они занимают значительный объем, то выполнение метода может занимать значительное время - вспомните любую игру, в которую Вы играли в последний раз, почему игра по выходу из нее закрывается не сразу, а через некоторое время? Именно поэтому.

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

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

 
Особенностью данного метода является то, что он должен вызываться не напрямую, а посредством метода Free. Для этих же целей можно применять функции SAFE_DELETE и FreeAndNil
 

Метод Create_ - представляет метод начальной инициализации класса приложения. Его имя происходит от имени оригинального метода Create на C++. Но поскольку в языке Delphi для конструктора и деструктора применяются специальные имена (Create и Destroy), а в языке C++ имя конструктора и деструктора совпадает с именем класса, то данный метод и получил такое название. Знак подчеркивания обозначает, что данный метод именно метод инициализации, а не метод конструктора!

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

создается объект Direct3D, выполняется создание списка графических устройств, создается окно приложения (если требуется), задается стиль, границы окна и рабочей области, запускается DXTimer осуществляющий периодические процессы D3D-приложения - цикл подготовки кадра и цикл отрисовки, вызывается виртуальный метод OneTimeSceneInit осуществляющий однократную инициализацию, должен быть реализован в производном классе, поэтому его работа целиком зависит от того, как он будет реализован, наконец метод Initialize3DEnvironment выполняет окончательную инициализацию 3D-среды, главным образом создавая объект IDirect3DDevice8 на основе параметров, которые были получены на предыдущих этапах выполнения.

После этого приложение переходит в состояние готовности. Это означает, что начинаются периодические процессы, выполняющие циклическую работу:

метод Run - если приложение работает как WinAPI, то данный метод вызывается напрямую и будет запущен цикл проверки сообщений на основе которого и работает типичное WinAPI-приложение.

метод MsgProc - представляет реализацию оконной процедуры приложения, которая отвечает за обработку поступающих в неё сообщений от системы. Эти сообщения играют важную роль, т.к. при помощи них и происходит собственно работа приложения в системе Windows. При каких-либо событиях, например, нажатии пользователем клавиши или перемещении мыши система реагирует на них и создает соответствующие сообщения. Эти сообщения попадают в очередь сообщений и если предназначены конкретному приложению имеющему фокус, то система передает их ему. Помимо описанных в качестве сообщений могут быть любые другие - достаточно заглянуть в код метода MsgProc и вы увидите как обрабатывается приложением сообщение об активации/деактивации приложения, реакция на команду окна меню и т.д.

 
Оставшиеся методы - OneTimeSceneInit, InitDeviceObjects, RestoreDeviceObjects, FrameMove, Render, InvalidateDeviceObjects, DeleteDeviceObjects, FinalCleanup

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

 

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

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

Методы RestoreDeviceObjects и InvalidateDeviceObjects также работают в логической паре. После инвалидации объектов их обязательно нужно восстановить, перед восстановлением обязательно инвалидировать. Иначе это опять же приведет к ошибкам. В этих методах нуждаются объекты, зависимые от текущего устройства. Если вдруг произошел его сброс, то происходит инвалидация, после чего нужно обязательно выполнить восстановление. К таким объектам относятся модели, шейдеры.

 

Метод FrameMove - исходя из названия "движение кадра" - отвечает за подготовку следующего кадра анимации. Как таковая отрисовка в нем не происходит. Его основное назначение - это вызов метода UpdateInput который выполняет опрос устройств ввода клавиатуры и мыши, а также выполнение всех необходимых вычислений, которые осуществляют перемещение персонажей, логику игры и прочее

От сложности процессов, происходящих внутри данного метода напрямую будет зависеть производительность приложения, потому что данный метод в паре с методом Render периодически вызывается таймером DXTimer через минимальные интервалы времени, чем и определяется FPS - частота кадров.

Метод Render - не должен содержать слишком "тяжеловесного" кода, т.к. его основная задача - как можно быстрее отрисовать то, что было подготовлено на предыдущей стадии. Для ускорения работы данного метода выполняются различные подготовительные стадии, в частности, отсечение объектов, не попадающих в поле зрения камеры. Правильное выполнение этого процесса (естественно внутри FrameMove, а не внутри Render) гарантирует то, что игра "не будет тормозить" даже при кажущемся большом количестве игровых объектов присутствующих в игровой сцене. Они просто будут исключаться из цикла отрисовки, если не попадают в определенную область видимости.

 
Итак, вкратце мы рассмотрели что к чему. Пора приступить к экспериментам. Под экспериментами я понимаю более углубленное изучение кода класса CD3DApplication. Мы будем брать части кода и комментировать их, исключая из компиляции, затем наблюдать результат полученный при этом. Этим методом не всегда, но очень часто можно лучше уяснить для себя как работает та или иная часть приложения. Кроме того, такие эксперименты будут крайне полезны Вам если у Вас еще не очень достаточно опыта в программировании игр и приложений вообще. Такие эксперименты позволят получить общее представление о методах тестирования и отладки кода.
 

Откроем пример SwitchScreenModes и копию модуля D3DApp.pas, которую Вы должны были скопировать из папки common в папку данного проекта

Открыть модуль D3DApp.pas достаточно просто - в коде модуля SwitchModesUnit.pas найдите имя D3DApp в списке uses и удерживая нажатой клавишу [Ctrl] щелкните по этому имени левой кнопкой мыши.

Модуль D3DApp.pas будет открыт для Вас. Чтобы удостовериться, что Вы действительно работаете с копией, а не с оригиналом из папки common, попробуйте выполнить сохранение. Если диалог укажет на папку проекта, а не на common, значит всё верно, можно смело приступать к экспериментам!

 

Для начала мы заглянем внутрь метода CD3DApplication.Create_ и выясним несколько фактов:

Как происходит построение списка адаптеров и какой видео режим выбирается по умолчанию - нам нужно будет поработать с кодом внутри BuildDeviceList

Какие особенности учитываются при реализации Initialize3DEnvironment для инициализации 3D-среды

 

Самый простой эксперимент - закомментируем кусок кода -

{hr:= BuildDeviceList;
if FAILED(hr) then
begin
SAFE_RELEASE(m_pD3D);
Result:= DisplayErrorMsg(hr, MSGERR_APPMUSTEXIT);
Exit;
end;}

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

Мы получим Generic application error и приложение будет закрыто. Даже ничего не зная о функционале работы CD3DApplication из этого можно заключить, что данный код является критичным для работы приложения.

Раскомментируем код и отправимся вглубь метода BuildDeviceList для экспериментов внутри него.

Замечу, что показанная техника экспериментов с комментированием участков кода для лучшего уяснения его назначения и работы уже рассматривалась в ряде статей, в частности в - Теория и практика 3D-игр

 

Для быстрого перехода к реализацию BuildDeviceList также достаточно щелкнуть по этому идентификатору левой кнопкой мыши вкупе с клавишей [Ctrl].

Посмотрим как происходит работа внутри данного метода в режиме отладки. Для этого достаточно установить в нужной строке кода контрольную точку останова и запустить приложение в режиме отладки.

 
 
Для этого щелкаем левой кнопкой мыши в указанной позиции и там появится красный кружок вместо синего (как на рисунке).
 
 
Запускаем приложение в режиме отладки кнопкой Run как показано на рисунке.
 

Для пошагового исполнения кода используем клавишу [F8]. Для входа в код вызываемых процедур и функций можно использовать [F7].

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

Сначала мы наблюдаем как выбираются все видео- режимы чьё разрешение >= 640x480

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

Заносятся в список только имеющие уникальный формат текстуры, отсортировываются в порядке увеличения разрешения и качества формата текстур.

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

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

 

Какой режим выставляется по умолчанию?

Все видеорежимы попадают в поля структуры m_Adapters представляющей список адаптеров в системе. Каждый адаптер в свою очередь имеет список устройств, список видеорежимов, форматов и т.д.

В конце данного метода выставляется текущий адаптер и устройство -

m_Adapters[a].dwCurrentDevice := d;
m_dwAdapter := a;
m_bWindowed := True;

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

Для полного ответа на поставленный вопрос в методе Create_ попробуйте сразу после выполнения BuildDeviceList добавить такой тестовый код -

var

//**
cd: Cardinal;
//нужно объявить как глобальную переменную вне метода Create_
//**

{...}

//остальное уже в методе Create_

hr:= BuildDeviceList;
if FAILED(hr) then
begin
SAFE_RELEASE(m_pD3D);
Result:= DisplayErrorMsg(hr, MSGERR_APPMUSTEXIT);
Exit;
end;

//**
cd := m_Adapters[m_dwAdapter].dwCurrentDevice;
//**

 

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

Используя нижеследующий код, который Вы можете почерпнуть из метода BuildDeviceList можно получить всю необходимую информацию -

var

//**
CurrentDevice, DeviceModeNum: Cardinal;
DesktopMode: TD3DDisplayMode;
p_AdapterInfo: PD3DAdapterInfo;
pDeviceInfo: PD3DDeviceInfo;
DeviceCurrentMode: TD3DModeInfo;
//**

//аналогично нужно объявить как глобальные переменные вне метода Create_, если сделать локальные, то их значения могут стать недоступны при отладке из-за оптимизации в регистрах процессора, поэтому для целей отладки и проверки получаемых значений нужны глобальные переменные

//**
CurrentDevice := m_Adapters[m_dwAdapter].dwCurrentDevice;
DesktopMode := m_Adapters[m_dwAdapter].d3ddmDesktop;
p_AdapterInfo := @m_Adapters[m_dwAdapter];
pDeviceInfo := @p_AdapterInfo^.devices[CurrentDevice];
DeviceModeNum := pDeviceInfo^.dwCurrentMode;
DeviceCurrentMode := pDeviceInfo^.modes[DeviceModeNum];
//**

теперь всё сразу становится очевидно -

сначала определяется текущее устройство CurrentDevice, затем текущий режим рабочего стола (если это Вам потребуется), считывается информация о текущем адаптере, по ней определяется информация о текущем устройстве pDeviceInfo, затем считывается номер текущего видеорежима и определяются его параметры

 

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

Если обработчик окна не был пуст, то запоминается указатель на старую оконную процедуру и устанавливается новый, обрабатывающий поступающие сообщения внутри метода MsgProc, а также вызывающий старую оконную процедуру. Это гарантирует корректную обработку поступающих приложению сообщений даже при использовании VCL-окон и приложения работающего на основе TApplication, как это имеет место в примерах всех предыдущих уроков и игре "Ну, Погоди!". Если забыть про этот важный момент - при создании собственного базового класса D3D-приложения, то можно долго гадать о причинах возможных ошибок и некорректной его работы.

 

Метод OneTimeSceneInit целиком зависит от реализации его в производном классе.

Остается рассмотреть метод Initialize3DEnvironment и поэкспериментировать с ним.

 

Заглянув в первые строки кода данного метода сразу определяем, что текущий видеорежим это pModeInfo

вызов AdjustWindowForChange; на самом деле выполняет скрытие окна полноэкранного режима

Далее идет настройка параметров отображения и самое интересное, что служит ответом на второй вопрос, поставленный в конце 3 урока

// Create the device
{//**
hr := m_pD3D.CreateDevice(m_dwAdapter, pDeviceInfo^.DeviceType,
m_hWndFocus, pModeInfo^.dwBehavior, m_d3dpp,
m_pd3dDevice);
}

hr := m_pD3D.CreateDevice(m_dwAdapter, pDeviceInfo^.DeviceType,
m_hWndFocus,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
m_d3dpp,
m_pd3dDevice);

В чём же причина? Если заглянуть в документацию по DirectX 8 ,то в описании IDirect3D8::CreateDevice вы найдете список значений параметра BehaviorFlags

среди них D3DCREATE_PUREDEVICE = $10; и D3DCREATE_HARDWARE_VERTEXPROCESSING = $40; именно то значение, которое имеет данный флаг если использовать строку кода, которая показана закомментированной (зеленого цвета)

Приведенный чуть ниже код исправляет данный недостаток! Причина объяснена в документации по DirectX 8 -

D3DCREATE_PUREDEVICE
Specifies that Direct3D does not support Get* calls for anything that can be stored in state blocks. It also tells Direct3D not to provide any emulation services for vertex processing. This means that if the device does not support vertex processing, then the application can use only post-transformed vertices.

Т. е. установка данного флага не позволяет вызывать методы Get* и требует использования только пост-трансформированных вершин. Метод GetViewport как раз и не выдает при этом нужной информации!

 
оставшийся код располагает окно поверх остальных окон (если используется оконный режим), проверяются возможности устройства и формируется соответствующая информационная строка m_strDeviceStats, запоминаются параметры бэк-буфера, отображается указатель мыши и ограничивается его перемещение заданной областью, происходит вызов методов InitDeviceObjects и RestoreDeviceObjects, в случае ошибок происходит переключение на более низкий уровень возможностей графического устройства и рекурсивный вызов метода Initialize3DEnvironment.
 
По окончании выполнения метода Create_ приложение переходит в состояние готовности и запускается непрерывный цикл отрисовки вызывающий поочередно методы FrameMove и Render. Это происходит внутри метода TAppForm.ApplicationEventsIdle
 
 
 
[назад] [страница 1] [далее] [к содержанию]
 
 
     
     
     
     
подробнее

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

Мы добрались до логического завершения уроков по созданию 2D-игры. В первых уроках Вам давались довольно детальные пояснения, в последующих упор был сделан на конкретных практических вопросах, а со всеми деталями Вы могли ознакомиться в исходном коде.

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

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

 

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

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

 

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

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

Как нельзя лучше этого понимания можно достичь сосредоточившись на создании сначала очень маленьких, но полнофункциональных частей программы. На протяжении наших предыдущих уроков мы неотрывно следовали этому правилу.

Прежде чем приступить к написанию кода нужно четко сформулировать алгоритм, который Вы хотите реализовать. Это позволит избежать дополнительных ошибок. Новички в создании игр часто думают: всё уже давно придумано до нас, так чего тут думать - нужно сразу же приступать к кодированию и очень ошибутся при этом.

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

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

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

Создание Вашего игрового проекта может выглядеть так:

1) Написание шаблона стартового приложения;

2) Добавление в шаблон вывода титульной заставки;

3) Реализация экрана главного меню (пока без реализации возможностей отдельных его пунктов);

4) Последовательная реализация пунктов меню, начиная с простых;

5) Реализация загрузки ресурсов и начального экрана игры;

6) Постепенная реализация игровой логики и всех остальных возможностей;

 

Начав с простого и постепенно дополняя и расширяя возможности в конце концов достигнете своей цели создав законченный проект.

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

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

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

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

 

Попробуем выполнить наше приложение в режиме отладки. Откройте любой проект и нужный его модуль.

Путем щелчка левой кнопки мыши в левом поле напротив окна текста исходного кода установите в строке кода, которая является исполнимой, контрольную точку останова (Break Point)

 
 
запустите приложение в режиме отладки щелкнув по кнопке Run -
 
 
или выбрав пункт меню Run > Run
 

При этом приложение будет запущено в режиме отладки, позволяющем исследовать код путем пошагового его исполнения.

Весь код до точки останова будет выполнен сразу же, а в точке останова исполнение сделает паузу и отладчик будет ожидать Ваших дальнейших действий. Вы можете нажимать клавиши [F8], [F7] - пункты меню Run > Step Over и Run > Trace Into для пошагового исполнения каждой строки кода начиная с точки останова.

При этом в отдельных окнах Watch List и Local Variables, а также путем наведения указателя мыши на любую нужную переменную Вы можете увидеть значение, которое она принимает в данный момент.

 
 

Окно Call Stack позволяет увидеть последовательность вызовов различных функций в Вашей программе начиная снизу и вверх, в окне Event Log вы можете увидеть события которые происходят во время исполнения и отладочные сообщения, если таковые имеют место. Экстренно завершить выполнение приложения можно нажав комбинацию клавиш [Ctrl] + [F2].

Это вызовет закрытие приложения и переведет среду Delphi в обычный режим работы над исходным кодом.

 

В режиме отладки клавиша [F8] позволяет перейти к исполнению следующей строки кода, [F7] позволяет войти в код функции и проследить, что происходит внутри неё (если исполнимая строка кода является вызовом функции, процедуры или метода).

Контрольные точки останова нужно ставить только в тех строках кода, которые являются исполнимыми (напротив них при компиляции появляется синяя жирная точка), иначе это не приведет к останову в данной строке при запуске в режиме отладки. Комментарии не являются исполнимыми строками кода, т.к. не дают исполнимого кода при компиляции. Если Вы работаете в среде Delphi 7, то заметите, что операторы логических скобок begin и end также не являются исполнимыми и их нельзя использовать в качестве контрольных точек останова. В среде Delphi 2006 это делать можно.

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

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

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

Например, таким способом отображается FPS. В окончательном отлаженном проекте этот код позднее комментируется или удаляется, так что экран в конечном счете не будет засорен для пользователя посторонней информацией.

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

 
С таким кодом Вы наверняка уже сталкивались в наших предыдущих уроках, и он для Вас уже не нов, поэтому я не вижу большого смысла его здесь приводить.
 
В заключение скажу лишь, что режим отладки не является чем-то особо сложным и недоступным пониманию, если Вы пока еще не совсем с ним хорошо знакомы. Вам достаточно лишь раз посмотреть как происходит работа в этом режиме и думаю, все вопросы разрешатся постепенно по мере Вашей работы.
 
Кроме того, в ходе практической реализации самостоятельного игрового проекта у Вас будут возникать новые вопросы и если Вы будете разрешать их самостоятельно, используя документацию по Delphi, DirectX и некоторые сведения почерпнутые из данных уроков, то у Вас всё получится.
 
Желаю Вам всяческих успехов.
 

свои вопросы Вы можете задавать

на creator@megainformatic.ru или оставьте сообщение на форуме (регистрация на форуме по вашей заявке)

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

     
 

Основы DirectSound8 в среде Delphi6-7

Введение

Звук является неотъемлемой частью любой игры или мультимедиа-приложения. Для воспроизведения звука посредством библиотеки DirectX вам понадобится знание возможностей интерфейса для работы со звуком IDirectSound - этот интерфейс с приходом DirectX9c остался неизменным. Поэтому и в DX8 и в DX9 используется один и тот же интерфейс - IDirectSound8 он же IDirectSound.

Как говорится в документации по DirectSound - интерфейс IDirectSound позволяет воспроизводить звуки с наименьшими временными задержками и дает возможность полностью управлять аппаратными ресурсами звука.

Преимущества состоят в следующем:

- Воспроизведение звуков из звуковых файлов и ресурсов в формате WAV.
- Воспроизведение одновременно неограниченного количества звуков (полифония).
- Применение для высоко приоритетных звуков аппаратно-управляемых буферов.
- Управление 3-х мерным звучанием.
- Добавление эффектов - например, эхо, хорус и др. с динамическим изменением их параметров.
- Захват WAV звуков от микрофона или других источников.

DirectSound работоспособен на Microsoft Windows 98, Microsoft Windows 2000 и последних версиях операционных систем. Часть возможностей, главным образом эффекты при захвате, доступны только в Microsoft Windows XP и выше.

DirectSound

Базовые уроки по DirectSound

Вашему вниманию предлагаются базовые уроки представляющих оригинальные уроки взятые из DX SDK 8.1 и адаптированные к применению в Delphi 6-7. Для версий Delphi выше 7 могут потребоваться модификации кода!

Примечание: длинных описаний и пояснений к урокам пока не даю - все что здесь есть - это в основном исходный код и исполнимый откомпилированный файл. Чтобы детально разобраться в технологии Вам понадобится DX SDK 8 или выше, Delphi 7 (или 6 или выше) и много много терпения и упорства.

Обзор уроков

 
     
 
           
 

Урок 1

Воспроизведение звука - PlaySound Sample Урок 2 Управление воспроизведением и размещением звука - VoiceManagement Sample  
           
    Показано как инициализировать, установить приоритет, загрузить и воспроизвести короткий звуковой файл (не более 1000000 байт длинной).   Показано как происходит управление размещением в памяти, приоритетом и воспроизведением короткого звукового файла (не более 1000000 байт длинной).  
   
Воспроизведение коротких звуковых файлов
Управление размещением звука и приоритетом
 
           
  Урок 3 Воспроизведение длинных звуковых файлов - StreamData Sample Урок 4 Изменение базовых параметров звука - громкости, панорамы, частоты - AdjustSound Sample  
           
    Длинный звуковой файл загружается и воспроизводится небольшими частями. Для организации непрерывного воспроизведения используется подроцесс.   Показано каким образом можно осуществить регулирование громкости, панорамы (баланса левого/правого стерео-каналов), частоты дискретизации.  
           
  Урок 5 Воспроизведение музыкальных файлов в формате it, mod, xm, s3m

Скачать уроки 1-4

(29 Кб)

уроки 1-4
 
           
 
Внимание! Для нормальной работы и компиляции Вам потребуется архив С ОБЩИМ КОДОМ (762 Кб).
ОБЩИЙ КОД - 585 Кб
 
   
     
 
     
подробнее

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

Рисование фона (урок 6 часть 2)

 

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

1.      Усвоив содержание первой части данного урока Вы уже можете самостоятельно создать облако. Для градиентной заливки используйте Fountain Fill.

2.      Световой блик в нижней части облака – это фигура повторяющая по форме низ облака, белого цвета и с применением инструмента Полупрозрачность (Interactive Transparency Tool).

 

3.      Небо – это прямоугольник на заднем плане, не имеющий обводки, с градиентной заливкой.

4.      Капельки дождя, падающие из облака: создайте эллипс, создайте треугольник используя Polygon Tool и количество вершин - 3

 

разместите треугольник как показано на рисунке

 

выделите обе фигуры, обведя вокруг них мышью (для выделения лучше использовать инструмент Pick tool) и сплавьте их в единое целое.

 

Выберите инструмент Shape и выделив лишние узлы (с нажатой клавишей Shift) удалите их клавишей [Delete].

Поверните каплю: для этого выберите объект, он станет выделен. Щелкните в центре объекта (по крестику).

Появятся маркеры вращения/искажения. Используя их поверните объект.

 

Создайте для капли обводку голубого цвета, тощиной 1 pt и градиентную заливку линейного типа, в требуемом направлении, с требуемыми цветами: пока объект является текущим (выбранным) выберите в окне свойств объекта вкладку Outline (обводка). Замечание: если это окно не отображается или вы скрыли его – выберите пункт Window > Dockers > Properties

На вкладке задайте требуемые параметры – width (толщину) и color (цвет) обводки.

Для выполнения градиентной заливки откройте вкладку Заливка (Fill) и выберите режим градиентной заливки (Fountain fill)

 

Для изменения параметров градиента: задайте требуемый вид и цвета. Нажав кнопку Edit вы сможете задать и ряд дополнительных параметров, в частности: Angle – угол вращения и Mid-point – срединную точку, задающую баланс цветов градиента

 

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

 

Равнина на рисунке – это прямоугольник, без обводки, с текстурной заливкой из группы Samples 9 > Above the Storm. Вам останется только задать в параметрах текстуры подходящие цвета.

Не забудьте пометить равнину на задний план – правая кнопка мыши в центре объекта>Order>To Back, иначе она закроет персонажа.

 

Создание объектов произвольной формы: горы, река, камень поднятый над головой – для этого можно использовать инструменты Freehand и Shape. Причем Freehand используйте для создания прототипа объекта.

 

Обратите внимание, объект должен быть замкнут, т.е. начальная и конечная точки должны встретиться! В противном случае объект не заливается.

Для автозамыкания контура используйте кнопку Auto-Close curve на панели свойств

Shape – используйте для видоизменения формы объекта – за счет перемещения существующих узлов, их добавления/удаления, изменения типа отрезков между узлами (кривая/прямая).

 

На рисунке выше показан выбранный узел (для выбора узла нужно щелкнуть его один раз), на панели свойств курсор наведен на кнопку преобразования сегмента (отрезка между узлами) в тип Curve (кривая). При этом отрезок можно будет искривлять наведя на него курсор мыши или при выбранном узле перемещая манипуляторы (касательные к кривой).

 

Надпись создается инструментом Text

Текст может быть двух видов: Artistic (художественный) и Paragraph (форматированный). Первый создается посредством простого щелчка и набором с клавиатуры, при этом доступны для изменения все стандартные свойства векторного объекта – масштаб, заливка, обводка и т.п. Второй создается путем рисования курсором мыши рамки и служит для набора блоков форматированного текста. Такой текстовый блок уже не является векторным объектом, поэтому для него доступны только свойства обычные для форматированного текста (шрифт, размер, цвет и т.п.).

Полупрозрачность надписи – см. шаг 2.

 

Тени создаются искусственно или с использованием инструмента Interactive Drop Shadow

 

Инструмент Drop Shadow (падающая тень) позволяет создавать тени от объектов по форме их силуэта. Для этого надо с выбранным инструментом нажать в нужной части объекта (например в центре) и удерживая левую кнопку мыши протянуть в нужном направлении.

Искусственные тени – это фигуры нужной формы, закрашенные черным с применением полупрозрачности Transparency.

 

Итак, применив все вышесказанное и опираясь на практику Вы сможете создать точно такую же картинку, как показано в начале 6 урока.

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

About author of project

 
     
  Sinicin Andrey Sergeevich, date of birth March 27, 1979.

Offered         you their services for the development and promotion - sites, software products and design solutions in the field of website design and design games and programs. Also consults and provides information support on interesting you questions.

Sinicin Andrey Sergeevich - the author of Mega Informatic project
     
 

Contacts:

Skype - megainformatic

creator@megainformatic.ru

 
     
 

In 2001 graduated from the Mari State University (MarSU).

In          2004 graduate school at MarSU.

In currently engaged in the development of design and programming of the web application and adjacent areas - professional computer aided design (design calendars, greeting cards, vignettes, retouch old photos, black and white otsvetnenie photos, create cards and similar products), the creation of website, games, training materials.

Also consult on these issues and related fields. spend training and lessons - Photoshop, Corel Draw, 3ds max, php, html + css, javascript, delphi, c++, the creation of games, music creation, website and more more.

 
     
 

Sphere Interest: information technology, graphics, programming, development Web-based applications and computer games.

In computer science and IT (information technology) to develop programs training courses to work in Windows XP, Word, Excel, Access (database).

on Computer Graphics: training courses on work in Adobe Photoshop, Corel Draw, 3DS Max.

All these courses are adapted for distance learning and self-represented on the site in the form of articles and manuals.

 
     
 

Slightly about Me:

computer and informatics doing since 1992. While starting from a computer          "Electronics BC-0010.01." He has mastered almost all the basics Computer Science and Information Technology: working with documents (in text          Editor TED8), basics of programming in BASIC and machine code, creating images and graphics, making music (KLAVESIN). Since 1998, he joined IBM. My first car was an IBM-compatible PC - 286/10/1 Mb RAM/40 Mb HDD. As time went on, I moved on to more advanced machines continued to develop Information Technology and Computer Science.

With 2002 engaged in teaching. His path began          the Mari State University, conducted a subject "Information technology in agriculture" and "Processes and equipment for food          productions". Since 2003, tasked to individual learning for everyone and training for operators PC. Since 2005, also led courses on computer graphics and design.

2005 - April 2006, conducted training courses in various fields and the individual programs. This is mainly in the direction of training the operator PC and Computer graphics and design, individual classes, special programs.

With May 2006 to October 2010 he was engaged in professional computer          design and development of the individual game projects.

In currently engaged in the creation and development of website, lessons          applications and software, design and graphics.

Extra interested and engaged in the creation and development of computer          games. Therefore, preparing materials for publication on the site and conduct training - on the subject, that is, programming of computer games          in Delphi and C++, as well as the theory and practice of design and engineering computer games from scratch, starting from the idea, through the development of a design project, creation of graphics, sound and music, programming, testing, debugging, and promotion of the final product.

 
     
 

Contacts:

Skype - megainformatic

creator@megainformatic.ru

 
     
megainformatic live chat
Начать беседу
X
 

Registered comments



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


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