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


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

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

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

megainformatic - Работа с сокетами fsocket из php

megainformatic - Как создать игру Создание игровых панелей и индикаторов

megainformatic - Приключения Кости Коробкина - Как я провел лето - интерактивный комикс

megainformatic - Приключения Кости Коробкина - Как я провел лето - интерактивный комикс

megainformatic - Приключения Кости Коробкина - С новым годом - интерактивный комикс

megainformatic - Система управления сайтом на php - megainformatic cms admin files

megainformatic - обзор антивирусных средств защиты

megainformatic - как работает антивирус ?

megainformatic - Создание сайта для бизнеса

megainformatic - Новый взгляд на очевидные вещи

megainformatic - Разработка программ на c++

megainformatic - Немного о музыке

megainformatic - GET и POST запросы

megainformatic - для чего нужна карта сайта

megainformatic - Web Администрирование

megainformatic - Мысли о разном

megainformatic - Легко ли быть программистом

megainformatic - Глубины программирования на C++

megainformatic - Убираем лимит на размер импортируемого файла в PhpMyAdmin

megainformatic - Как создать torrent файл

megainformatic - Нужна ли валидация вашему сайту ?

megainformatic - Антивирус DrWeb

megainformatic - Калькулятор рассчёта стоимости зубопротезирования для стоматологической клиники

megainformatic - Что такое BitTorrent (БитТоррент)

megainformatic - Миссис Даутфайр 1993 фильм torrent

megainformatic - Как скачивать торрент-раздачу ?

megainformatic - Автотелега фильтр

megainformatic - Фильмы

megainformatic - Fahrengeit Фаренгейт игра 2006 для PC

megainformatic - Fez игра для PC 2013

megainformatic - Дневник памяти - фильм 2004

megainformatic - Scooter - The night - Video and Lyrics - Скутер - Ночь - Видео и лирика

megainformatic - Если всё же неудача

megainformatic - Смерть или искупление или избавление

megainformatic - По ту сторону

cj megainformatic - музыкальный альбом БЕСКОНЕЧНОЕ ДВИЖЕНИЕ ОЖИДАНИЕ И ДЕЙСТВИЕ

megainformatic - Костя Коробкин - Секретный проект - интерактивный комикс

megainformatic - Основы анимации во флеш на примере анимирования простейшей окружности

megainformatic - Парсер сайтов Введение

megainformatic - Я пишу музыку для себя и для продажи

megainformatic - Статьи на околомузыкальные темы - осень 2014 часть 1

megainformatic - рассказ - Чужие воспоминания - автор Синицин Андрей - 24.09.2014

megainformatic - Сайты живущие вне поисковых систем. Есть ли такие и как их найти ?

megainformatic - Game craft - проект разработки игровых и мультимедийных проектов

megainformatic - Game craft - моделируем scv

megainformatic - Game craft - моделируем scv - шаг 1 (часть 2)

megainformatic - Game craft - моделируем scv - шаг 2 (часть 3)

megainformatic - Game craft - Наложение текстуры на модель робота scv (часть 4)

megainformatic - Game craft - Прорисовка текстуры робота SCV шаг 5

megainformatic - Game craft - Экспорт модели из 3ds max в формат X

megainformatic - Game craft - отображение scv модели в формате x в d3d9-приложении

megainformatic - Game craft - управление игрой от Direct Input в d3d9 - приложении

megainformatic - Game craft - игровая камера в d3d9 - приложении

megainformatic - Приключения Кости Коробкина - Как я провел лето - онлайн комикс - страница 1

megainformatic - Приключения Кости Коробкина - Как я провел лето - онлайн комикс - страница 2

подробнее

Как создать игру ? - Пишем игровой движок с нуля - DXUTMainLoop - цикл работы DirectX-приложения

[Содержание]  [Назад]  [Далее]

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

DXUTMainLoop - цикл работы DirectX-приложения

Мы рассмотрим что собой представляет цикл DXUTMainLoop

На показанной блок-схеме обозначены основные элементы этого цикла -

DXUTCreateDevice

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

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

Обычные Windows-приложения не обладают такими возможностями, которые предоставляет DirectX, поэтому игры "выжимают" из вашего компьютера всё возможное быстродействие и все ресурсы на 100% и даже больше % :))))

