HEELP Direct3D9 не создаётся устройство
когда было всё в 1 файле то работало перенёс по нескольким но при запуске _d3ddev = NULL
чё за :confused:
[CODE=Main.cpp]
#include "IncludeFiles.h"
#include "ConstAndVars.h"
#include "D3D.h"
LRESULT _stdcall WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
void RAD();
int _stdcall WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASS wc;
wc.cbClsExtra = NULL;
wc.cbWndExtra = NULL;
wc.hbrBackground = (HBRUSH)(GRAY_BRUSH);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.lpszClassName = CLASSNAME;
wc.hInstance = hInstance;
wc.lpszMenuName = NULL;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WndProc;
RegisterClass(&wc);
hwnd = CreateWindow(CLASSNAME, L"Direct3D lesson 1", WS_EX_TOPMOST | WS_VISIBLE, 0,
0, WIDTH,HEIGHT, NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
if(!d3d::InitD3D(hwnd, true, _d3ddev, _d3d, HEIGHT, WIDTH))
{
MessageBox(hwnd, L"Ошибка инициализации Direct3D", L"Ошибка", MB_OK);
exit(0);
}
ZeroMemory(&msg, sizeof(MSG));
while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}else
{
d3d::Rendering(_d3ddev);
}
}
RAD();
return 0;
}
LRESULT _stdcall WndProc(HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
case WM_KEYDOWN:
if(wParam == VK_ESCAPE)//при нажатии на escape выход
{
RAD();
DestroyWindow(hwnd);
}
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
void RAD() //ето как бы ReleaseAndDelete
{
d3d::Release(_d3d);
d3d::Release(_d3ddev);
}
[/CODE]
[CODE=D3D.h]
#ifndef _D3D_H_
#define _D3D_H_
#include "IncludeFiles.h"
namespace d3d
{
bool InitD3D(HWND hwnd, bool windowed, IDirect3DDevice9* _d3ddev,
IDirect3D9* _d3d, int HEIGHT, int WIDTH);
void Rendering(IDirect3DDevice9* _d3ddev);
template<class TEMPLATE>
void Release(TEMPLATE t)
{
if(t)
{
t->Release();
t = NULL;
}
}
template<class TEMPLATE>
void Delete(TEMPLATE t)
{
if(t)
{
delete [] t;
t = NULL;
}
}
}
#endif
[/CODE]
[CODE=D3D.cpp]
#include "D3D.h"
bool d3d::InitD3D(HWND hwnd, bool windowed, IDirect3DDevice9* _d3ddev, IDirect3D9* _d3d, int HEIGHT, int WIDTH)
{
if(NULL ==(_d3d = Direct3DCreate9(D3D_SDK_VERSION)))
return false;
D3DPRESENT_PARAMETERS _d3dpp;
_d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
_d3dpp.BackBufferCount = 1;
_d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
_d3dpp.BackBufferHeight = (UINT)HEIGHT;
_d3dpp.BackBufferWidth = (UINT)WIDTH;
_d3dpp.EnableAutoDepthStencil = true;
_d3dpp.Flags = NULL;
_d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
_d3dpp.hDeviceWindow = hwnd;
_d3dpp.MultiSampleQuality = NULL;
_d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
_d3dpp.Windowed = windowed;
if(FAILED(_d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&_d3dpp, &_d3ddev)))
return false;
if(_d3ddev)
return false;
return true;
}
void d3d::Rendering(IDirect3DDevice9* _d3ddev)
{
if(!_d3ddev)
return;
_d3ddev->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);
_d3ddev->Present(0, 0, 0, 0);
}
[/CODE]
[CODE=ConstAndVars.h]
#ifndef _CONSTANDVARS_H_
#define _CONSTANDVARS_H_
#include "includeFiles.h"
#define CLASSNAME "wndclass"
#define WIDTH 800
#define HEIGHT 600
HWND hwnd;
MSG msg;
IDirect3D9* _d3d;
IDirect3DDevice9* _d3ddev;
#endif
[/CODE]
[CODE=IncludeFiles.h]
#ifndef _INCLUDEFILES_H_
#define _INCLUDEFILES_H_
#include <windows.h>
#include <d3d9.h>
#endif
[/CODE]
я даже пробовал использовать флаг D3DCREATE_SOFTWARE_VERTEXPROCESSING
эффекта NULL
во вторых передана по значению
а как её не передавать то? если подключать в D3D.h то вылазят ошибки LNK2005 хотя всё вроде норм #define ами всё сделано в Main.cpp всё отключено?
if(!d3d::InitD3D(hwnd, true, &_d3ddev, &_d3d, HEIGHT, WIDTH))
ну и там D3D.cpp немного поправить.
Спасибо огромнейшее но я уже всё решил с extern повозился и всё