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


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

megainformatic - Приключения Кости Коробкина - Как я провел лето - интерактивный комикс
Приключения Кости Коробкина - Как я провел лето - интерактивный комикс (akk hiss)
подробнее...

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

megainformatic - Использование cron, crontab и планировщика задач

megainformatic - Совместное использование jquery и mootools или других js-фреймворков

megainformatic - Модуль content php performer для megainformatic cms

megainformatic - Пишем компактный слайдер

megainformatic - Что нужно знать для создания сайта ?

megainformatic - Что нужно знать для создания сайта ? Глава 2 - Кодировки и DOCTYPE

megainformatic - Что нужно знать для создания сайта ? Глава 3 - Идём дальше - нанизываем новый код - где объявляются стили css и код javascript

megainformatic - Что нужно знать для создания сайта ? Содержание

megainformatic - Что нужно знать для создания сайта ? css - стили

megainformatic - preg_match или Использование регулярных выражений в php

megainformatic - статьи Тимонина Андрея - Flash. Содержание

megainformatic - статья Тимонина Андрея - Flash. Подготовка к работе.

megainformatic - статья Тимонина Андрея - Flash. Hello world.

megainformatic - статья Тимонина Андрея - Flash. Экспорт SWC библиотеки.

megainformatic - Тимонин Андрей - Несколько слов о себе

megainformatic - статьи Тимонина Андрея - уроки из области веб программирования, создания казуальных игр

megainformatic - статья Тимонина Андрея - Обеспечиваем доступ к объекту из любой точки программы. Singleton

megainformatic - статья Тимонина Андрея - Хронология работы программы. Создаем Лог

megainformatic - статья Тимонина Андрея - Поиск файлов. Получаем список файлов каталога.

megainformatic - статья Тимонина Андрея - Исключения. Создаем класс обработки исключений.

megainformatic - статья Тимонина Андрея - States. Создаем менеджер состояний игры.

megainformatic - статья Тимонина Андрея - Регистрация. Часть 1. Создаем страничку регистрации на сайте.

megainformatic - статья Тимонина Андрея - Регистрация. Часть 2. Создаем обработчик, и заносим информацию о пользователе в Б.Д.

megainformatic - статья Тимонина Андрея - Таймер. Выводим время игры.

megainformatic - статья Тимонина Андрея - DirectX9. Создаем основной класс обработки графики.

megainformatic - статья Тимонина Андрея - DirectX9. Создаем первое приложение.

megainformatic - Что нужно знать для создания сайта ? float - использование в css - стилях

megainformatic - Уроки Fruity Loops Studio (FL Studio) - урок 2 - пишем свою композицию COLD

megainformatic - Уроки Fruity Loops Studio (FL Studio) - урок 3 - экспериментируем с композицией COLD

megainformatic - Что нужно знать для создания сайта ? Стандартные шрифты для сайта

megainformatic - Что нужно знать для создания сайта ? ASC II Коды символов

megainformatic - Уроки Fruity Loops Studio (FL Studio) - урок 4 - пишем первый вариант композиции COLD

megainformatic - Популяризация Современных Научных Знаний и Размышления на околонаучные темы. СОДЕРЖАНИЕ

megainformatic - Популяризация Современных Научных Знаний и Размышления на околонаучные темы. Энергетический кокон

megainformatic - Модуль галерей для любой cms

megainformatic - Портфолио выполненных проектов сайтов и приложений

megainformatic - Мои Музыкальные Миры - страница 2

megainformatic - megainformatic cms rs

megainformatic - модуль Падающий снег

megainformatic - проект Open Shop

megainformatic - Рисуем красивую девушку всего за 6 шагов

megainformatic - Галерея красивых рисованных девушек

megainformatic - НОВОГОДНЕЕ ОБРАЩЕНИЕ СОЗДАТЕЛЯ webinformatic К ЖИТЕЛЯМ ПЛАНЕТЫ интернет

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

megainformatic - Уроки css - атрибут position

megainformatic - Ива Ден энд КуХа - КОДЕКС ФРИЛАНСЕРА - СОДЕРЖАНИЕ