WM_QUIT != msg.message

while( WM_QUIT != msg.message ) представляет собой бесконечный цикл обработки системных сообщений, выполняемый до тех пор, пока не поступит сообщение WM_QUIT свидетельствующее о завершении работы приложения.

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

Этот этап осуществляется внутри DXUTRender3DEnvironment

Вот собственно и всё. Как видите тут тоже всё достаточно просто. Необходимые подробности Вы можете почерпнуть изучая примеры из DirectX SDK Aug 2008 или выше, а также из готового игрового движка, который я уже написал - Полный исходный код игры ВЕБ - Веселый Единственный Буквоежка.

Реализация функции DXUTMainLoop описана в модуле DXUT.cpp

Найти данный модуль достаточно просто - если проект исходного кода движка у вас уже открыт в среде MSVS, то находим модуль DXUT.cpp в окошке Solution Explorer как показано на рисунке

если проект исходного кода движка у вас уже открыт в среде MSVS, то находим модуль DXUT.cpp в окошке Solution Explorer как показано на рисунке

Теперь заглянем в модуль DXUT.cpp и посмотрим, что записано в реализации процедуры void WINAPI DXUTRender3DEnvironment()

Там как видим всего лишь такой код

if( DXUTIsCurrentDeviceD3D9() )
DXUTRender3DEnvironment9();
else
DXUTRender3DEnvironment10();


Т. е. если ваше приложение работает в режиме DirectX 10 - то будет выполнена процедура DXUTRender3DEnvironment10, и если в режиме DirectX 9 - тогда DXUTRender3DEnvironment9.

DirectX 10 работает только под системами Windows Vista и выше, поэтому выбор DirectX 9 более универсален - приложения будут работать и на XP и даже на более ранних версиях Windows, естественно с установленными файлами для DirectX 9 и драйверами под эту версию directx.

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

Мы с Вами уже добрались до самого интересного -

void DXUTRender3DEnvironment9()

Код, который записан внутри этой процедуры Вы также можете найти в модуле DXUT.cpp который есть в DirectX SDK Aug 2008 или в Полном исходном коде игры ВЕБ - Веселый Единственный Буквоежка

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

if( GetDXUTState().GetDeviceLost() || DXUTIsRenderingPaused() || !DXUTIsActive() )
{
Sleep( 50 );
}


Данный блок кода проверяет условия - устройство DirectD3DDevice "потеряно", либо процесс отрисовки приостановлен (пауза), либо окно приложения не активно (потеряло фокус).

Если одно из указанных событий имело место, то происходит приостановка (sleep) выполнения приложения длительностью 50 миллисекунд.

IDirect3DDevice9* pd3dDevice = DXUTGetD3D9Device();)
if( NULL == pd3dDevice ))
{)
if( GetDXUTState().GetDeviceLost() ))
{)
DXUTDeviceSettings deviceSettings = DXUTGetDeviceSettings();)
DXUTChangeDevice( &deviceSettings, NULL, NULL, false, true );)
})
)
return;)
})


В данном кусочке кода видим как объявляется переменная pd3dDevice, какой она имеет тип - IDirect3DDevice9, символ * свидетельствует о том, что в переменной pd3dDevice хранится не сам объект IDirect3DDevice9, а только указатель на него (ссылочный тип).
Не путайте с гиперссылкой :))))

Дам небольшое пояснение.

int some = 1; //это переменная some имеющая тип int (целое число) равная значению 1
int* psome = &some; /* а эта переменная - psome - указатель на int и как видите хранит не значение 1, а адрес этой переменной в памяти - это и есть указатель или ссылочный (reference) тип */


Созданные настройки для устройства сохраняем в переменной deviceSettings.

Вызываем функцию DXUTChangeDevice, которая создает новое устройство directdevice.

Помимо этого (см. далее по коду внутри DXUTRender3DEnvironment9 ) проверяется TestCooperativeLevel - своего рода уровень занятости устройства directdevice.

[Содержание]  [Назад]  [Далее]
подробнее

     
 

Видео урок про создание игры - рождение игры часть 1.

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

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

Игровая логика - это формализованный в коде набор игровых идей, которые составляют игровой геймплей.

