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


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

megainformatic - МОДЕЛИРОВАНИЕ НА УРОВНЕ МНОГОУГОЛЬНИКОВ
             
подробнее...

Теги создание сайтов, создание игр, дизайн, игры, информатика, уроки photshop, php, c++, музыка, delphi, cms, робосайт
Статьи сайта
megainformatic - Мастер-класс: Создание модели и текстуры Коммандного Центра (как в StarCraft 2) Часть 6

Система управления сайтом - megainformatic cms e-shop

Система управления сайтом - megainformatic cms e-shop

Система управления сайтом - megainformatic cms e-shop

megainformatic - Уроки 3ds max - Введение в 3ds max

megainformatic - ГАЛЕРЕЯ 3D-моделей

megainformatic - СОЗДАНИЕ МАКЕТА ПОМЕЩЕНИЯ

megainformatic - Создание макета помещения - этап 2

megainformatic - МОДЕЛИРОВАНИЕ НА УРОВНЕ МНОГОУГОЛЬНИКОВ

megainformatic - СОЗДАНИЕ ПРЕДМЕТОВ ОБСТАНОВКИ ПОМЕЩЕНИЯ

megainformatic - Моделирование обстановки помещения

megainformatic - Создание модели автомобиля

megainformatic - Создание текстурной развертки для модели автомобиля

megainformatic - Создание анимации вращающихся колес автомобиля

megainformatic - игра Нечто: Необъяснимое и в плену желаний

megainformatic - Основы 3D-анимации, экспорт скелетной анимации

megainformatic - Подготовка модели к использованию скелетной анимации

megainformatic - Продолжаем Создание скелета для данной модели

megainformatic - Построение ирерархических связей между объектами и основы 3d анимирования

megainformatic - Особенности экспорта моделей и анимации экспортером kWXPort080719 из 3ds max 2009 

megainformatic - Создание модели броневика (Хэд)

megainformatic cms e-mailer

megainformatic cms e-mailer

megainformatic cms e-mailer

Бесплатная Система Управления Вашим Сайтом - megainformatic cms free

megainformatic - Путешествие в мир 3d

megainformatic - Путешествие в мир 3d - страница 2

megainformatic - Путешествие в мир 3d - страница 3

megainformatic - Путешествие в мир 3d - страница 4

megainformatic - Путешествие в мир 3d - страница 5

megainformatic - Путешествие в мир 3d - страница 6

megainformatic - Создание модели броневика (Хэд) - Анимация вращения колес

megainformatic cms express files

megainformatic cms express files

megainformatic cms express files

megainformatic - Уроки Photoshop - Чудеса

megainformatic cms express files - Развертывание сайта на Вашем хостинге

megainformatic - Настольная игра "Веселый Буквоежка"

megainformatic - Уроки delphi directx 8.1

megainformatic - Уроки delphi directx 8.1 - Урок 1 - Введение в Delphi DirectX 8.1. Создание шаблона стартового приложения.

megainformatic - Уроки delphi directx 8.1 - Урок 1 - Введение в Delphi DirectX 8.1. Создание шаблона стартового приложения. Страница 2

megainformatic - Урок 2 Создаем и обрабатываем команды меню.

megainformatic - Урок 2 Создаем и обрабатываем команды меню. Страница 2

megainformatic - Урок 3 Оконный и полноэкранный режимы работы D3D-приложения. Управление игрой средствами DirectInput8

megainformatic - Урок 3 Оконный и полноэкранный режимы работы D3D-приложения. Управление игрой средствами DirectInput8 - Страница 2

megainformatic - Урок 3 Оконный и полноэкранный режимы работы D3D-приложения. Управление игрой средствами DirectInput8 - Страница 3

megainformatic - Урок 4 Построение класса приложения

megainformatic - Урок 4 Построение класса приложения - Страница 2

megainformatic - Урок 5 Построение классов игровых объектов и других необходимых классов

