Directx 3D 程序问题(困扰很久了)

ldcsoftware 2008-03-25 07:23:09
#include <d3dx9.h>
LPDIRECT3D9 g_pD3D = NULL; //Direct3D对象
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; //Direct3D设备对象
LPD3DXMESH g_pMesh = NULL; //网格模型对象
D3DMATERIAL9* g_pMeshMaterials = NULL; //网格模型材质
LPDIRECT3DTEXTURE9* g_pMeshTextures = NULL; //网格模型纹理
DWORD g_dwNumMaterials = 0L; //网格模型材质数量

VOID SetWorldMatrix()
{
D3DXMATRIXA16 matWorld;
D3DXMatrixRotationY( &matWorld, timeGetTime()/1000.0f );
g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
}
VOID SetViewAndProjMatrix()
{
D3DXVECTOR3 vEyePt( 0.0f, 10.0f,-20.0f );
D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
D3DXMATRIXA16 matView;
D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
D3DXMATRIXA16 matProj;
D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
}
HRESULT InitD3D( HWND hWnd )
{
if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp, &g_pd3dDevice ) ) )
{
return E_FAIL;
}
g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0xffffffff );
SetViewAndProjMatrix();
return S_OK;
}
void RemovePathFromFileName(LPSTR fullPath, LPWSTR fileName)
{
WCHAR wszBuf[MAX_PATH];
MultiByteToWideChar( CP_ACP, 0, fullPath, -1, wszBuf, MAX_PATH );
wszBuf[MAX_PATH-1] = L'\0';
WCHAR* wszFullPath = wszBuf;
LPWSTR pch=wcsrchr(wszFullPath,'\\');
if (pch)
lstrcpy(fileName, ++pch);
else
lstrcpy(fileName, wszFullPath);
}
HRESULT InitGeometry()
{
LPD3DXBUFFER pD3DXMtrlBuffer; //存储网格模型材质的缓冲区对象
if( FAILED( D3DXLoadMeshFromX( L"airplane.x", D3DXMESH_MANAGED, g_pd3dDevice, NULL, &pD3DXMtrlBuffer, NULL, &g_dwNumMaterials, &g_pMesh ) ) )
{
MessageBox(NULL, L"Could not find airplane.x", L"Mesh", MB_OK);
return E_FAIL;
}
D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
g_pMeshMaterials = new D3DMATERIAL9[g_dwNumMaterials];
if( g_pMeshMaterials == NULL )
return E_OUTOFMEMORY;
g_pMeshTextures = new LPDIRECT3DTEXTURE9[g_dwNumMaterials];
if( g_pMeshTextures == NULL )
return E_OUTOFMEMORY;
for( DWORD i=0; i<g_dwNumMaterials; i++ )
{
g_pMeshMaterials[i] = d3dxMaterials[i].MatD3D;
g_pMeshMaterials[i].Ambient = g_pMeshMaterials[i].Diffuse;
g_pMeshTextures[i] = NULL;
if( d3dxMaterials[i].pTextureFilename != NULL &&
strlen(d3dxMaterials[i].pTextureFilename) > 0 )
{
WCHAR filename[256];
RemovePathFromFileName(d3dxMaterials[i].pTextureFilename, filename);
if( FAILED( D3DXCreateTextureFromFile( g_pd3dDevice, filename, &g_pMeshTextures[i] ) ) )
{
MessageBox(NULL, L"Could not find texture file", L"Mesh", MB_OK);
}
}
}
pD3DXMtrlBuffer->Release();
return S_OK;
}
VOID Cleanup()
{
if( g_pMeshMaterials != NULL )
delete[] g_pMeshMaterials;
if( g_pMeshTextures )
{
for( DWORD i = 0; i < g_dwNumMaterials; i++ )
{
if( g_pMeshTextures[i] )
g_pMeshTextures[i]->Release();
}
delete[] g_pMeshTextures;
}
if( g_pMesh != NULL )
g_pMesh->Release();

//释放Direct3D设备对象
if( g_pd3dDevice != NULL )
g_pd3dDevice->Release();
if( g_pD3D != NULL )
g_pD3D->Release();
}
VOID Render()
{
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
SetWorldMatrix(); //设置世界矩阵
for( DWORD i=0; i<g_dwNumMaterials; i++ )
{
g_pd3dDevice->SetMaterial( &g_pMeshMaterials[i] );
g_pd3dDevice->SetTexture( 0, g_pMeshTextures[i] );
g_pMesh->DrawSubset( i );
}
g_pd3dDevice->EndScene();
}
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_DESTROY:
Cleanup();
PostQuitMessage( 0 );
return 0;
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,GetModuleHandle(NULL), NULL, NULL, NULL, NULL L"ClassName", NULL };
RegisterClassEx( &wc );
HWND hWnd = CreateWindow( L"ClassName", L"网格模型", WS_OVERLAPPEDWINDOW, 200, 100, 500, 500,GetDesktopWindow(), NULL, wc.hInstance, NULL );
if( SUCCEEDED( InitD3D( hWnd ) ) )
{
if( SUCCEEDED( InitGeometry() ) )
{
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );
MSG msg;
ZeroMemory( &msg, sizeof(msg) );
while( msg.message!=WM_QUIT )
{
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
Render(); //渲染场景
}
}
}
}
UnregisterClass( L"ClassName", wc.hInstance );
return 0;
}
为什么我的这个程序运行了会有错误?
d:\学习\d3d编程\mesh\mesh.cpp(102): error C2664: 'lstrcpyA' : cannot convert parameter 1 from 'LPWSTR' to 'LPSTR'
d:\学习\d3d编程\mesh\mesh.cpp(120): error C2664: 'D3DXLoadMeshFromXA' : cannot convert parameter 1 from 'const unsigned short [11]' to 'LPCSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
d:\学习\d3d编程\mesh\mesh.cpp(122): error C2664: 'MessageBoxA' : cannot convert parameter 2 from 'const unsigned short [26]' to 'LPCSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
d:\学习\d3d编程\mesh\mesh.cpp(155): error C2664: 'D3DXCreateTextureFromFileA' : cannot convert parameter 2 from 'WCHAR [256]' to 'LPCSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
d:\学习\d3d编程\mesh\mesh.cpp(268): error C2664: 'CreateWindowExA' : cannot convert parameter 2 from 'const unsigned short [10]' to 'LPCSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
希望会的人教我,谢谢!
...全文
374 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
只是空想家 2011-04-20
  • 打赏
  • 举报
