新人学习DirectX时遇到了一个问题,求前辈指导(求助帖)
#include<windows.h>
#include<d3d9.h>
#include<time.h>
#include<iostream>
using namespace std;
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
const string Apptitle = "DirectX Surface Program ";
#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000 ) ? 1: 0)
#define screenw 1024
#define screenh 768
LPDIRECT3D9 d3d = NULL;
LPDIRECT3DDEVICE9 d3ddev = NULL;
LPDIRECT3DSURFACE9 backbuffer = NULL;
LPDIRECT3DSURFACE9 surface = NULL;
bool gameover = false;
bool game_init(HWND hwnd)
{
d3d = Direct3DCreate9(D3D_SDK_VERSION);
if (d3d == NULL)
{
MessageBox(hwnd, "error creqating d3d", "error", MB_OK);
return false;
}
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferCount = 1;
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
d3dpp.BackBufferWidth = screenw;
d3dpp.BackBufferHeight = screenh;
d3dpp.hDeviceWindow = hwnd;
d3d->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL, hwnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &d3ddev
);
if (!d3ddev)
{
MessageBox(hwnd, "error creating d3ddev ", " error", MB_OK);
return false;
}
srand((unsigned int)time(NULL));
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
d3ddev->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &backbuffer);
HRESULT result = d3ddev->CreateOffscreenPlainSurface(
100, 100,
D3DFMT_X8R8G8B8,
D3DPOOL_DEFAULT,
&surface,
NULL
);
if (result != D3D_OK) return false;
return true;
}
void game_run(HWND hwnd)
{
if (!d3ddev) return;
if (d3ddev->BeginScene())
{
int r = rand() % 255;
int g = rand() % 255;
int b = rand() % 255;
d3ddev->ColorFill(surface, NULL, D3DCOLOR_XRGB(r, g, b));
RECT rect;
rect.left = rand() % screenw/2;
rect.right = rect.left + rand() % screenw / 2 ;
rect.top = rand() % screenh;
rect.bottom = rect.top + rand() % screenh / 2;
d3ddev->StretchRect(surface, NULL, backbuffer, &rect, D3DTEXF_NONE);
d3ddev->EndScene();
d3ddev->Present(NULL, NULL, NULL, NULL);
}
if (KEY_DOWN(VK_ESCAPE))
PostMessage(hwnd, WM_DESTROY, 0, 0);
}
void game_end(HWND hwnd)
{
if (surface) surface->Release();
if (d3ddev) d3ddev->Release();
if (d3d) d3d->Release();
}
LRESULT WINAPI WinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
switch (msg)
{
case WM_DESTROY:
gameover = true;
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wparam, lparam);
}
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow)
{
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WinProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hinstance;
wc.hIconSm = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = "mainWindowClass";
wc.hIconSm = NULL;
RegisterClassEx(&wc);
HWND window = CreateWindow(" mianWindowClass", Apptitle.c_str(), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
screenw, screenh, (HWND)NULL, (HMENU)NULL, hinstance, (LPVOID)NULL);
if (!window )
{
MessageBox(window, " window error", "error", MB_OK);
return 0;
}
ShowWindow(window, ncmdshow);
UpdateWindow(window);
if (!game_init(window))
{
MessageBox(window, " init error", "error", MB_OK);
return 0;
}
MSG msg;
while (!gameover)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
game_run(window);
}
//game_end(window);
return msg.wParam;
}
应该是CreateWindow出现了错误,返回的总是0,所以下面无法编译下去(新人的推测),百度了几次也没解决,求前辈赐教
#include<d3d9.h>
#include<time.h>
#include<iostream>
using namespace std;
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
const string Apptitle = "DirectX Surface Program ";
#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000 ) ? 1: 0)
#define screenw 1024
#define screenh 768
LPDIRECT3D9 d3d = NULL;
LPDIRECT3DDEVICE9 d3ddev = NULL;
LPDIRECT3DSURFACE9 backbuffer = NULL;
LPDIRECT3DSURFACE9 surface = NULL;
bool gameover = false;
bool game_init(HWND hwnd)
{
d3d = Direct3DCreate9(D3D_SDK_VERSION);
if (d3d == NULL)
{
MessageBox(hwnd, "error creqating d3d", "error", MB_OK);
return false;
}
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferCount = 1;
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
d3dpp.BackBufferWidth = screenw;
d3dpp.BackBufferHeight = screenh;
d3dpp.hDeviceWindow = hwnd;
d3d->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL, hwnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &d3ddev
);
if (!d3ddev)
{
MessageBox(hwnd, "error creating d3ddev ", " error", MB_OK);
return false;
}
srand((unsigned int)time(NULL));
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
d3ddev->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &backbuffer);
HRESULT result = d3ddev->CreateOffscreenPlainSurface(
100, 100,
D3DFMT_X8R8G8B8,
D3DPOOL_DEFAULT,
&surface,
NULL
);
if (result != D3D_OK) return false;
return true;
}
void game_run(HWND hwnd)
{
if (!d3ddev) return;
if (d3ddev->BeginScene())
{
int r = rand() % 255;
int g = rand() % 255;
int b = rand() % 255;
d3ddev->ColorFill(surface, NULL, D3DCOLOR_XRGB(r, g, b));
RECT rect;
rect.left = rand() % screenw/2;
rect.right = rect.left + rand() % screenw / 2 ;
rect.top = rand() % screenh;
rect.bottom = rect.top + rand() % screenh / 2;
d3ddev->StretchRect(surface, NULL, backbuffer, &rect, D3DTEXF_NONE);
d3ddev->EndScene();
d3ddev->Present(NULL, NULL, NULL, NULL);
}
if (KEY_DOWN(VK_ESCAPE))
PostMessage(hwnd, WM_DESTROY, 0, 0);
}
void game_end(HWND hwnd)
{
if (surface) surface->Release();
if (d3ddev) d3ddev->Release();
if (d3d) d3d->Release();
}
LRESULT WINAPI WinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
switch (msg)
{
case WM_DESTROY:
gameover = true;
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wparam, lparam);
}
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow)
{
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WinProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hinstance;
wc.hIconSm = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = "mainWindowClass";
wc.hIconSm = NULL;
RegisterClassEx(&wc);
HWND window = CreateWindow(" mianWindowClass", Apptitle.c_str(), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
screenw, screenh, (HWND)NULL, (HMENU)NULL, hinstance, (LPVOID)NULL);
if (!window )
{
MessageBox(window, " window error", "error", MB_OK);
return 0;
}
ShowWindow(window, ncmdshow);
UpdateWindow(window);
if (!game_init(window))
{
MessageBox(window, " init error", "error", MB_OK);
return 0;
}
MSG msg;
while (!gameover)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
game_run(window);
}
//game_end(window);
return msg.wParam;
}
应该是CreateWindow出现了错误,返回的总是0,所以下面无法编译下去(新人的推测),百度了几次也没解决,求前辈赐教
...全文
相关推荐
Win10关于易语言提示运行时出错初始化DirectX运行库失败问题的解决
初始化DirectX运行库失败"是其中一个常见的错误提示,意味着系统缺少必要的DirectX组件或者相关的驱动程序不兼容。为了解决这个问题,我们可以按照以下步骤进行操作:1.
DirectX修复工具及DirectX修复工具增强版
在使用DirectX修复工具时,用户通常只需点击“开始检测”按钮,软件便会自动完成整个检测和修复过程。如果在检测过程中发现任何问题,工具会提供详细的报告,让用户了解哪些文件需要修复。
一个基于DirectX的小游戏
这个游戏是一个典型的DirectX应用实例,展示了如何利用DirectX的各个组件来构建一个交互式的3D游戏。
安装directx错误的解决方案(转载)
**技术社区求助**: - 如果以上步骤无法解决问题,可以在技术论坛或微软社区寻求帮助,提供具体的错误信息,让其他用户或专家协助诊断。总的来说,解决DirectX安装错误需要耐心和逐步排查。
[DirectX开发学习日记]第一个DirectX程序及相关基础概念-(02)
【DirectX开发学习日记】第一篇关于DirectX程序及基础概念的探讨在本文中,我们将深入探讨DirectX编程的基础,特别是通过创建一个简单的Direct3D程序来理解其核心概念。


新手乐园