megainformatic - Урок 5 Построение классов игровых объектов и других необходимых классов - Страница 2

megainformatic - Урок 6 Игровая логика

megainformatic - Заметки по joomla - JFolder::create: Path not in open_basedir paths. Что это?

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

megainformatic - Урок 7 2D-анимация

megainformatic - Урок 8 Загрузка/Сохранение текущей игры, режим паузы, режимы часов/будильника, запуск браузера Internet Explorer для показа сайта разработчика и других интернет-ресурсов

megainformatic - Урок 9 Тестирование и отладка приложения

подробнее


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

Таймер. Выводим время игры.

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

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

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

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


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

В этой статье мы коснемся, непосредственно, вывода этого времени на игровой экран. А будет у нас оно формироваться в строковом формате, например таком, как на скриншоте.

Время измеряется в часах, минутах, секундах, миллисекундах. Для нас интересны сейчас часы, минуты и секунды, составляющие формата.

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

Графическую составляющую панели со временем я не рассматриваю. Это тема для другой статьи.

Итак, приступим к делу... Напишем класс, который имеет следующие возможности:

1) показывать текущее время;

2) сбрасывать в 0 время игры;

3) определять сколь времени прошло;

4) устанавливать счетчику время старта.

У меня получился такой интерфейс класса, который я назвал СTimerPanel

class СTimePanel
{
//мой класс для вывода текста
CStaticText* text;
public:
СTimePanel ();
~СTimePanel();
//сброс счетчика
void reset();

//возвращает время со старта
time_t getTime() const;

//устанавливает время старта
void setTime(time_t st);

//отрисовка

bool render();
private:

//закрытая переменная времени старта
time_t time_st;

};

Здесь мы используем время стандартной библиотеки time.

Посмотрим на мою реализацию класса

СTimePanel::СTimePanel()
{
//некий класс для вывода текста
text = new CStaticText(L"Time",L"Data/panel.png",208,57,CPoint(+128,-280));
//берем системное время
time(&time_st);

}

//вычисляем текущее время
time_t СTimePanel::getTime() const
{
time_t ctTime;
//берем системное время
time(&ctTime);
ctTime = ctTime - time_st;
return ctTime;
}

//устанавливаем время
void СTimePanel::setTime(time_t st)
{
time_t ctTime;
//берем системное время
time(&ctTime);
time_st = ctTime - st;

}

СTimePanel::~СTimePanel()
{
if( text )
{
delete text;
}
}
//сброс счетчика
void СTimePanel::reset()
{
//берем системное время
time(&time_st);
}

bool СTimePanel::render()
{
if( text )
{
struct tm *pTime;
time_t ctTime;
//берем системное время
time(&ctTime);
ctTime = ctTime - time_st;
//получим на указатель на структуру времени
//pTime = localtime( &ctTime );

//преобразуем время в часы, минуты, секунды
pTime = gmtime(&ctTime );
if (!pTime) return false;

//выведем в строку ширина 2 позиции заполнитель 0
std::ostringstream stime;
stime << std::setw(2) << std::setfill('0') << pTime->tm_hour
<< ":" << std::setw(2) << std::setfill('0') << pTime->tm_min
<< ":" << std::setw(2) << std::setfill('0') << pTime->tm_sec
<< std::endl;

text->SetText(stime.str());

//рисуем
text->Draw();
}
return true;
}

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

#include <time.h>

Для его определения я опираюсь на локальное время компьютера, которое определяется функцией

time_t ctTime;
//берем системное время
time(&ctTime);

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

Чтобы вывести время, мы преобразуем его к структуре tm, для более удобного использования в строковом потоке.

Функция gmtime преобразует наше время с учетом GMT (часового пояса).

 

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

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

подробнее

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

Анимации во флеш посвящены целые тонны статей, видеоуроков и прочих материалов, которые Вы легко найдете в сети.

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