megainformatic - Ива Ден энд КуХа - КОДЕКС ФРИЛАНСЕРА - Глава 1 - Обычный день

megainformatic - Ива Ден энд КуХа - КОДЕКС ФРИЛАНСЕРА - Глава 2 - Начало (begin)

Новогодняя дискотека 2013 на megainformatic точка ru

megainformatic - Программируем на C++ с использованием MFC

megainformatic - Программируем на C++ с использованием MFC - Создание MFC приложения

megainformatic - Программируем на C++ с использованием MFC - Создание MFC приложения - hello, world !

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

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

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

подробнее

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

На протяжении предыдущих 4 уроков мы рассмотрели как строится базовый каркас D3D-приложения, узнали некоторые детали разработки игры.

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

 

Начнём с того, что спросим себя: для чего вообще нужны игровые объекты?

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

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

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

 

Если объекты достаточно просты и не используют методы, то их можно представить в виде простых переменных или структур.

Какие типы объектов бывают?

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

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

Этот процесс является итеративным. Хорошие и проработанные объекты создаются постепенно, по мере совершенствования и улучшения кода игры. Это всё тесно связано с хорошими правилами и хорошим стилем программирования.

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

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

 

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

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

 

Вот пример описания класса объекта игрока взятый из исходного кода игры проекта "Нечто: Необъяснимое".

TPlayerHero = class(TAnimGameCreature)
private
//FAction: TCharActions;
//FAnimationEnded: Boolean;


procedure DoAnimateProc(TimeLapsed: Single; hr: HResult);

//function GetTerrainHigh(x, z: Single): Single;
protected

procedure SetAnimationParam(Value: Integer); override;

function DoRender: HResult; override;
function DoFrameMove: HResult; override;
//function DoFrameMove2(TimeLapsed: Single): HResult; override;

function DoInitDeviceObjects(pd3dDevice: IDirect3DDevice8): HResult; override;
function DoRestoreDeviceObjects: HResult; override;
function DoInvalidateDeviceObjects: HResult; override;
function DoDeleteDeviceObjects: HResult; override;

public

constructor Create;
destructor Destroy; override;


end;

 
Как видим данный класс производится от некоторого базового класса - TAnimGameCreature и имеет целый ряд методов, связанных в основном с использованием анимированной 3D-модели персонажа. Внутренние особенности класса - его свойства реализованы внутри TAnimGameCreature. Посмотрим его описание -
 
TAnimGameCreature = class(TD3D_GDOListItem)
private
FAction: Integer;
FDoAnimate: TAnimateProc;

protected

procedure SetAnimationParam(Value: Integer); virtual;

function DoRender: HResult; override;
function DoFrameMove: HResult; override;

function DoInitDeviceObjects(pd3dDevice: IDirect3DDevice8): HResult; override;
function DoRestoreDeviceObjects: HResult; override;
function DoInvalidateDeviceObjects: HResult; override;
function DoDeleteDeviceObjects: HResult; override;

public

Character: TAnimatedMesh;

Pos, Orient: TD3DXVector3;
YAxisAngle: Single;
Delay: Single; //длительность воспроизведения анимации
IdleDelay: Single; //длительность бездействия

CurrentAnimDelay: Single; //временная задержка для воспроизведения текущей анимации
IdleAnimDelay: Single; //временная задержка анимации бездействия

GameScene: TD3D_GDOListItem;

constructor Create;
destructor Destroy; override;

function Animate(TimeLapsed: Single): HResult;

property Action: Integer read FAction write SetAnimationParam;
property DoAnimate: TAnimateProc read FDoAnimate write FDoAnimate;
end;

 

Как видим данный класс происходит от класса TD3D_GDOListItem. Такое наследование связано с тем, что данный объект будет являться элементом списка графических объектов TD3D_GDOList. Помимо этого вы видите ряд полей и свойств описанных в данном классе.

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

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

 
Если взять исходный код игры "Ну, Погоди!", то здесь Вы обнаружите полное отсутствие самостоятельных классов игровых объектов. Игра достаточно проста, поэтому всё, что нужно в качестве игровых объектов удалось описать лишь структурами данных определенных типов. Использования классов производных от TObject или каких-то других не потребовалось.
 

