6 - Загрузка игровой сцены
read paper in english
Пришло время перейти к самому главному и интересному вопросу - загрузке и отображению созданной вами в Scene Editor fge игровой сцены.
Содержание
страница 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. Мульти анимация
С прыгающим шариком пока всё ясно. Оставим его ненадолго. Теперь пришло время загрузить нашу игровую сцену.
1) Нам нужно загрузить созданную сцену в наше приложение и показать на экране.
Игровая сцена, уровень или комната - это основа любой игры, даже если на экране ничего нет - игровая сцена так или иначе присутствует.
Прежде нужно подготовить все файлы ресурсов игровой сцены, как это было описано на странице 2 - Объекты
Уберем все неиспользуемые типы, объекты и изображения - оставим только
simple_game\SceneEditor\Media\textures\environment\desc\scene_editor_types.txt
none; 0;
ai_player; 1;
floor; 2;
test; 3;
simple_game\SceneEditor\Media\textures\environment\desc\scene_editor_texlist.txt
ball; ai_player; ai_player\jump.tga; 64; 128; 0; 0; 4; 8.0f; 14.0f;
floor; floor; floor\floor.jpg; 101; 101; 0; 0; 1; 0.0f; 0.0f;
floor_front; floor; floor\floor_front2.tga; 101; 101; 0; 0; 1; 0.0f; 0.0f;
floor2; floor; floor\floor2.jpg; 101; 101; 0; 0; 1; 0.0f; 0.0f;
Следует иметь в виду, что если Вы меняете файлы типов и ресурсов, то созданные с их использованием файлы сцен уже работать не будут !
Поэтому нужно реализовать новую сцену с новой сборкой прописанных ресурсов - просто повторив уже ранее проделанное на странице 3 - Наложение объектов
Теперь берем всю папку
simple_game\SceneEditor\Media\textures\environment\
и переносим её в папку ресурсов нашей игры
simple_game
simple_game\simple_game\Media\textures\
Папку
simple_game\SceneEditor\scenes\simple_game\
и файл созданной вами игровой сцены, у меня он назывался scene_3.SCN,
переносим в папку
simple_game\SceneEditor\Media\textures\environment\scenes\
Т. е. вот так
simple_game\SceneEditor\Media\textures\environment\scenes\simple_game\scene_1.SCN
Сцену я снова назвал scene_1.SCN, чтобы обозначить, что это будет самая первая (и пока единственная) игровая сцена в нашей игре
simple_game.
Файлы ресурсов сцены подготовлены, теперь разберемся как загрузить сцену в игру и отобразить.
Первое, что Вам потребуется - это модуль
GameSceneFile т. е. 2 файла -
GameSceneFile.h и
GameSceneFile.cpp которые нужно будет добавить в проект.
Далее в файл
start.h после строки
#include "d_input.h"
нужно добавить строку подключения заголовочного файла данного модуля -
#include "GameSceneFile.h"
Далее в класс нашего приложения
CD3DGameApp
После строчки
bool m_bShowScreenOptionsBtn;
добавляем новое поле -
CGameSceneDataFile* m_pGameSceneDataFile;
Это объект для управления нашей сценой. Все его методы описаны в модуле
GameSceneFile представленном, как Вы уже видели 2 файлами -
GameSceneFile.h и
GameSceneFile.cpp.
Файл
GameSceneFile.h - заголовочный - описывает заголовки функций, полей и методов, а файл
GameSceneFile.cpp описывает их реализацию на языке программирования c++.
Теперь нужно добавить в модуль нашего приложения
start.cpp следующие строки кода
1)
#include "game_sprite.h" //это строка после которой нужно добавить
#define SimpleGameLocation L"\\Media\\textures\\environment\\scenes\\simple_game\\scenes_list.txt" //это строка которую нужно добавить
#define SimpleGameScenesPath L"\\Media\\textures\\environment\\scenes\\simple_game\\" //это строка которую нужно добавить
Вам потребуется еще создать файл
scenes_list.txt в папке
simple_game\simple_game\Media\textures\environment\scenes\simple_game\
И поместить в него следующую запись -
scene_1.scn
И больше ничего, никаких переводов строки и пустых строк !!
Далее, там же, в модуле нашего приложения
start.cpp
2)
В методе -
CD3DGameApp::CD3DGameApp
CD3DGameApp::CD3DGameApp()
{
//...
m_pSprite = NULL;
} //это строка после которой нужно добавить
//это строки которые нужно добавить
void CD3DGameApp::LoadGameScene()
{
//создание игровой сцены
m_pGameSceneDataFile = new CGameSceneDataFile();
m_pGameSceneDataFile->PreLoadGameTextures();
m_pGameSceneDataFile->LoadLocation(SimpleGameLocation, SimpleGameScenesPath);
//получение границ локации
ScrollGameSceneLeftLimit = -m_pGameSceneDataFile->m_fLocationHScrollLimit;
ScrollGameSceneRightLimit = m_pGameSceneDataFile->m_fLocationHScrollLimit;
//выставление границ локации, доступных из других модулей
g_fScrollGameSceneLeftLimit = ScrollGameSceneLeftLimit;
g_fScrollGameSceneRightLimit = ScrollGameSceneRightLimit;
//загрузка свойств объектов, границ
//LoadGameObjProperties(GameObjectPropertyValue); //поскольку закомментировано, то здесь пока не используется
}
Этот же метод нужно добавить в
start.h
в описание класса
class CD3DGameApp
после строки
bool m_bShowScreenOptionsBtn;
добавим -
//игровая сцена
CGameSceneDataFile* m_pGameSceneDataFile;
void LoadGameScene();
//void AfterLoadRestoreLocTextures(); //закомментировано, т. к. пока не требуется
void MovePlayer(int NewMoveState);
void ScrollGameScene();
int m_iOldCurrSceneNum;
int m_iOldCurrSceneInx;
D3DXVECTOR3 m_vFleHeroPos;
void SetHeroLocationPos(DWORD CurrMoveState, LPD3DXVECTOR2 p_v2Pos,
float LocationXOffset);
void AnimGameProcess();
void DrawGameProcess();
bool CanEnterScene();
void LoadGameDataBlock();
}; //вышеуказанные строки надо добавить, а данная уже должна быть - служит для закрытия описания класса CD3DGameApp
Теперь снова возвращаемся к коду модуля
start.cpp и добавляем туда
в метод
CD3DGameApp::CreateDeviceObjects
После строки -
g_Snow.Load();
строки -
LoadGameScene();
LoadGameSceneTextures(m_pGameSceneDataFile->m_pTexArray,
EnvironmentTexturesPath, TextureFilesList, m_pGameSceneDataFile->m_pSprite);
в методе
CD3DGameApp::RestoreDisplayObjects
добавляем
if ( m_pGameSceneDataFile )
m_pGameSceneDataFile->RestoreGameSceneObjects();
в методе
CD3DGameApp::InvalidateDisplayObjects
добавляем
if ( m_pGameSceneDataFile )
m_pGameSceneDataFile->InvalidateGameSceneObjects();
в методе
CD3DGameApp::DestroyDisplayObjects
добавляем
m_pGameSceneDataFile->FreeGameTextures();
SAFE_DELETE(m_pGameSceneDataFile);
в любом месте, но удобнее в самом конце файла, добавляем -
void CD3DGameApp::MovePlayer(int NewMoveState)
{
/*
Если сцена закрыта - запрет движения
*/
m_pGameSceneDataFile->m_fHeroXPosInLocation = g_fHorizontalScrollOffset;
m_pGameSceneDataFile->CalcCurrentSceneNumber();
//if ( !CanEnterScene() )
//{
//x_step = 0.0f;
//}
}
//=============================================
//
// Скроллинг игровой сцены
//
//=============================================
void CD3DGameApp::ScrollGameScene()
{
//перед выполнением прокрутки локации запоминаем номер текущей сцены,
if ( m_iOldCurrSceneInx != m_pGameSceneDataFile->m_iCurrentSceneIndex )
{
m_iOldCurrSceneInx = m_pGameSceneDataFile->m_iCurrentSceneIndex;
m_iOldCurrSceneNum = m_pGameSceneDataFile->m_iCurrentSceneNumber;
g_iCurrentSceneNumber = m_pGameSceneDataFile->m_iCurrentSceneNumber;
}
m_pGameSceneDataFile->ScrollLocation( &D3DXVECTOR2(
g_fHorizontalScrollOffset + m_vFleHeroPos.x,
g_fVerticalScrollOffset ), g_fHorizontalScrollOffset);
}
//произвольное положение героя в локации
void CD3DGameApp::SetHeroLocationPos(DWORD CurrMoveState, LPD3DXVECTOR2 p_v2Pos,
float LocationXOffset)
{
m_vFleHeroPos = D3DXVECTOR3(p_v2Pos->x, p_v2Pos->y, 0.8f);
g_fHorizontalScrollOffset = LocationXOffset;
m_pGameSceneDataFile->m_SceneScrollPoint.x = g_fHorizontalScrollOffset;
ScrollGameScene();
}
void CD3DGameApp::AnimGameProcess()
{
m_pGameSceneDataFile->AnimateGameScene(g_fElapsedTime);
m_pGameSceneDataFile->AnimLocation();
MovePlayer(0);
}
void CD3DGameApp::DrawGameProcess()
{
m_pGameSceneDataFile->DrawGameSceneView();
m_pGameSceneDataFile->DrawLocation();
}
bool CD3DGameApp::CanEnterScene()
{
return true; //test
}
void CD3DGameApp::LoadGameDataBlock()
{
m_pGameSceneDataFile->m_SceneScrollPoint.x = g_fHorizontalScrollOffset;
if ( g_fHorizontalScrollOffset != 0.0f )
ScrollGameScene();
}
И наконец вызовы методов
AnimGameProcess();
и
DrawGameProcess();
Отвечающие за анимацию и отображение игровой сцены, нужно добавить в
метод
CD3DGameApp::FrameMove
g_AI_Ball_Sprite.Anim(); //это строка после которой надо добавить
AnimGameProcess();//это строка которую надо добавить
а в метод
CD3DGameApp::Render
case APPSTATE_READY: //это строка после которой надо добавить
DrawGameProcess();//это строка которую надо добавить
Сохраняем изменения, выполняем сборку проекта в MSVS 2005. Если всё ок, то при запуске приложения Вы увидите на экране
созданную Вами в Scene Editor fge игровую сцену и прыгающий в ней шарик.
Пример данной будущей игры с полным исходным кодом Вы можете получить в составе платной подписки на
fle game engine.
Пример также содержит исходный код для генерации снежинок или других частиц, переключения и отображения фонов и некоторые другие
интересные и полезные возможности, которые будут нами рассмотрены в последующих уроках.
Оформить подписку на
fle game engine -
Стоимость:
800
руб.
Тогда вы получите более свежую версию Scene Editor fge 1.0.2 (на текущий момент) с поддержкой большего количества возможностей: сетка, настройки, скроллинг и другие. В бесплатной версии эти возможности не поддерживаются.
подробнее о составе платной подписки.
Для корректной сборки проекта Вам потребуется
Microsoft Visual Studio 2005
DirectX SDK August 2008
https://www.microsoft.com/en-us/download/details.aspx?id=23549
Details
Version:
9.27.1734
File Name:
DXSDK_Aug09.exe
Date Published:
9/8/2009
File Size:
553.3 MB
Чтобы проект можно было корректно скомпилировать выполните следующие действия:
Откройте проект из MSVS 2005
в окне Solution Explorer кликните правой кнопкой по узлу start - обозначающему имя проекта
и выберите пункт меню
Properties
В открывшемся окне start Property Pages слева откройте узел
Configuration properties > C/C++ > General
затем справа в поле Additional Include Directories
вместо ..\..\..\..\..\..\..\Include
вам нужно прописать корректный путь к папке Include, входящей в состав DirectX SDK August 2008.
Т. е. нужно заменить часть строки ..\..\..\..\..\..\..\Include
на абсолютный путь -
например он может быть таким -
C:\DXSDK9_Aug2008\Include
или относительный -
например он может быть таким -
..\..\..\..\..\..\..\..\..\Include
Аналогичное действие Вы должны проделать для Debug сборки - выберите в поле Слева вверху Configuration вариант Debug.
На вопрос Do you want to save changes you've made in the property pages ?
Отвечайте утвердительно - Да или Yes.
Далее откройте слева узел
Configuration properties > Linker > General
и в поле
Additional Library Directories
измените значение
..\..\..\..\..\..\..\Lib\x86
на соответствующее вашему пути к установленному DXSDK9_Aug2008
здесь также по-аналогии, можно указать абсолютный
C:\DXSDK9_Aug2008\Lib\x86
или относительный - зависящий от того где на диске расположена папка проекта simple_game.
Например он может быть таким -
..\..\..\..\..\..\..\..\..\Lib\x86
Указанное действие нужно проделать и для Debug конфигурации проекта.
выберите в поле Слева вверху Configuration вариант Debug.
На вопрос Do you want to save changes you've made in the property pages ?
Отвечайте утвердительно - Да или Yes.
Если всё настроено правильно. Нажимаем ОК.
Далее в поле под главным меню выбираем вариант сборки проекта Debug или Release в панели инструментов
чуть правее от кнопки с зеленым треугольником - означающим запуск проекта из среды MSVS 2005 в режиме отладки.
Далее в главном меню выбираем пункт Build > Clean Solution - чтобы очистить все устаревшие объектные файлы.
Затем Build > Rebuild Solution.
Если всё было настроено правильно и в ходе компиляции вы не получили никаких сообщений об ошибках, то в папке
simple_game\simple_game\
вы найдете созданный файл start.exe, который можно запускать на выполнение.
[назад] [далее]