автор: Тимонин Андрей
дата публикации на сайте Мега Информатик: 18.11.2012
Добро пожаловать в цикл моих уроков посвященных программированию.
На написание этой статьи меня вдохновил блог о создании игр с нуля, который можно посмотреть по следующей ссылке mindillusion.ru.
Здесь я хочу затронуть основные, интересные для меня, моменты. Рассказать вам с чего нужно начинать делать свое первое 3д или 2д приложение.
Существует 2 основные низкоуровневые библиотеки для вывода графики, над которыми пишутся движки, применяемые как в сфере разработки игр, так и прочих графических приложений не связанных с геймдевом. Это DirectX, на данный момент вышла 11 версия и OpenGl. В этой статье мы будем касаться 9 версии директа. Другие версии могут немного отличаться.
Результат наших действий будет такой, как на скриншоте.
И так, перейдем к делу... У нас получается такой интерфейс класса. Здесь все, что необходимо для работы с графическим устройством. По крайней мере, что нам интересно на данный момент. Часть методов я приведу, снабдив, необходимыми для понимания комментариями. Класс у нас в единственном экземпляре, что дает нам возможность объединить возможности в одном классе. В том числе хранение и работа с текстурами и шейдерами. Это будет тема для одной из следующих статей. Смотрим код.
class Graphics : public singleton<Graphics>
{
friend class singleton<Graphics>;
private:
int _width,_height; //размеры экрана(сделал для удобства)
//интерфейс directX
LPDIRECT3D9 m_pD3D;
//интерфейс устройства вывода
LPDIRECT3DDEVICE9 m_pd3dDevice;
// структкура с параметрами девайса
D3DPRESENT_PARAMETERS m_d3dpp;
typedef std::vector<CTexturePtr> vecTextures;
vecTextures m_vecTextures;
typedef std::vector<CShaderPtr> vecShaders;
vecShaders m_vecShaders;
protected:
//закрыто. нет смысла создавать все равно singleton
Graphics(void);
~Graphics(void);
public:
//возвращает устройство
LPDIRECT3DDEVICE9 GetDevice();
//инициализация устройства
bool Init(HWND hRenderWnd, int width, int height);
//возвращает ширину
int getWidth() const {return _width;}
//возвращает высоту
int getHeight() const {return _height;}
//удаление интерфейсов
void Cleanup();
//сброс
HRESULT Reset();
//начало рендера
bool StartRender(D3DCOLOR bgColor=0xff808080);
//устанавливает формат вершин
HRESULT SetFVF(DWORD FVF);
//устанавливает пиксельный и верш шейдер( в статье не будем рассматривать. рано еще)))
HRESULT SetPixelShader(CShaderPtr shader);
HRESULT SetVertexShader(CShaderPtr shader);
//установка характеристик рендера
HRESULT SetRenderState(D3DRENDERSTATETYPE State, DWORD Value);
//установка характеристик текстур(смешивание, альфа и тд)
HRESULT SetTextureStageState(DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value);
//установка способа отображения семплов( фильтрация)
HRESULT SetSamplerState(DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value);
//установка текстуры
HRESULT SetTexture(DWORD stage, CTexturePtr pTex);
//начало блока настроек рендера
HRESULT BeginStateBlock();
//конец блока настроек рендера
HRESULT EndStateBlock(LPDIRECT3DSTATEBLOCK9* block);
//отрисовка премитива
HRESULT DPUP( D3DPRIMITIVETYPE PrimitiveType, UINT PrimitiveCount, CONST void* pVertexStreamZeroData, UINT VertexStreamZeroStride);
//конец отрисовки
bool EndRender();
//загрузка текстур и шейдеров(про текстуры будет отдельная статья)
CTexturePtr LoadTexture(const std::wstring& szFileName);
CShaderPtr LoadShader( const std::string& strFileName, const std::string& strFuncName, const std::string& profile);
};
Сейчас нам интересны два интерфейса:
//интерфейс directX
LPDIRECT3D9 m_pD3D;
//интерфейс устройства вывода
LPDIRECT3DDEVICE9 m_pd3dDevice;
Для начала их необходимо обнулить.
Graphics::Graphics()
{
m_pD3D = NULL;
m_pd3dDevice = NULL;
ZeroMemory(&m_d3dpp, sizeof(D3DPRESENT_PARAMETERS)); // обнулим
}
А сейчас посмотрим, как инициализируется устройство.
bool Graphics::Init(HWND hRenderWnd, int width, int height)
{
// сначала проицициализируем сам DirectX 9
m_pD3D = Direct3DCreate9( D3D_SDK_VERSION );
if (m_pD3D==NULL)
return false;
//создаем структуру с режимами дисплея
D3DDISPLAYMODE d3ddm;
//пробуем определить параметры дисплея
if(FAILED(m_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
{
//генерируем исключение
ExceptionBase err(GETDISPLAYMODEERROR,L"Не могу определить параметры дисплея");
throw err;
return false;
}
//характеристики заднего буфера---------------------------------------------------------
m_d3dpp.BackBufferWidth = width; // указываем ширину и
m_d3dpp.BackBufferHeight = height; // высоту области рендера
m_d3dpp.BackBufferCount = 1; // один внеэкранный буфер
m_d3dpp.BackBufferFormat = d3ddm.Format;
//-------------------------------------------------------------------------------------------------------
m_d3dpp.Windowed = TRUE; // рендер в окне, а не в полный экран
m_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // так лучше делать всегда
m_d3dpp.EnableAutoDepthStencil = TRUE; // нам нужен Z-буфер
m_d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; // формат Z-буфера
m_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
// и теперь создадим сам девайс
HRESULT hr = m_pD3D->CreateDevice( D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL, hRenderWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING,
&m_d3dpp, &m_pd3dDevice );
if (FAILED(hr))
return FALSE;
_height = height;
_width = width;
return TRUE;
}
Чтобы освободить интерфейс, необходимо вызвать Release. Посмотрим, как удаляются, созданные нами, объекты.
void Graphics::Cleanup()
{
// освобождаем текстуры
vecTextures::iterator itr = m_vecTextures.begin();
while(itr!=m_vecTextures.end())
{
(*itr)->Release();
delete *itr;
itr++;
}
m_vecTextures.clear();
// освобождаем шейдеры
vecShaders::iterator itr2 = m_vecShaders.begin();
while(itr2!=m_vecShaders.end())
{
(*itr2)->Release();
delete *itr2;
itr2++;
}
m_vecShaders.clear();
if (m_pd3dDevice)
{
m_pd3dDevice->Release();
m_pd3dDevice = NULL;
}
if (m_pD3D)
{
m_pD3D->Release();
m_pD3D = NULL;
}
}
Следующим шагом, посмотрим на методы, необходимые для отрисовки.
bool Graphics::StartRender(D3DCOLOR bgColor)
{
if (FAILED(m_pd3dDevice->BeginScene())) // начинаем рисовать
return false;
// очистка экрана
if (FAILED(m_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|
D3DCLEAR_STENCIL| D3DCLEAR_ZBUFFER, bgColor, 1, 0)))
return false;
return true;
}
bool Graphics::EndRender()
{
m_pd3dDevice->EndScene(); // закончили рисовать
// копируем на экран
HRESULT hr = m_pd3dDevice->Present(NULL, NULL, NULL, NULL);
if (FAILED(hr)/*==D3DERR_DEVICELOST*/)
Reset();
if (FAILED(hr))
return false;
return true;
}
Установка формата вершин и отрисовка примитивов.
HRESULT Graphics::SetFVF( DWORD FVF )
{
return m_pd3dDevice->SetFVF(FVF);
}
HRESULT Graphics::DPUP( D3DPRIMITIVETYPE PrimitiveType, UINT PrimitiveCount, CONST void* pVertexStreamZeroData, UINT VertexStreamZeroStride )
{
return m_pd3dDevice->DrawPrimitiveUP(PrimitiveType, PrimitiveCount, pVertexStreamZeroData, VertexStreamZeroStride);
}
И напоследок, посмотрим на настроечные функции.
HRESULT Graphics::SetRenderState( D3DRENDERSTATETYPE State, DWORD Value )
{
return m_pd3dDevice->SetRenderState(State, Value);
}
HRESULT Graphics::SetTextureStageState(DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value )
{
return m_pd3dDevice->SetTextureStageState(Stage,Type,Value);
}
HRESULT Graphics::SetSamplerState( DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value )
{
return m_pd3dDevice->SetSamplerState(Sampler, Type, Value);
}
На этом пока все. Применение смотрите в следующей части.
[к содержанию] [другие статьи Тимонина Андрея]
|
||||
Система Управления Вашим сайтом - megainformatic cms e-mailer Эта система объединяет в себе 4 подсистемы: |
||||
Система megainformatic cms e-mailer имеет следующие особенности: - простая и быстрая установка; - полностью открытый исходный код на php; - подробное документирование возможностей; - удобное управление контентом; - доступный для понимания код; - наличие встроенных модулей административной части, контента, поиска, карты сайта, случайной новости, даты и времени, e-pro, e-shop, e-mailer, сменные шаблоны, выпадающее меню; - наличие подключаемых платежных систем WebMoney, Робокасса, Единый Кошелек, Квитанция сбербанка, QIWI, указание реквизитов для других систем, например yandex.деньги. |
||||
Система megainformatic cms e-mailer решает следующие задачи: - позволяет создать сайт, пополнять, расширять и продвигать его; - добавить к сайту товары и систему оплаты и обработки заказов, превратив его в интернет-магазин - e-shop; - осуществлять работу с партнерскими системами других магазинов обрабатывая заказы с помощью системы e-pro; - организовывать автоматизированное пополнение списков рассылки и выполнять автоматизированные рассылки новостей по базе пользователей вашего сайта; |
||||
Если Вы всё еще сомневаетесь остановить ли свой выбор на megainformatic cms e-mailer, тогда рекомендую вам начать с бесплатного решения - megainformatic cms free - это уникальная система, работающая без баз данных и состоящая всего из ОДНОГО!!! исполнимого файла. Т. е. всё что вам потребуется - это скопировать этот файл на свой хостинг, добавить необходимый контент (в соответствии с описанием системы) и Вы получите бесплатный работающий сайт !!! |
||||
Добро пожаловать в мир электронных знаний !!! | ||||
Предлагаем вашему вниманию онлайн-комикс Приключения Кости Коробкина - С новым годом - интерактивный комикс (kk hny).
Ур-ра !!! Летим !!! Здорово !!!!! Я наверное сплю ?
[страница 1][страница 2] [страница 3] [страница 4] [страница 5] [страница 6] [страница 7]
Итак, если Вы смогли самостоятельно разобраться и всё-таки шарик стал виден на экране вашего приложения, то могу Вас поздравить !
страница 3 - Наложение объектов
страница 5 - Отображаем прыгающий шарик
страница 6 - Загрузка игровой сцены
страница 7 - Перемещения игровой сцены
страница 10 - Проверка столкновений
страница 11 - Игровой счёт, звуки, музыка
14. использование переменных в игре на c++ directx 9c
Вы преодолели первую трудность. Хотя их будет еще много впереди.
Для тех, кто так и не понял в чём была проблема, поясняю.
simple_game\Media\textures\simple_game\tex_list.txtname | x | y | z | xScale | yScale | Width | Height | xOffset | yOffset | FramesPerLine | FramesNum | AnimDelay; |
ball\jump.tga; | -0.7f; | 0.1f; | 0.8999f; | 0.5f; | 0.5f; | 64; | 128; | 0; | 0; | 4; | 8.0f; | 14.0f; |