В игре "Ну, Погоди!" свойства и необходимые данные игрока представлены внутри самого класса игрового приложения.

Так например,

WolfPos: TTraysNum; //положение волка

определяет текущее положение волка из возможных 4х (см. описание TTraysNum)

GameScore, ShowedGameScore: Integer; //

определяет текущий и отображаемый счет игры

ShtrafGameScore: Single; //счет штрафных очков

показывает количество штрафов, три штрафных очка приводят к завершению игры - проигрышу

Аналогично игровой объект яйцо - также представлен в виде полей класса приложения -

Trays: TEggPos; //позиция яиц на лотке
TraysSet: set of TTraysNum; //номера лотков с которых могут катиться яйца
TraysIndex: TTraysIndex; //индексы номеров лотков
//используются в генераторе новых яиц

 
CreatedEggsNum: Integer; //количество созданных яиц

NewEggTimeCounter: Single; //счетчик появления нового яйца на лотке
NewEggTimeLimit: Single; //предел времени по прошествии которого
//будет создано новое яйцо на лотке

MoveEggTimeCounter, MoveEggTimeLimit: Single; //счетчик и предел
//времени для очередного шага продвижения яиц по лоткам

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

Если вспомнить мой опыт в этой области, то я в своё время начинал изучать Delphi5 в 2002 году, пытаясь создать логическую игру Логика цвета. Естественно, что ни о каком DirectX речи не шло. Это была простая игра-окно с рядом кнопочек. Нужно было угадывать цвета которые задумал компьютер, при этом он давал небольшие логические подсказки на каждом шаге.