В игре "Ну, Погоди!" игровая логика сводится к следующему алгоритму, выраженному в словесной форме -

игрок должен управлять положением волка, располагая его в одном из 4х возможных. С лотков катятся яйца. По достижении конца лотка яйца падают, если у этого лотка не стоял волк, при этом выглядывающий из окошка заяц вызывает появление из разбитого яйца бегущего цыпленка. Отсутствие зайца приводит к полному разбиванию яйца. За пойманные яйца начисляются призовые очки, за разбитые - штрафные. Бегущему цыпленку соответствует пол-штрафного очка, полностью разбитому яйцу - 1 штрафное очко. Игра продолжается до 3 штрафных очков или до троекратного набора 999 очков. В последнем случае отображается поздравительный текст и небольшой мультфильм.

 

Теперь посмотрим на код, который должен реализовать описанную логику -

в методе TD3DGameApp.UpdateInput

изменение положения волка происходит следующим образом

{...}

if PressButton in m_DXInput.States
then begin
Area := TargetBtnArea(GetCursorPos);
//в данном случае проверяется нажатие на кнопку управления волком на игровой

//панели путем наведения на неё указателя мыши и нажатия левой кнопки мыши

{...}

if LeftUpCatch in m_DXInput.States then begin //т. к. на больших скоростях игры потребуется прямое управление
Area := 0;
//волком от клавиатуры, то это происходит таким образом
end;

{...}

Далее текущее положение волка заносится в специальную переменную -

Это происходит в реализации метода TD3DGameApp.FrameMoveGameSituation -

//положение волка
if (Area >= 0) and (Area < 4) then begin
WolfPos := 1 + Area;
WolfPosSet := WolfPosSet + [WolfPos];
end;

и далее -

//если игра не остановлена из-за разбитого яйца
if not StopGame then begin

//появление нового яйца на лотке
CreateNewEgg;

//качение яиц по лоткам
RollEggs;

//появление зайца из окошка
RabbitLookedFrom;

//счетчик изменения темпа игры
IncreaseGameSpeed;


end; {of StopGame or ResetShtraf}

CrashEggs; //разбивание яиц, бег цыплят


//мерцание, сброс штрафных очков

FlashShtraf;

 

Реализацию показанных методов Вы можете посмотреть в исходном коде игре "Ну, Погоди!".

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

 
Переходим к практическим упражнениям.
 

Используя код приложения из предыдущего - 5 урока - GameClasses_src попробуйте реализовать такой простейший игровой процесс:

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

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

В ходе реализации плена желаний я разрешил одну логическую ошибку, в результате которой код, отвечающий за формирование рельефа и перемещение по нему персонажа из примера 3D-игры Scene2Game будет работать корректно. Это полноценный пример по построению сложной игровой 3d-сцены с анимированными персонажами, игровыми панелями и прочими атрибутами. Пример также способен отображать рельеф и перемещать персонажей по нему, но для этого его немного надо доработать. Можете попробовать сами.

Для компиляции примера понадобится библиотека delphi directx.

 
Пример сложной игровой сцены
 

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

- вывод 9 зон земной поверхности и объектов на ней (деревья), возможно построение сцены по данным файла - карты;

- свободная и привязанная к персонажу камера (переключение клавишей [V]);

- переключение между персонажами [пробел];

- анимированные персонажи (хотьба, прыжки, падение); управление персонажем j, k, l, i

- игровые панели - жизни, сила броска;

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

- поиск ближайших кубиков, показ их стрелками;

- рассчет траекторий полета (не доделано);

 

В завершение данного урока хотелось бы обратить Ваше внимание на реализацию алгоритма постепенного нарастания темпа в игре "Ну, Погоди!". Для этого загляните в реализацию метода TD3DGameApp.IncreaseGameSpeed

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

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

Как я осваивал Flash - шаг 1

Доброго времени суток ! В данном цикле статей я поделюсь с вами своим опытом освоения технологии Flash.

Эта технология позволяет встраивать в страницы вашего сайта интерактивные приложения flash, в том числе игры.

Такие игры не требуют инсталляции - открыл браузер и играй !

Что очень привлекательно для пользователей.

Итак, что же нужно для того, чтобы научиться делать собственные flash-игры ?

