在看到《DirectX 角色扮演游戏编程》这书第二章中的.x程序,运行光盘上的代码出错
error C2664: 'D3DXLoadSkinMeshFromXof' : cannot convert parameter 1 from 'IDirectXFileData *' to 'LPD3DXFILEDATA'
后来才发现,这书上的代码都是DirectX9b版本的,而我用的是DirectX9c,因为9c是9b的升级版,不想用回9b了,于是想在9c中解决这个问题。
从DirectX SUMMER2004(dx9c)之后才增加了ID3DXFileData,网上都说它是原来IDirect3DFileData的升级,具体性能上有什么提高我也是不清楚,但是因为这个改动导致一些函数调用产生了挺郁闷的错误,首先是我现在遇到的这个D3DXLoadSkinMeshFromXof()函数了,还有一些与.x有关的一些函数也出现了问题,像D3DXLoadPatchMeshFromXof(),D3DXLoadMeshFromXof()等函数的参数改变了DX9.0B的版本是IDirect3DFileData的参数现在改成了ID3DXFileData。再者就是以前版本的遍历.X文件中的骨骼的函数改变了原先是通过IDirect3DFileData的是通过IDirectXFileEnumObject::GetNextDataObject()来查看下一个对象,现在是通过ID3DXFileEnumObject::GetChildren(获取总体节点个数)和ID3DXFileEnumObject::GetChild()(与GetNextDataObject()的作用差不多,但由以前的一个变成了二个函数,参数也不对了)之后其他的基本上就差不多是把IDirectX*****改成ID3DX****,当然还有部分原来的类型被废除了。
再说下遍历.X文件中的骨骼的函数吧,以《DirectX 角色扮演游戏编程》这书第二章中的.x程序为例
在9b版本中(部分代码)
IDirectXFile *pDXFile = NULL; IDirectXFileEnumObject *pDXEnum = NULL; IDirectXFileData *pDXData = NULL; sFrame *Frame; … … // Allocate a frame that becomes root
Frame = new sFrame();
// Loop through all objects looking for the frames and meshes
while(SUCCEEDED(pDXEnum->GetNextDataObject(&pDXData))) { ParseXFileData(pDXData, Frame); ReleaseCOM(pDXData); }
|
到9c版本中则改成(以下为本人在网上收信集资料,自己改的,并不是最好的,但能正常编释运行)
ID3DXFile *pDXFile = NULL; ID3DXFileEnumObject *pDXEnum = NULL; ID3DXFileData *pDXData = NULL; sFrame *Frame; … …
// allocate a Frame that becomes root
Frame = new sFrame(); // Loop through all objects looking for the frames and meshes
SIZE_T num_child;
// retrieve the number of children in this file data object
pDXEnum->GetChildren(&num_child);
// loop through all objects looking for the frames and meshes
for(SIZE_T i = 0; i < num_child; i++) { // retrieves a child object in this file data object
if(FAILED(pDXEnum->GetChild(i, &pDXData))) return NULL; // parse pDXFile data
ParseXFileData(pDXData, Frame); ReleaseCOM(pDXData) }
|
都不知道微软玩什么,看上去只有更复杂,本人还不是很明白升级后有什么优点。
经过在网上乱逛,本人也只是大致了解这个的一些基本用法,致于性能上的区别还是不懂。先学会用,以后时间长了,用多了,慢慢的就会了解一些的。下面附上《DirectX 角色扮演游戏编程》这书第二章中的.x程序书中的dx9b版及本人修改的dx9c版本,希望对遇到同样问题的朋友有帮助,本代码仅供参考,有错误还请指出…
阅读(2297) | 评论(0) | 转发(0) |