Чуть позднее, когда опыт программирования был мной приобретен и усвоены несколько книг по программированию, я перешел к проекту игры "Дорога в Город". Это было уже в 2003. Толчком к освоению DelphiX и созданию игры "Дорога В город" послужила попытка устроиться в одну небольшую фирму, занимавшуюся разработкой компьютерных игр. Моих знаний конечно же оказалось для этого недостаточно, кроме того, требовалось знание все-таки C++ и DirectX, а не Delphi. Однако такой опыт и требования предъявленные при этом послужили мне своеобразной планкой, к которой я стремился. Прошло некоторое время и игра была воплощена, а я уже стал подумывать над созданием 3D-игр. Так появилась библиотека Delphi DirectX 8.1. Конечно основой этой библиотеки послужили работы Алексея Баркового по конверсии кода и примеров из DirectX SDK на C++ в Delphi (http://www.clootie.ru)

Но Алексей Барковой написал именно SDK для Delphi. В его интересы не входила практическая сторона - попытка создания при помощи этого SDK полноценной игры. Для этого не хватало некоторых исходников, кроме того, не было самого главного - примера игры, который можно было бы переделать на Delphi и который послужил бы основой для создания полноценной игры.

У меня под рукой оказалась Microsoft DirectX SDK 8.1 и там был как раз пример игры Donuts3D. Я поставил перед собой задачу реализовать эту игру на Delphi 7, и эта задача удалась. При этом появилось несколько новых исходников, которые и сформировали библиотеку Delphi DirectX 8.1. Дело пошло дальше и появились проекты "Нечто: Необъяснимое" и "Ну, Погоди!".

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

Итак, это было небольшое отступление от основной темы нашего урока.

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

 
Теперь мы переходим к практической части нашего урока. В рамках неё мы рассмотрим реализацию реальных игровых классов для использования в проекте "Нечто: Необъяснимое. Нить накала". Будет показано как реализованы 2 микро-игры в мини-игре "в плену желаний" для главы 7.
 
"В плену желаний" - 8,55 Mb-готовый проект CoD (8,55 Mb)
 
Код будет основан на исходном коде игры проекта "Нечто: Необъяснимое". Приложение будет работать в обычном режиме за исключением того, что после выбора пункта меню [новая игра] будет выводится не экран выбора глав, а сразу же титульный экран данной мини-игры.
 

Для использования кнопок меню [начать] и [закончить] и вывода их в нажатом состоянии подойдет класс TD3DImage2D описанный в модуле D3DGUI.pas (его Вы найдете в исходном коде игры "Ну, Погоди!").

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

относительные координаты экрана x = -1..1, y = 1..3

для разрешения экрана 1024х768

текстура кнопки 512х512, ее пиксельные координаты (относительно левого верхнего угла экрана) -

497, 268

масштабный коэффициент длины (x)

экран 1024/2 = 512 - это масштабный коэффициент 0.5 для длины экрана

[отношение длины к ширине] = 1024 : 768 = 1,33333333...

масштабные коэффициенты вывода текстуры 512х512 -

x_scale = 0.5*1.333333 = 0.66

y_scale = 0.5*1.333333 = 0.66

Относительные координаты вывода -

x, y = -0.02, 1.70

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

512, 384 - центр экрана (0, 0)

x = (497-512)/512 = -0.029296875

y = (268+384)/384 = 1.6979166666

 

Удобство относительных координат состоит в том, что они не зависят от разрешения экрана. Попробуйте выполнить те же рассчеты для разрешения 800х600 и получите те же масштабные коэффициенты и те же относительные координаты.

Важно также обратить внимание на то, что для анимированных объектов ТЕКСТУРА ОБЯЗАТЕЛЬНО ДОЛЖНА БЫТЬ КВАДРАТНОЙ, т.е. - 32х32, 64х64, 128х128, 256х256, 512х512, 768х768б 1024х1024, 2048х2048 иначе при выводе анимации будут возникать сдвиги картинки!

Для неанимированных изображений можно использовать и не квадратные изображения текстур, как например title.jpg - это если посмотреть в ресурсы проекта (Media\Textures\captivity) картинка размером 1024х768

 

Я не буду здесь приводить исходный код, Вы можете просто скачать

готовый проект (CoD) (8,55 Mb) или исходный код примера (GameClasses) (1,3 Mb)

[downloads:13]
 

готовый проект (CoD) (8,55 Mb) представляет из себя базовую оболочку игры "Нечто: Необъяснимое" с реализованной мини-игрой "в плену желаний".

исходный код примера (GameClasses)

[downloads:13] предназначен для сборки с использованием библиотеки delphi directx 8.1 включенную в исходный код игры "Ну, Погоди!". Содержит демонстрацию вывода титульной заставки, экранного меню (обработка пунктов меню [начать] и [закончить], игрового курсора

 

Вопросы которые предстоит решить читателю:

Как сделать вывод курсора и пунктов выбранных меню с прозрачным фоном, как это имеет место в готовом проекте (CoD)?

При выходе из полноэкранного режима нажатием [закончить] происходит ошибка, как ее устранить?

 

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

 
[назад] [страница 1] [далее] [к содержанию]
 
Если Вы затрудняетесь с ответом, то можете посмотреть их - ответы на поставленные вопросы
 
     
     
     
     
подробнее

Game craft - моделируем scv - часть 3

[все уроки game craft]  [моделируем scv]  [моделируем scv шаг 1 часть 2]

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

Модель робота scv как в Starcraft 2 - моделируем элементы задней части

Моделирование трубопровода или попросту трубки, как видно из рисунков, заключается в выдавливании на большое расстояние с последующим перемещением по осям X, Y и Z.

Модель робота scv как в Starcraft 2 - моделируем элементы задней части - резиновый трубопровод

Завершаем создание трубопровода. SCV робот готов.

Модель робота scv как в Starcraft 2 - моделируем элементы задней части - резиновый трубопровод

Вы можете скачать готовую модель, в которой представлено 3 варианта робота по ссылке ниже. Модель в формате 3ds max 2009, представлена внутри самораспаковывающегося архива (109 Кб).

Модель робота scv как в Starcraft 2 - скачать

[downloads:34]

Далее мы займёмся наложением текстуры на созданную модель робота SCV, а также нарисуем саму текстуру.

Процесс наложения текстуры уже описан в статье Мастер-класс: Создание модели и текстуры Коммандного Центра (как в StarCraft 2)

Для работы нам потребуется вот такая вспомогательная текстура -

вспомогательная текстура

Теперь рассмотрим как наложить текстуру на модель робота SCV - Наложение рабочей текстуры на модель робота SCV шаг 3 часть 4

[все уроки game craft]  [моделируем scv]  [Моделируем робота SCV шаг 1 часть 2]  [Наложение рабочей текстуры на модель робота SCV шаг 3 часть 4]

подробнее

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

[все уроки game craft]  [моделируем scv]  [моделируем scv шаг 1 часть 2] [моделируем scv шаг 2 часть 3] [Прорисовка текстуры робота SCV шаг 5]  [экспорт робота scv в формат x] 

В предыдущих уроках мы рассмотрели как моделируется, текстурируется и экспортируется модель. Теперь покажем как выводить данную модель в d3d9-приложении.

Модель робота scv в d3d9 - приложении

Вы можете скачать самораспаковывающийся архив, содержащий весь необходимый исходный код

Для нормальной сборки вам также потребуется среда разработки MSVS 2005 и DirectX SDK August 2008.

Теперь попробуем кратко продокументировать код, который содержит приложение d3d9_skin_mesh

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

Выполнение приложения начинается с вызова метода CD3DAppTemplateApp::CD3DAppTemplateApp()

Далее следует остановиться на вызове метода BOOL CD3DAppTemplateApp::InitInstance(), т. к. внутри него создается и скрывается главное окно приложения -

pMainWindow = new CD3DAppTemplateDlg();
pMainWindow->Create(CD3DAppTemplateDlg::IDD);
pMainWindow->ShowWindow(SW_SHOW);
pMainWindow->ShowWindow(SW_HIDE);

Это делается для того, чтобы внутри процедуры InitialD3DAppSettings новое окно, создаваемое и используемое для целей вывода 3D сцены не перекрывалось с основным и не возникало путаницы. Просто создается иллюзия, что окно 3D сцены и есть основное.

void InitialD3DAppSettings()

//...

DXUTCreateWindow( L"D3D9 App Template", 0, 0, 0);

//...

В этой связи возникает вопрос: А почему окно pMainWindow нельзя использовать для вывода 3D сцены ?

Ответ звучит так: окно pMainWindow - это базовое окно MFC приложения, с которым связаны некоторые ресурсы, но для целей вывода 3D сцены оно не пригодно, т. к. DirectX API предполагает для этого только вновь созданное, отдельное окно. В противном случае обеспечить работу D3D в этом окне не представляется возможным. Поэтому именно такой способ и используется в нашем приложении d3d9_skin_mesh

Нетрудно догадаться, что основная работа по подготовке d3d-приложения к работе описана внутри процедуры InitialD3DAppSettings, а собственно цикл работы приложения описан в DXUTMainLoop и заключается в поочередном вызове сначала процедуры void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext ), а после неё - void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext ).