Короче говоря я решил еще раз разложить по-полочкам САМЫЕ ОСНОВЫ флеш анимации - т. е. БАЗОВЫЙ СКЕЛЕТ, который объяснит любому желающему на простом примере ЧТО ТАКОЕ ФЛЕШ АНИМАЦИЯ и поможет сделать ПЕРВЫЙ ПРАКТИЧЕСКИЙ ШАГ в её освоении и более глубоком понимании.

Другие статьи на эту тему

Для работы вам понадобится любая среда для работы с флеш, например Adobe Flash CS5 или выше.

Что мы изучим в данном уроке ?

Что такое графические ресурсы и для чего они нужны ?

Что такое графические символы во flash ?

Для чего нужны слои ?

Что собой представляет анимация и как она создается ?

Как просмотреть полученную анимацию ?

Как сохранить созданную анимацию в формате swf чтобы использовать на сайте ?

Код для вставки анимированного swf файла для вывода на любой страничке любого сайта



Все эти вопросы так или иначе волнуют любого начинающего, который хочет изучить ОСНОВЫ flash анимации.

Для кого-то эти вопросы достаточно просты и легки в понимании, особенно если есть предыдущий опыт общения с любыми другими программами, например Adobe Photoshop, Corel Draw и прочими.

Увы, я на своём личном опыте убедился в том, насколько бывает сложно вникнуть в суть некоторых статей или уроков, т. к. во многих из них НЕТ СИСТЕМНОГО ПОДХОДА. Т. е. материал часто просто-напросто "свален в кучу" и мало того, САМЫЕ ВАЖНЫЕ КЛЮЧЕВЫЕ МОМЕНТЫ упущены из виду. Поэтому читая такую статью или изучая видеоурок пытаешься, но так и не можешь достичь желаемого.

Я надеюсь, что данная статья всё-таки прольёт свет на САМЫЕ КЛЮЧЕВЫЕ ОСНОВЫ в СОЗДАНИИ flash анимированных swf-роликов (в том числе баннеров, анимаций для игр и другого применения).

Итак, приступим.

После того как запустили Flash CS5 выбираем пункт главного меню ФАЙЛ > Создать > Action Script 2.0

Сразу же может возникнуть вопрос: ПОЧЕМУ ИМЕННО Action Script 2 ?

Ответ прост - Action script 2 поддерживается большим количеством более старых и более распространенных плагинов для проигрывания swf в браузере клиента.

Хотя конечно это не факт - жизнь не стоит на месте и вполне может быть, что на компьютере конечного пользователя будет поддержка и для Action Script 3. Но как вы сами понимаете - Action script 2 несмотря на свою более старую версию имеет главное преимущество - он скорее всего будет работать ВЕЗДЕ ! А вот для Action Script 3 пользователю вполне может понадобиться ОБНОВИТЬ плагин в браузере или на том гаджете, в котором он просматривает flash.

Я надеюсь вы поняли мой ответ :)))

Идём дальше.

Симпатичная девушка Светлана. Телец, 24 года. Больше никакой информации. Света - если Вы случайно увидите эти фото здесь - просьба написать и/или оставить свои контакты.




подробнее

Советы копирайтеру - как не обмануть и не быть обманутым.



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

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

Первое простое правило - никогда не выдавайте чужих текстов за свои и не выставляйте их в портфолио.

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

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

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

Да да, всё так просто.

Заказчик уже не сможет скопировать текст из картинки, а набирать его вручную, понятно, не будет.

Однако он может взять программу распознавания текстов - и попробовать распознать текст на картинке.

Но даже в этом случае есть способ как защититься.

Кратко покажу как это делается.

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

Копируем части текста, которые мы хотели бы показать заказчику.

Вставляем в Photoshop.

вставляем текст в изображение

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

Это делается тоже достаточно просто.

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

делаем буквы прозрачными и лишь обведенными по контуру

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

защищенный от распознавания текст