Первым делом Вам надо найти подходящую среду разработки, за основу можно взять продукт Adobe Flash.

В данном цикле статей Мы рассмотрим работу в Adobe Flash CS4.

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

С чего же начинается разработка Flash игры ?

Первым делом, когда Вы вообще еще не представляете с чего начать после того как запустили Adobe Flash и не знаете что же делать дальше,

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

Например, я нашел в сети исходник игры про марио.

Графика и смысл игры там конечно же оставляют желать лучшего.

Но в качестве учебного примера это вполне хорошее начало.

Там есть движущиеся спрайты, проверка столкновений (коллизий) и другие интересные вещи.

Остается только понять как оно всё работает :)))

Чем мы сейчас собственно и займёмся.

Анимация прыгающего шарика.

Запускаем Adobe Flash CS4, выбираем пункт меню ФАЙЛ > СОЗДАТЬ > ФАЙЛ FLASH (ACTION SCRIPT 3.0)

Получим новый пустой документ белого цвета.

Попробуем изменить размеры документа и цвет фона.

Правой кнопкой щелкаем на пустом белом пространстве документа и выбираем пункт меню
СВОЙСТВА ДОКУМЕНТА

СВОЙСТВА ДОКУМЕНТА

Попробуем задать новые размеры - 600 х 400 пикселей -

новые размеры - 600 х 400 пикселей ДОКУМЕНТА

Там же можно изменить цвет фона, давайте изменим его на зеленый -

ЦВЕТ ФОНА ДОКУМЕНТА

После этого жмём ОК.

Теперь в панели инструментов справа выберем примитив - Овал.

Инструмент Овал

И попробуем изобразить окружность как показано на рисунке -

Овал

Теперь надо научиться менять свойства созданного объекта.

В панели инструментов справа выберем ИНСТРУМЕНТ СТРЕЛКА -

ИНСТРУМЕНТ СТРЕЛКА

Теперь наведем указатель мыши на область окружности и щелкнем по ней -

ВЫБОР СВОЙСТВА ЗАЛИВКА

Как Вы заметили она стала выделена точками, которые заполняют всё её пространство.

В панели свойств справа теперь можно легко изменить цвет заливки, изменим например на желтый.

ЖЕЛТАЯ ЗАЛИВКА

Аналогично при помощи ИНСТРУМЕНТа СТРЕЛКА можно выбрать контур (ОБВОДКУ) окружности и изменить его цвет и толщину -

КРАСНЫЙ УТОЛЩЕННЫЙ КОНТУР

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

В нижней части окна Adobe Flash CS4 вы можете видеть ПАНЕЛЬ ВРЕМЕННОЙ ШКАЛЫ.

Там наш примитив ОВАЛ (будем называть его Шарик :) ) пока имеет всего 1 ключевой кадр.

Давайте щелкнем правой кнопкой кадр номер 5 и выберем пункт ВСТАВИТЬ КЛЮЧЕВОЙ КАДР.

Вставляем 5 ключевой кадр

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

Для этого выбираем ИНСТРУМЕНТ СТРЕЛКА и перемещаем наш Шарик в 5 кадре немного вверх.

имитируем 'ПОДСКОК' шарика

По аналогии создаем ключевой кадр 10 и и возвращаем Шарик в исходное положение, либо можно просто скопировать 1 кадр и вставить его на место 10.

Нажимаем CTRL + ENTER чтобы посмотреть полученную анимацию -

Нам с Вами остается научиться экспортировать полученный ролик в формат SWF.

Для этого выбираем пункт меню ФАЙЛ > ЭКСПОРТ > ЭКСПОРТИРОВАТЬ РОЛИК.

Выбираем РОЛИК SWF, задаем имя файла и Сохраняем.

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

<div style="text-align: center;">
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab
#version=4,0,2,0" width="600" height="400">
<param name="movie" value="http://megainformatic.ru/papers/flash_dev/hilf_s_1/images/jumped_ball.swf">
<param name="quality" value="high">
<embed src="http://megainformatic.ru/papers/flash_dev/hilf_s_1/images/jumped_ball.swf" quality="high"
pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash"
width="600" height="400">
</object>
</div>