У Вас может возникнуть вопрос: Как реализуется обработка управления от клавиатуры и мыши ?

В данном приложении она реализована обычными средствами Windows - через функцию MsgProc - но это будет более медленный способ. В реальном игровом приложении это реализуется посредством вызова специальной функции где-то в самом начале процедуры OnFrameMove. Например в игре Веселый Буквоежка для этой цели используется процедура UpdateInput - внутри которой проверяется какие клавиши или действия мышью были использованы пользователем и в ответ на это вызываются соответствующие процедуры, функции или методы которые привязаны к конкретной клавише или действию мышью. Подробнее об этом можно узнать получив полный исходный код движка Fle, на котором написана игра Веселый Буквоежка. Также будут не бесполезны иструменты разработки на движке Fle - SceneEditor, описание механизма сборки локаций и утилита Coords2D.

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

Итак, двинемся по коду d3d9_skin_mesh дальше. После того как все предварительные действия в приложении осуществлены - это как я уже говорил, описано внутри процедуры InitialD3DAppSettings, вызываются поочередно процедуры void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext ) и void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext ). Внутри них и надо искать ответ на вопросы - как собственно работает d3d-приложение и каким образом это реализовано ?

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

В процедуре OnFrameRender формируется изображение игровой сцены - сначала выводятся элементы управления g_SettingsDlg, затем очищается backbuffer (невидимый экран, который как только будет подготовлен будет выведен на экран реальный - чтобы изображение не мерцало отображая как на нём рисуются элементы), задаются параметры для источника света и собственно происходит модель робота SCV - DrawFrame.