Да, такой текст уже даже человек поймёт с трудом, что уж говорить о программе.

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

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

Успехов вам !

подробнее

Creating game on fle game engine - Simple game / Создание игры на fle game engine - Simple game

10 - Проверка столкновений



read paper in english

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





Содержание

страница 1 - Спрайты

страница 2 - Объекты

страница 3 - Наложение объектов

страница 4 - Код - Настройка параметров Scene Editor fge и написание кода для вывода спрайта шарика в вашем первом игровом приложении

страница 5 - Отображаем прыгающий шарик

страница 6 - Загрузка игровой сцены

страница 7 - Перемещения игровой сцены

страница 8 - Закрываем часть сцены от пустот при помощи черной текстуры с прорезью, ограничиваем перемещение сцены

страница 9 - Реализуем корректное попадание в ямы и около ям - определяем границы спрайтов ям и спрайта прыгаюшего шарика

страница 10 - Проверка столкновений

страница 11 - Игровой счёт, звуки, музыка

урок #2 страница 1 - Создание новых сцен для игры simple game, расширенная версия simple game extended

13. Скроллинг больших локаций

14. использование переменных в игре на c++ directx 9c

15. Мульти анимация







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

Создадим файл для определений границ

simple_game\Media\prop_desc\collision_rects_desc.txt



И определим границы -

ball; 0.0f; -0.07f; 0.08f; -0.16f; 0.5f;
hole; 0.138510f; -0.144f; 0.1f; -0.085f; 1.0f;


1 значение - это имя игрового объекта, следующие 4 параметра - его границы - левая верхняя точка - x и y, и правая нижняя - также.
Последнее значение - это масштабный коэффициент - он учитывается при вычислении границ.

Теперь создадим файл для описания свойств - для установки связи между объектами границ и игровыми объектами

simple_game\Media\prop_desc\game_object_class_properies.txt



Запишем туда -

//
// описание свойств шарика
//
begin =;
Name = ball;
Collided = true;
end =;
//
// описание свойств ямы
//
begin =;
Name = hole;
Collided = true;
end =;


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

Свойство Collided = true - означает что будет использоваться проверка коллизий или по-другому столкновений, для данного игрового объекта. Значение может быть установлено и в false. Но в контексте данного урока нам для обоих объектов нужна проверка столкновений.

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

В нашем случае будет задано несколько иное поведение: шарик может пройти сквозь яму. Будет лишь фиксироваться сам факт попадания в яму и больше ничего.

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



Для реализации проверки столкновений прыгающего шарика с ямами нужно выполнить следующие действия:

В модуль

start.cpp



Подключить заголовочные файлы collision.h и game_object_properties.h -

после строки

#include "textures.h"



добавить -

#include "game_object_properties.h"
#include "collision.h"





после строки

#define SimpleGameScenesPath L"\\Media\\textures\\environment\\scenes\\simple_game\\"



добавить -

//==========================================
//
// имена файлов описаний свойств игровых объектов
// и границ для столкновений
//
//==========================================

#define GameObjectPropertyValue L"\\Media\\prop_desc\\game_object_class_properies.txt"

//индексы игровых объектов, имеющих свойства в файле свойств
#define ball_prop 0
#define hole_prop 1


Для перемещений прыгающего шарика и проверки столкновений и их обработки добавить в

start.h



После строки -

D3DXVECTOR2 m_scrCursorPos;



такой код -

//перемещения прыгающего шарика
void MoveJumpedBall();
float m_fCurrentTimer;
float m_fTimeDelay;
float m_fMoveSpeed;

D3DXVECTOR2 m_v2MoveDirs;
void ChangeMoveDirs(int Dir);

void JumpedBallContactHole();

bool m_bContactWithHoleDetected;
float m_fHoleX;
float m_fHoleY;

bool change_moved_ball_TimePause(float PauseInterval = 0.0f);
void change_moved_ball_ResetPauseTimer();
DWORD change_moved_ball_m_dwOldTime;
DWORD change_moved_ball_m_dwTime;
float change_moved_ball_m_fTimePeriod;

