подскажите, почему данный код компилируется, но окно как только выводится на экран, сразу само закрывается. Я только и успеваю рассмотреть серый фон. Причём если я убираю код инициализации directX, то всё в порядке, окно на экране и ждёт пока я его не закрою. Вот исходник.
HRESULT InitialDX(HWND hWnd); // Функция инициализации DIRECTX void Render(); // Функция рендеринга(отрисовки) void ReleaseDX(); // Функция освобождения устройств.
while(msg.message!=WM_QUIT) // Цикл обработки сообщений { if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else { Render(); //Наш код } } } }
HRESULT InitialDX(HWND hWnd) { if(NULL==(pDirect3D=Direct3DCreate9(D3D_SDK_VERSION))) //создание основного интерфейса return E_FAIL; D3DDISPLAYMODE Display; // структура с настройками монитора if (FAILED(pDirect3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&Display))) // получение настроек монитора. return E_FAIL;
D3DPRESENT_PARAMETERS Direct3DParametr; // Структура с настройками ZeroMemory(&Direct3DParametr,sizeof(Direct3DParametr)); // Обнуление структуры Direct3DParametr.Windowed=TRUE; // Рeжим отображения приложения(true - оконное, false -полноэкранное) Direct3DParametr.SwapEffect=D3DSWAPEFFECT_DISCARD; // Метод переключения буферов Direct3DParametr.BackBufferFormat=Display.Format; // Формат пикселя(колличество разрядов цвета) Direct3DParametr.EnableAutoDepthStencil=TRUE; // Управление буфером глубины Direct3DParametr.AutoDepthStencilFormat=D3DFMT_D16; // Формат буфера глубины Direct3DParametr.BackBufferWidth=Display.Width; // Ширина буфера Direct3DParametr.BackBufferHeight=Display.Height; // Высота буфера // Direct3DParametr.FullScreen_RefreshRateInHz=Display.RefreshRate; //Частота обновления экрана(только в полноэкранном режиме)
if (FAILED(pDirect3D->CreateDevice(D3DADAPTER_DEFAULT, // используемая видеокарта D3DDEVTYPE_HAL, // тип устройства hWnd, // дескриптор родительского окна D3DCREATE_HARDWARE_VERTEXPROCESSING, //режим обработки шейдеров &Direct3DParametr, // структура с настройками &pDirect3DDevice))) // указатель на устройство
return E_FAIL;
return S_OK; }
void Render() { pDirect3DDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,255),1.0f,0); //Очистка вторичного буфера pDirect3DDevice->BeginScene(); //Начало рендеринга // Код отрисовки сцены pDirect3DDevice->EndScene(); //Конец рендеринга pDirect3DDevice->Present(NULL,NULL,NULL,NULL); // копирование вторичного буфера в первичный }
Добавлено (04.10.2010, 21:49) --------------------------------------------- ещё обнаружил что вот тут f (FAILED(pDirect3D->CreateDevice(D3DADAPTER_DEFAULT, // используемая видеокарта D3DDEVTYPE_HAL, // тип устройства hWnd, // дескриптор родительского окна D3DCREATE_HARDWARE_VERTEXPROCESSING, //режим обработки шейдеров &Direct3DParametr, // структура с настройками &pDirect3DDevice))) // указатель на устройство оно возвращает E_FAIL.
maked0n, Вот, то, что сразу бросается в глаза: отсутствует инициализация поля hDeviceWindow для D3DPRESENT_PARAMETERS. Естественно, что IDirect3DDevice9 не создаётся.
Ты используешь слишком сложный код. Его можно сократить более чем в два раза. Посмотри вот этот урок.
maked0n, Скорее всего причина в том, что размер бекбуфера равен размеру монитора, при использовании оконного приложения. На некоторых девайсах такая бяка бывает. В D3DPRESENT_PARAMETERS оставь строчки
Остальные закомментируй. Таким образом ДиректХ самостоятельно подберет оптимальные. Также можешь попробовать сменить Display.Format на D3DFMT_UNKNOWN Либо смени Direct3DParametr.Windowed=false;
Quote (el_rey)
Вот, то, что сразу бросается в глаза: отсутствует инициализация поля hDeviceWindow для D3DPRESENT_PARAMETERS. Естественно, что IDirect3DDevice9 не создаётся.
А вот и не естественно. hDeviceWindow используется, когда нужно указать конкретное окно для рендеринга, например, в многооконном приложении. Если это поле оставить пустым, то, по умолчанию, берется текущее окно. (Тот дескриптор, что передавался в CreateDevice) Windmill 2
HRESULT InitialDX(HWND hWnd); // Функция инициализации DIRECTX HRESULT InitialBufferVershin(); void Render(); // Функция рендеринга(отрисовки) void ReleaseDX(); // Функция освобождения устройств.
HRESULT InitialDX(HWND hWnd) { if(NULL==(pDirect3D=Direct3DCreate9(D3D_SDK_VERSIO N))) //создание основного интерфейса return E_FAIL; D3DDISPLAYMODE Display; // структура с настройками монитора if (FAILED(pDirect3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&Display))) // получение настроек монитора. return E_FAIL;
D3DPRESENT_PARAMETERS Direct3DParametr; // Структура с настройками ZeroMemory(&Direct3DParametr,sizeof(Direct3DParametr)); // Обнуление структуры Direct3DParametr.Windowed=TRUE; // Рeжим отображения приложения(true - оконное, false -полноэкранное) Direct3DParametr.SwapEffect=D3DSWAPEFFECT_DISCARD; // Метод переключения буферов Direct3DParametr.BackBufferFormat=Display.Format; // Формат пикселя(колличество разрядов цвета) Direct3DParametr.EnableAutoDepthStencil=TRUE; // Управление буфером глубины Direct3DParametr.AutoDepthStencilFormat=D3DFMT_D16 ; // Формат буфера глубины Direct3DParametr.BackBufferWidth=Display.Width; // Ширина буфера Direct3DParametr.BackBufferHeight=Display.Height; // Высота буфера //Direct3DParametr.FullScreen_RefreshRateInHz=Displa y.RefreshRate; //Частота обновления экрана(только в полноэкранном режиме)
if (FAILED(pDirect3D->CreateDevice(D3DADAPTER_DEFAULT, // используемая видеокарта D3DDEVTYPE_REF, // тип устройства hWnd, // дескриптор родительского окна D3DCREATE_HARDWARE_VERTEXPROCESSING, //режим обработки шейдеров &Direct3DParametr, // структура с настройками &pDirect3DDevice))) // указатель на устройство { MessageBox(hWnd, L"Error", L"Error", MB_OK|MB_ICONEXCLAMATION); return E_FAIL; } return S_OK; }
у меня проблема сделал все как указано в курсе: специально переустановил VS2010 потом директХу но при написании кода подчеркивается ошибка :
#include <d3dx9.h>
Error: не удается открыть источник файла "d3dx9.h"
а это показание отладчика
1> fatal error C1083: Не удается открыть файл включение: d3dx9.h: No such file or directory
библиотеки я добавил даже вторым ручным способом но все равно не работает возможно у меня на компьютере не установилось что либо правильно ? есть ли решение данной проблемы (может нужно скачать библиотеку ?)
ДиректХ качал полностью 580 мегов. установка прошла успешно но эта ошибка ......
не пути все прописал все нормуль но все равно не пашет уже 20 раз делал твой урок и ошибка из-за библиотеки этой ( как сяду еще раз и за скриню ошибки после чего выложу сюда.
Блин у меня таже фигня,только с либами Error: не удается открыть источник файла "d3dx9.lib" сколько искал везде ссылаются на пути,пути прописал правельно но не фига(((
А нужна какая-то подготовка для изучения срр?Я впринципе хожу на курсы паскаля.....увлекаюсь хтмл(+js+css).Довольно давненько увлекался с++.Но это всё довольно мало...Стоит браться сейчас за срр?Или освоить для начала, что-нибудь другое, а потом уже учить срр.
Ещё один вопрос.А как вы смотрите на Dev C++?Как альтернатива к Visual Studio?
А нужна какая-то подготовка для изучения срр?Я впринципе хожу на курсы паскаля.....увлекаюсь хтмл(+js+css).Довольно давненько увлекался с++.Но это всё довольно мало...Стоит браться сейчас за срр?Или освоить для начала, что-нибудь другое, а потом уже учить срр.
Стоит и не сейчас, а ещё вчера. К тому же, если ты ходишь на курсы паскаля, то проблем не возникнет. Уж на основах то точно. Изучишь основы, синтаксис, и довольно быстро сможешь писать на с++ то же, что пишешь на паскале, а дальше уже за ООП надо браться. Только книжки по серьезней бери, а не как освоить с++ за 25 уроков по 25 минут в день
Я и сам не знаю что делать. С одной стороны уже хочется переходить к графике, но смысла в этом пока нет. Чтобы нормально работать с ДХ необходимы неслабые знания С++.
Я бы глянул обучалку по созданию 3D-комнаты, с последующим добавлением в нее "героя". х) Science is interesting! If you don't agree, you can f*ck off.
Установка прошла нормально, но потом по всем проектам fatal error LNK1104: не удается открыть файл ''d3d9.h'' , опять устанавливать DirectX SDK или кто другие решения находил?