Резонные вопросы, которые возникают - где, как и каким образом загружается модель и как она затем отрисовывается ? Нужно добавить, что в приложении d3d9_skin_mesh, которое базируется на коде примера SkinnedMesh из DirectX SDK Aug 2008, реализовано отображение не только статичных, но и анимированных моделей. Так что если загрузить модель, в которой есть скелетная анимация - то модель будет выводиться в движении - циклично воспроизводя имеющуюся в ней анимационную цепочку.

Код, который воспроизводит анимацию - достаточно объёмный и Вы его можете посмотреть сами скачав архив по ссылке выше. Традиционно Мы остановимся только на самых важных деталях.

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

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

В цикле наших уроков Мы постараемся остановиться на следующих вопросах:

- работа с 3d-камерой;
- перемещение модели в пространстве;
- реализация управления игрой от клавиатуры и мыши;
- создание игровых панелей и реализация простейших операций по управлению игрой через игровую панель;
- создание рельефа земной поверхности и его текстурирование;
- вывод рельефа в игре и перемещение по нему моделей;
- модели игровых ресурсов: минералы, гейзер веспен-газа;
- не-интерактивные игровые объекты, формирующие окружающую среду: деревья, кусты, камни и прочее.
- постройка нового коммандного центра в игре рабочим scv;
- добыча ресурсов рабочими роботами scv;
- создание фоновой музыки и сопутствующих игровых звуков;
- создание редактора игровой сцены;

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

В следующем уроке мы займёмся изучением управления игрой от Direct Input и работой с 3d-камерой в d3d9-приложении работа с 3d-камерой в d3d9-приложении

[все уроки game craft]  [моделируем scv]  [Моделируем робота SCV шаг 1 часть 2]  [Моделируем робота SCV шаг 2 часть 3]  [Прорисовка текстуры робота SCV шаг 5]  [экспорт робота scv в формат x] 

подробнее


[к содержанию] [другие статьи Тимонина Андрея]

States. Создаем менеджер состояний игры.

автор: Тимонин Андрей

дата публикации на сайте Мега Информатик: 18.11.2012

Добро пожаловать в цикл моих уроков посвященных программированию.

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


Что такое состояние? Это некое действие, которое выполняет объект в данный момент времени. Например,  если взять автомобиль, то его состояния могут быть такими как: движение вперед, движение назад, нейтральное положение,  когда двигатель заглушен и автомобиль неподвижен.
Если брать коробку передач, то каждая передача  - по сути, тоже определенное состояние.  

Таким образом, каждый у каждого объекта существует некоторый набор состояний,  в которых он  может находиться.  И при определенных обстоятельствах может переходить в то или  иное состояние.   В языке UML существует диаграмма состояний объекта, которая графически показывает его начальное состояние,   условия перехода между состояниями, действия выполняемые при выходе  из состояния, входе в новое состояния. Смотрим пример такой диаграммы. По сути - это алгоритм работы некой игры.

диаграмма состояний

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

Вот такое введение получилось. А теперь перейдем к основной теме статьи, а именно - менеджер состояний.

Итак, состояние это некий объект, который должен иметь, как минимум, функцию входа, которую он выполняет при входе, и функцию выхода.

Обобщим состояния в такой абстрактный класс.

class State
{
public:
//вход
virtual void enter()=0;


//вызываем при паузе
virtual void pause()=0;

//восстановление
virtual void resume()=0//выход
virtual void exit()=0;

//функции отрисовки и обновления
virtual void render()=0;
virtual void framemove(CPoint _point, MouseState _mouseState)=0;
};

