Как создать игру ? - Программируем сами. Рассмотрение программирования игр под DirectX 9c на C++ с использованием среды разработки MSVS 2005 или выше. |
||
[содержание] [назад] [страница 4] [далее] | ||
Введение в 2d-игры - создаем заставку для игры | ||
Итак, мы создали основу нашей будущей игры. Теперь займемся изучением принципов вывода и использования статичных и анимированных изображений из файлов jpg и tga на примере вывода титульной заставки игры. | ||
Помимо этого мы рассмотрим как создать класс приложения и все необходимые для работы дополнительные классы, в частности мы покажем объявление классов: CGameAppLoader CD3DGameApp и рассмотрим как применяется класс CD3D9Sprite для работы со спрайтами и статичными 2d-изображениями. |
||
Вы воочию увидите как создаются и применяются данные классы. | ||
Классы CGameAppLoader, CD3DGameApp объявляются в заголовочном файле Fle.h Класс CD3D9Sprite полностью реализован в модулях D3DGUI.h и D3DGUI.cpp и представляет класс для использования 2d-изображений и спрайтов в d3d-приложениях и играх, полностью его код Вы найдете в исходном коде, если закажете ПОЛНЫЙ ИСХОДНЫЙ КОД игры Веселый Единственный Буквоежка за 200 рублей. |
||
Здесь и далее мы рассмотрим код указанных классов только с точки зрения необходимых нам для решения задач данного урока возможностей, если Вы хотите увидеть их ПОЛНЫЙ ИСХОДНЫЙ КОД - закажите его. | ||
Параллельно мы коснемся основ использования DirectInput8, т. к. он на понадобится для управления нашей игрой. | ||
В модуле Fle.h в самом начале файла после строки - #include "resource.h" // main symbols набрать следующий код - #include
<d3d9.h> #include
"D3DGUI.h" #include "AdventureGame.h" #include "d3dfont.h" описать возможные состояния загрузчика - // загрузчик
LOADSTATE_BEGINMENU,
LOADSTATE_BEGINADVENTUREINTRO,
LOADSTATE_BEGINLOADADVENTUREGAME_LOCTEX,
LOADSTATE_BEGINLOADADVENTUREGAME_SUBJECTS_PLATES,
LOADSTATE_BEGINLOADADVENTUREGAME, }; и сам загрузчик - class
CGameAppLoader CPtrArray* m_pLoaderTexturesArray;
void Start(CPtrArray* TxArray, LPCTSTR TexFilesPath, LPCTSTR TexFilesListTxt); float m_fRotorAngle;
void LoadLoaderTextures();
CStdioFile* m_pTextFile;
//статистика загрузки
//смена загружаемых ресурсов
void Loading();
float m_fRotateProcessTimeCounter;
после строк - //название
приложения добавить строки - #define ParamDelimeter ';' #define
GAMEERR_NOINPUT 0x00000006
#define
LoaderFontFileName L"\\Media\\fonts\\BALTICA.TTF" #define
LoaderFont2DFileName L"\\Media\\fonts\\MSSansSerif.tga" #define
LoaderBackTexIndex 0 #define
RotateProcessTimeLimit 0.01f //ресурсы
стартовой сцены (логотип, заставка, начало) объявляем класс CD3DGameApp -
class
CD3DGameApp public: HWND m_hWndMain;
DWORD m_dwScreenWidth; // разрешения для полноэкранных
режимов
bool m_bIsActive; // активность приложения FLOAT fAspectRatio; BOOL m_bMouseVisible; // видимость указателя мыши
DWORD m_dwAppState; // текущее состояние приложения
// Объекты Direct3D LPD3DXSPRITE m_pSprite; bool m_bShowFPSOn; bool m_bPaused; float m_fElapsedTime;
HRESULT FrameMove(); CGameAppLoader* m_pLoader; //загрузчик игровых ресурсов public:
void ReadFileParam(const CString* ParamStr,
void LoadGameTextures(CPtrArray* TxArray, LPCTSTR TexFilesPath,
void Cleanup3DEnvironment();
HRESULT InvalidateDisplayObjects(); void CalcResolutionRescale(); //поля и методы стартовой сцены (логотип, название, начало) CStartLogo* m_pStartLogo; void LoadStartRes(); //поля и методы меню CGameMainMenu* m_pGameMenu; void LoadMenuRes(); //поля и методы игрового режима Приключение
CIntroComics* m_pIntroComics;
CAdventure* m_pAdventure;
// Объекты DirectInput UserInput m_UserInput; // структура для хранения ввода от пользователя
HRESULT InputAddDeviceCB( CInputDeviceManager::DeviceInfo* pDeviceInfo,
const DIDEVICEINSTANCE* pdidi );
HRESULT CreateSoundObjects(); void TestGlobalAppState(); }; __declspec(selectany) CD3DGameApp g_d3dApp; |
||
Я намеренно не привожу здесь все комментарии, многое Вам будет понятно исходя из дальнейшего изучения кода. Код приведенный выше мы частично реализуем, остальное при желании Вы найдете в ПОЛНОМ ИСХОДНОМ КОДЕ игры. | ||
Чтобы не пугать Вас обилием кода на данной странице отсылаю Вас к ПОЛНОМУ ИСХОДНОМУ КОДУ. Здесь мы рассмотрим как выводится 2d-изображение на экран. |
||
Вот фрагмент кода из метода void CStartLogo::DrawIntroStoryBackScreen() LPD3D9SPRITE spr = GetElement(IntroStoryScreen); //получаем объект спрайта по его // //индексу IntroStoryScreen //в данном примере - вычисляем пиксельные координаты изображения по векторным, а //вообще такой пересчет должен выполняться в методе анимации, но в данном случае //это выполняется здесь
D3DXVECTOR2 pt1;
pt1.x *= spr->m_fResolutionRescale; //пересчетный
коэффициент применяется для // // // //корректного вывода // выводим 2d-изображение в указанную позицию x, y, z; x и y - пиксельные координаты, // но представленные типом float; с данным масштабом xScale, yScale и с данной // // // // полупрозрачностью alpha spr->Draw2(pt1.x,
pt1.y, spr->m_Position.z, |
||
Но прежде нужно загрузить нужное изображение из файла, это делается следующим образом - | ||
LPD3D9SPRITE Sprite; HRESULT hr; Sprite = new CD3D9Sprite(); // создаем объект для работы со спрайтами и 2d-// // // // // // изображениями hr
= Sprite->LoadTextureFromFile( |
||
После использования - при освобождении ресурсов приложения нужно освободить ресурсы, выделенные для использования объектов, это делается так - SAFE_DELETE(Sprite); |
||
Возникает вопрос: как загружать и использовать не одно - несколько изображений. Для этого Вам нужно создать текстовый файл, содержащий список загружаемых изображений и их параметров, а для работы со списком объектов использовать например класс CPtrArray. Всё это есть в ПОЛНОМ ИСХОДНОМ КОДЕ игры. Как задавать для изображений их параметры - координаты вывода на экран, масштабные коэффициенты и некоторые другие ? Для этого у объектов класса CD3D9Sprite есть соответствующие свойства - нужно просто задать в коде необходимые значения, а сами значения можно загружать из текстового файла. Это также показано в ПОЛНОМ ИСХОДНОМ КОДЕ игры. |
||
[содержание] [назад] [страница 4] [далее] | ||