//переопределенная сцена и её методы

//скрываем все плашки ям (их переднюю часть)
void CreateOverridedGameScene();

CPtrArray* m_pOverridedGameScene; //массив объектов видоизмененной игровой сцены
void FreeOverridedGameScene();

//скрытие/показ указателя мыши
void HideSystemMouseCursorView(bool Hide);

//счёт попаданий в яму
int m_iHoleHits;
bool m_bInHole;

//сброс попадания в яму
bool hole_hit_TimePause(float PauseInterval = 0.0f);
void hole_hit_ResetPauseTimer();
DWORD hole_hit_m_dwOldTime;
DWORD hole_hit_m_dwTime;
float hole_hit_m_fTimePeriod;



В модуль

start.cpp



1)

Добавляем

В метод
CD3DGameApp::FrameMove



после строки

g_Splash.Anim();

код -

MoveJumpedBall();

В конец модуля

start.cpp



добавляем код -

//перемещения прыгающего шарика
void CD3DGameApp::MoveJumpedBall()
{
g_AI_Ball_Sprite.Anim();

change_moved_ball_TimePause(m_fTimeDelay);
hole_hit_TimePause(2.0f);
//проверяем контакт шарика с ямой
JumpedBallContactHole();
}


Реализацию остальных методов и их использование Вы можете посмотреть сами в коде модуля
start.cpp



Отмечу лишь, что для проверки столкновения шарика с границами ямы используется вызов функции CollisionDetected, которая проверяет пересекаются ли границы объекта ball с границами объекта hole и если да - то возвращается значение true.



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





Скачать готовую игру simple game версия 1.0.0 4.01.2017 (без исходного кода).

Исходный код и другие полезные материалы и инструменты Вы получаете при оформлении платной подписки !


Размер: 51,8 Mb



новый современный движок для создания игр на платформе Windows Directx 9c - которая поддерживается большинством ПК.

Подробнее об оформлении подписки на fle game engine





Скачать fle game engine (полный исходный код).

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


Размер: 482 Mb



Контрольные суммы для проверки целостности скачанного архива.

CRC32: 9626C289
MD5: 7537172124F59B49431DA3CE0EE70B97
SHA-1: 951A654AFA932AAD706C090B5A37F37DD53E5920

Контрольные суммы можно проверить утилитой HashTab

После скачивания вы получите самораспаковывающийся архив. Запустите его, чтобы распаковать.

Система написана на c++ под directx 9.

Требования - наличие установленных MSVS 2005 (Microsoft Visual Studio) и DirectX SDK Aug 2008.

Для других версий MSVS и DirectX SDK могут потребоваться модификации кода !

Что включает дистрибутив ?

- Редактор сцен Scene Editor;

- пример игры simple game с полным исходным кодом;

- пошаговое описание создания примера игры simple_game - представляет набор html файлов пригодных для открытия и чтения из любого браузера;

- Coords 2D - утилиту отладки анимаций и подбора экранных координат содержит богатую библиотеку готовых примеров игровых спрайтов;

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

- fgg_setup.exe Fly snow 3d - визуальные эффекты падающего снега/дождя и др. красивые эффекты с частицами в 2d/3d;

Скачав дистрибутив fle game engine вы можете приступить к созданию своей игры прямо сейчас !

Чтобы иметь возможность самостоятельно создать свою игру на базе примера simple_game с неограниченными возможностями дальнейшего расширения! - оформите подписку на fle game engine -


Стоимость: 600 руб.

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

Самую свежую версию Scene Editor fge 1.0.2 (на текущий момент) с поддержкой большего количества возможностей: сетка, настройки, скроллинг и другие. В бесплатной версии эти возможности не поддерживаются. подробнее о составе платной подписки.





[назад] [далее]



     
 
Урок 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,3711