Но так как имеем абстрактный класс, сделаем ему конкретные, чтобы можно было создавать объекты.

Конкретные состояния будут такие: PlayState, AboutState, MenuState.

class PlayState: public State
{
.....
PlayState();

public:
void render(); // что хотите то и отрисовывайте( игра ваша:) )
void framemove(CPoint _point , MouseState _mouseState); // обновление в состоянии игры
//для обращения к объекту
static PlayState* getInstance() { return &mPlayState; }

void enter(); // операции для входа в стейт(загрузка уровня)
void exit(); // операции по выходу из стейта(выгрузка ненужных объектов)

void pause(); // пауза
void resume(); //возврат из паузы
private:
static PlayState mPlayState;
};

class AboutState: public State // состояние о программе( пишите о себе)
{

....
public:

void render(); // текст и картинки себя любимого :)
void framemove(CPoint _point , MouseState _mouseState);
//для обращения к объекту
static AboutState* getInstance() { return &mAboutState; }

void enter();
void exit();

void pause();
void resume();
private:
static AboutState mAboutState;

};

class MenuState: public State // состояние показа меню
{
...

public:

void enter(); // вход в меню
void exit(); //выход из состояния меню

void pause();
void resume();

void render(); // рисуем кнопки меню
void framemove(CPoint _point , MouseState _mouseState);
private:
static MenuState mMenuState;

};

Вот такие классы. Конкретные реализации придумывайте сами!!! это зависит только от вас и вашей фантазии.

А теперь самое интересное. Как этим добром будем управлять. Напишем класс менеджер.

#include <vector>
#include <iostream>

#include "States.h"

PlayState PlayState::mPlayState;
AboutState AboutState::mAboutState;
MenuState MenuState::mMenuState;

class StateManager: public singleton<StateManager>
{
std::vector<State*> mStates;
friend singleton<StateManager>;


protected:
StateManager(){}

public:

void render()
{

//вызываем рендер текущего состояния
mStates.back()->render();
}

void framemove(CPoint _point, MouseState _mouseState)
{

//вызываем обработчик кадров текущего состояния
mStates.back()->framemove(_point,_mouseState);
}

//смена состояния
void changeState(State* state);

//пауза
void pushState(State* state);

//возврат к предыдущему состоянию
void popState();

};

Вот такой менеджер используем стандартный vector библиотеки STL и наш класс singleton, описанный в статье Обеспечиваем доступ к объекту из любой точки программы. Singleton .

Смотрим реализацию менеджера.

void StateManager::changeState(State* state) //смена состояния
{
// выход из текущего стейта
if ( !mStates.empty() ) {
mStates.back()->exit();


mStates.pop_back();
}

// иниуиализация нового стейта
mStates.push_back(state);
mStates.back()->enter();
}

void StateManager::pushState(State* state) //установка на паузу
{
// ставим на паузу текущий стейт
if ( !mStates.empty() ) {
mStates.back()->pause();
}

// иниуиализация нового стейта
mStates.push_back(state);
mStates.back()->enter();
}

void StateManager::popState() // возврат с паузы
{
// виход из текущего стейта
if ( !mStates.empty() ) {
mStates.back()->exit();
mStates.pop_back();
}

// возобновляем предидущий
if ( !mStates.empty() ) {
mStates.back()->resume();
}
}

А теперь как это использовать. Смотрим пример.

//где необходимо вызываем

StateManager::get().pushState(PlayState::getInstance());

Вот такие пляски с бубном вокруг статических объектов. Надеюсь, эта информация была вам интересна.
C уважением, Андрей.

[к содержанию] [другие статьи Тимонина Андрея]

Разработка flash-приложения для сайта: онлайн примерочная



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

Сайты построенные на php не обладают такой степенью интерактивности, какая свойственна настольным приложениям. Конечно если использовать php вкупе с технологией ajax, то можно добиться интерактивности, и всё-таки она будет во многом зависимой от внешних неконтролируемых факторов:

- скорости исполнения скриптов, т. е. от оптимальности алгоритмов;