Файл разумеется нужно разместить в указанной папке на вашем сайте.

Например мой файл расположен здесь - http://megainformatic.ru/papers/flash_dev/hilf_s_1/images/jumped_ball.swf

Спасибо за внимание !!!

Надеюсь этот урок помог Вам сделать 1ый шаг в освоении флеш, как и мне, который его сделал и написал данный урок для Вас :)))

Удачи !!!

В следующем уроке мы попробуем разобраться как заставить шарик перемещаться по экрану по нажатию клавиш стрелок ВВЕРХ, ВНИЗ, ВЛЕВО и ВПРАВО с применением кода ACTION SCRIPT.

подробнее

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

[Содержание]  [Далее]

Очень часто на различных тематических форумах, да и просто практически на любом форуме, посвященном играм кто-то задает вопрос: Как создать игру ?

У новичков, которые наигрались в игры и захотели чего-то большего бытует мнение, что чем лучше игра - тем её проще сделать. :)))

Дальше - больше.

Вот уже видим, как такой горе-энтузиаст бросает клич в интернет, чтобы СОБРАТЬ КОМАНДУ для создания СУПЕР ПУПЕР МЕГА ПРОЕКТА ИГРЫ.

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

Но проходит неделя-другая, энтузиазм спадает, отвлекают повседневные заботы и вот уже очередной задуманный СУПЕР ПУПЕР МЕГА ПРОЕКТ ИГРЫ канул в лету.

И таких примеров можно привести сотни и тысячи. :)))

Вы всё еще горите желанием создать свою игру ?

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

То есть - даже если Вы ВЫСОКОКЛАССНЫЙ СПЕЦИАЛИСТ, у Вас есть ОПЫТ, время и средства - Вы будете работать наудачу, и в большинстве случаев Ваш проект скорее всего не принесет Вам успеха. Увы, это так. Потому что современные успешные проекты - это недостижимая вершина.

Самая главная ошибка всех новичков - замахиваться сразу на что-то ОЧЕНЬ БОЛЬШОЕ.

Начинать надо с очень маленьких проектов, которые можно реализовать малыми силами за короткий промежуток времени, скажем в пределах 1 месяца.

Не забывайте, что если Вы еще и работаете или учитесь, то времени на ВАШ ПРОЕКТ у Вас будет ОЧЕНЬ И ОЧЕНЬ мало - только свободное время, в которое тоже хочется отдохнуть, погулять, а не сидеть за компьютером и не писать код или сценарий будущей игры. :)))

Большинство начатых энтузиастами проектов так и остаются незавершенными практически на начальном этапе.

Ну а если даже шагнуть чуть дальше - то и завершенные проекты в большинстве своём неинтересны, непрофессиональны, неуникальны и вообще никому не нужны и ничем не примечательны, за РЕДКИМ РЕДКИМ исключением.

Вот так то, друзья мои.

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

ТОЛЬКО ТОГДА ЕСТЬ МАЛЕНЬКИЙ ШАНС что Вы всё-таки чего-то добьетесь и не только завершите проект, но он будет хотя бы чуточку кому-то полезен или интересен.

Итак, вооружившись всеми этими пессимистическими выводами настроимся на оптимистический лад и

ПРИСТУПИМ К СОЗДАНИЮ ИГРОВОГО ДВИЖКА НАШЕЙ БУДУЩЕЙ ИГРЫ

Готовые игровые движки - за и против

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

Но тут есть одно НО!

Во-первых, Вы не знаете, что таит в себе чужой код, какие скрытые плюсы и минусы заложены в нём и главное - поскольку Вы его сами не писали и не знаете что к чему - то значительное количество времени у вас уйдёт НА ОСВОЕНИЕ чужого кода.

Другая крайность - это начать свой проект с нуля.

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

Наконец, на самом деле - наилучший выход - это комбинация обоих этих способов.

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

Данный способ неизбежен, т. к. не обладая знаниями в определенной области, скажем в программировании на C++, Вы сами ничего не придумаете и не изобретете велосипед.

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

[Содержание]  [Далее]
     
 
Урок 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] [далее] [к содержанию]
 
     
     
     
     
     
     
     
     
megainformatic live chat
Начать беседу
X
 

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



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


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