回复
我就是这么解决的 希望对你有帮助
只是空想家 2011-04-20
  • 打赏
  • 举报
回复
为工程添加UNICODE和_UNICODE预处理选项:打开[工程]->[设置…]对话框,在C/C++标签对话框的“预处理程序定义”中去除_MBCS,加上_UNICODE,UNICODE
只是空想家 2011-04-18
  • 打赏
  • 举报
回复
这个是.net2003下的 我转到vc6.0上也出了同样的问题
gameice 2010-01-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 freedomzcd 的回复:]
普通字符型 跟 宽字符型 之间关系你没明白,自己查下吧.这个是基础的.
[/Quote]


:)
huanyuxiake 2010-01-24
  • 打赏
  • 举报
回复
该下字节
rageliu 2008-04-03
  • 打赏
  • 举报
回复
L""
Wolf_FienD 2008-04-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 freedomzcd 的回复:]
普通字符型 跟 宽字符型 之间关系你没明白,自己查下吧.这个是基础的.
[/Quote]
雪鹰翔天 2008-03-28
  • 打赏
  • 举报
回复
普通字符型 跟 宽字符型 之间关系你没明白,自己查下吧.这个是基础的.
火云洞红孩儿 2008-03-27
  • 打赏
  • 举报
回复
你上百度里查“Unicode"
火云洞红孩儿 2008-03-26
  • 打赏
  • 举报
回复
宽字符函数用在多字节程序中。
你可以在函数上加注A或W。
也或可以对字符串进行宽字符转换
ldcsoftware 2008-03-26
  • 打赏
  • 举报
回复
能不能说详细些啊 !
我不理解
hejinjiang 2008-03-26
  • 打赏
  • 举报
回复
在你的字符串地方都用TEXT("")就行了..TEXT(str)
雪鹰翔天 2008-03-26
  • 打赏
  • 举报
回复
楼上几个都对
Unicode跟多字符集的问题.
这个问题如果能困扰LZ很久,还是先看看基础的东西吧...
Kratos 2008-03-25
  • 打赏
  • 举报
回复
按ALT+F7,配置属性,字符集选择多字节字符集;
LS基本回答了问题。
lxbxl_17 2008-03-25
  • 打赏
  • 举报
回复
双字节 单字节的问题 要加上 U宏

8,303

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