- характеристик сервера на котором размещен сайт и его загруженности;

В противовес этому приложения, выполняемые на стороне пользователя, такие как swf-flash объекты лишены всех этих недостатков.

Основная цель, которую я ставлю перед собой: научиться писать flash-приложения.

Флеш-приложение должно уметь выполнять какие-то действия, присущие настольным и самое главное - иметь высокую степень отклика.

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

Например у вас есть сайт магазина одежды и вы хотели бы на нём иметь модуль онлайн-примерочной.

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

Также чуть ниже будет кнопка КУПИТЬ при нажатии на которую должен происходить переход на страницу сайта с передачей параметра - цвет платья.

Таким образом flash-приложение ОНЛАЙН-ПРИМЕРОЧНАЯ должна выглядеть примерно так -

онлайн-примерочная

Для начала поставим такую задачу: нам нужно создать объект КНОПКА при нажатии на которую будет происходить какое-либо действие, например будет появляться на экране текст.

Как оказалось, сначала нужно изучить некоторые основы.

Используя среду FlashDevelop 4.3 создадим новый проект AS3 и в модуле Main.as запишем такой код -

package { import flash.display.Sprite;
import flash.events.Event;

/**
* ...
* @author megainformatic
*/
public class Main extends Sprite
{

public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);

ExampleApplication();
}

private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
}

public function ExampleApplication():void {
//graphics.lineStyle(1, int(Math.random() * 100000), 1);
for ( var i:int = 0; i < 100; i++ )
{
graphics.lineStyle(1, (int)(Math.random() * 0xffffff), 1);
graphics.lineTo(Math.random() * 600, Math.random() * 600);
//trace(int(Math.random() * 0xffffff));
}
}

}

}



Код, который помечен коричневым - сгенерировала среда Flash Develop автоматически, зеленый код - который нужно добавить.

Приложение самое простейшее - оно выводит случайным образом 100 линий разного цвета.

Вопросы, которые были разрешены:

1) Как создать проект AS3 во Flash Develop

2) Как привести тип цвета, который задается как значение от 0x000000 до 0xffffff (от черного до белого), т. е. как HEXADECIMAL - шестнадцатиричный, к нужному - INT - целое.

Для этого

graphics.lineStyle(1, int(Math.random() * 0xffffff), 1); Т. е. вызываем функцию определения стиля для линии из модуля graphics, функция lineStyle.

Вызываем функцию random, чтобы получить случайное число в диапазоне от 0 до 1 (число float - т. е. с плавающей точкой, например 0.26353)

Умножаем полученное значение на 0xffffff, что гарантированно даст нам значение в нужном диапазоне ( от 0x000000 до 0xffffff ), однако число остается не целым, поэтому заключительный шаг - int(Math.random() * 0xffffff), т. е. приводим полученное значение к типу INT - целое.

3) Как выводить значения переменных на экран в режиме отладки ?

Для этого режим сборки вашего приложения должен быть DEBUG, запускаете приложение из среды Flash Develop, а в нужных местах кода вызываете функцию trace с указанием нужной переменной - trace(int(Math.random() * 0xffffff));

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

Не забудьте убрать // - знак комментария - иначе данный код просто игнорируется.

4) Почему в одном случае цвет линии остается без изменений, а в другом меняется ?

В коде вы можете увидеть две почти одинаковых строчки -

//graphics.lineStyle(1, int(Math.random() * 100000), 1);

и

graphics.lineStyle(1, (int)(Math.random() * 0xffffff), 1);

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

Ответ прост - если функция вызывается до начала цикла FOR, ( for ( var i:int = 0; i < 100; i++ ) ), то она вызывается лишь 1 раз и цвет линии останется без изменений.

Во-втором случае цвет линий каждый раз меняется в цикле.

В завершение мне осталось продемонстрировать как работает данное flash-приложение -



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

Советую поэкспериментировать - например как вывести не 100, а больше линий ?

Как изменить длину выводимых линий ?

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

Надеюсь вам был полезен данный урок.

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

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

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



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


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