Создание игр » DirectX 9, Featured » CreateDevice. Создаём первое приложение.
CreateDevice. Создаём первое приложение.
CreateDevice создаёт контекст (девайс) Direct3D. В случае успешного вызова CreateDevice, устройство будет создано и после этого можно загружать текстуры, шейдеры, модели, производить рендеринг и т.д. Давайте сделаем наше первое приложение под DirectX 9. Для начала создадим стандартное приложение win32. Любое (оконное) приложение Windows должно обрабатывать системные сообщения и созданное нами приложение именно так и будет делать. Но нам бы хотелось, что бы в моменты, когда приложению нечего обрабатывать (нет системных сообщений), всё своё свободное время оно посвящало рендеру. Немного модифицируем код основного цикла приложения:
// Main message loop: MSG msg; ZeroMemory(&msg, sizeof(MSG)); while( msg.message!=WM_QUIT ) // если не сообщение о выходе { // проверяем, есть ли сообщения в очереди if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) ) { // сообщения есть, обрабатываем их TranslateMessage( &msg ); DispatchMessage( &msg ); } else // иначе занимаемся рендером { // тут будет код рендера // а пока просто очистка экрана m_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_STENCIL| D3DCLEAR_ZBUFFER, 0, 0, 0); m_pd3dDevice->Present(NULL, NULL, NULL, NULL); } } |
CreateDevice
Теперь нужно создать 3д-девайс, с помощью которого, собственно, и будет происходить рендер в приложении. Первым делом, необходимо подключить заголовки и библиотеки DirectX:
#include <d3d9.h> #include <d3dx9.h> #pragma comment(lib, "d3d9.lib") #pragma comment(lib, "d3dx9.lib") |
и инициализировать сам DirectX:
LPDIRECT3D9 m_pD3D = Direct3DCreate9( D3D_SDK_VERSION ); |
Для создания самого Direct3DDevice необходимо использовать функцию CreateDevice:
HRESULT CreateDevice( [in] UINT адаптер/*обычно D3DADAPTER_DEFAULT*/, [in] D3DDEVTYPE тип_девайса/*обычно D3DDEVTYPE_HAL*/, [in] HWND хэнд_окна_приложения/*передаём HWND нашего окна*/, [in] DWORD доп_флаги/*обычно D3DCREATE_HARDWARE_VERTEXPROCESSING*/, [in, out] D3DPRESENT_PARAMETERS *параметры, [out, retval] IDirect3DDevice9 **девайс); |
В итоге получится примерно вот так:
BOOL InitD3D(HWND hWnd, int iWindowWidth, int iWindowHeight) { // сначала проицициализируем сам DirectX 9 m_pD3D = Direct3DCreate9( D3D_SDK_VERSION ); if (m_pD3D==NULL) return FALSE; // структкура с параметрами девайса D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(D3DPRESENT_PARAMETERS)); // обнулим d3dpp.BackBufferWidth = iWindowWidth; // указываем ширину и d3dpp.BackBufferHeight = iWindowHeight; // высоту области рендера d3dpp.BackBufferCount = 1; // один внеэкранный буфер d3dpp.Windowed = TRUE; // рендер в окне, а не в полный экран d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; // формат выберет сам DX d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // так лучше делать всегда d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; // формат Z-буфера d3dpp.EnableAutoDepthStencil = TRUE; // нам нужен Z-буфер d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; // и теперь создадим сам девайс HRESULT hr = m_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &m_pd3dDevice ); return !FAILED(hr); } |
Нам этом всё. Скачать проект со всеми исходниками.
Следующим уроком будет рассказ о векторах, матрицах и трансформациях.
Обычное “Hello World!” но:
– видно что код лепился и кусков копипаста
– комментарии то на английском то на русском. Надо определиться
– LPDIRECT3D9 m_pD3D = NULL; m_ и глобальная? Будет статья про кодинг стайл?
– уже 2011 но “машинки” еще не у всех поддерживают D3DCREATE_HARDWARE_VERTEXPROCESSING.
Предлагаю добавить проверку:
D3DCAPS9 caps;
m_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);
int vp = 0;
if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
Может еще кому-то кроме меня это поможет.
На самом деле код я и в самом деле “скопипастил” с моего движка вот от этого:
http://www.youtube.com/watch?v=ri2-qoZBSwM
Однако, поддержку софтвара отключил сознательно – полагая, что такие видюхи остались лишь на некоторых нетбуках. Однако, на будущее, учту и введу необходимые проверки в код. Спасибо за ваш комментарий.
Парни, я D3DADAPTER_DEFAULT поменял на NULL и всё пока работает. Как думаете, никаких сбоев не будет?
А зачем поменял-то?
Вообще, D3DADAPTER_DEFAULT это дефайн, значение которого =0. Потому сбоев, естественно, не будет. Но код станет менее наглядным.
а мне можете хоть че тут обьяснить ото я воще не в курю че то(((
Что именно непонятно?
а где эта штука CreateDevice
А у меня компилятор е видит
Stanz, я не понимаю смысла вашего вопроса.
ferber, не видит? Не видит кого?
HELP! Компилятор пишет что m_pd3dDevice не инициализирован.
Можете точно процитировать что именно он пишет? Сообщение о том, что переменная используется без инициализации или о том, что нет декларации переменной?
Вы скачали код из аттача к уроку или писали его сами?
1.Идентификатор “m_pd3dDevice” не определён.
2.Конечно писал сам(иначе какой в этом смысл).
Смысл в том, что бы просто взять код и посмотреть, что не так, дабы можно было самостоятельно решить простые ошибки, вроде этой. Я же не говорю, что надо бездумно копировать код – но просто посмотреть-то ничего не мешает
В данном случае проблема в том, что вы используете переменную, которую не декларировали ранее.
Добавьте в код: LPDIRECT3DDEVICE9 m_pd3dDevice;
и всё будет работать.
Пардон,у меня не большой опыт С++ программирования.
И кстати:
IDirect3D9::CreateDevice: невозможно преобразовать параметр 6 из “int *” в “IDirect3DDevice9 **”
См. выше – качайте исходный код в аттаче и разбирайтесь. Ошибки совершенно детские – полагаю, Вы просто вообще не понимаете того кода, который пишете.
Я прошу прощения, НО!: что это всё такое? Где это всё набирать то надо??? Все эти программные коды где пишутся? В паскале что ли? Я конечно нуб чёрвствый, но у меня желания по горло начать этим заниматься!!! Объясните начало работы пошагово! Где писать? Что писать?
Они пишутся (конкретно в моих примерах) в MS Visual Studio. Однако, если у Вас возникают такие вопросы, думаю, Вам стоило бы сначала изучить основы программирования на C++ и особенности использования конкретно Visual Studio, и уже только после этого браться за программирование игр и графики. В противном случае толку будет очень мало.
Люди добрые, помогите пожалуйста, дайте ссылочки на обучение с нуля С++, желательно видео, а в прочем сойдет любой материал…
Горю желанием обучиться, но не могу найти норм обучение.
Зараннее благодарен
Сергей, для обучения Вам необходимо понять основы программирования как вообще такового, если они есть, то изучайте синтаксис языка C++, книг для этого множество, статей тоже. Конкретно я уже знал до С++ язык Pascal и для изучения читал книгу Страуструпа. Поняв синтаксис и структуру программы, уже переходил к самому программированию. Еще было бы не плохо узнать как работает операционная система. Для понимания работы Вашей программы это было бы не плохо. Какую книгу почитать я не могу сказать, но в своем случае, я пользовался статьями. Более того, по моему, в приведенной мной книге это описано, если мне не изменяет память.
Это если заниматься одному, а вообще лучше всего узнать все от преподавателя или от знакомого, который этим занимался, чтобы он объяснил для Вас понятным языком что, куда, для чего. Он же Вам и подскажет что почитать, какие у Вас минусы и плюсы. И самое главное, не унывайте! Это достаточно сложное дело, но когда вникните, то получите большой результат.
ругается на отсутствие d3dx9, самостоятельно установить не получается( Что теперь завязывать?
А в чём проблема с установкой-то?
Вы случайно не пытаетесь “руками” подпихнуть ему нужную DLL? Что бы всё работало нормально – необходимо установить DirectX SDK и тогда, по идее, проблем быть не должно.
Извините меня конечно, но статья суховата, ни слова о COM структуре DirectX, не пояснения параметров функций и структуры D3DPRESENT_PARAMETERS.
Здравствуйте!
Благодарю за уроки, ресурсов аналогичных Вашему я не находил, а задача стоит именно в создании игрового приложения с использованием DirectX.
Напишите, пожалуйста, подробную инструкцию по установке DirectX SDK и подключению его к проекту. Как я понял Вы работаете с DirectX9?
Заранее спасибо.
Помогите пожалуйста с созданием игры. Я знаю html и немного php. Если поможете, то я вк vk.com/ivallly/ .
Всё работает. Спс!
Мужики! если вы не знаете куда вводить код, но желание не пропадает…
(и это хорошо и правильно), то посоветую всего одну книгу
Фрэнк Д. Луна ВВЕДЕНИЕ В ПРОГРАММИРОВАНИЕ ТРЕХМЕРНЫХ ИГР С DirectX 9.0
Если внимательно прочитать хотябы первые 3 главы (на это у меня ушло 5-6 дней без особых напрягов ибо написано очень доступно без лирики и выкрцтасов), то эти уроки будете читать легко и с удовольствием, впитывая полезную информацию и не запинаясь на вопросах из серии как настроить среду. В книге прямо со введения подробнейшим образом описано как установить DirectX SDK (необходимые библиотеки) и настроить среду программирования. (ну а если всё же не поймёте – совместно справимся).
Если нужны исходники к книге – пишите.