【转】D3DXLoadSkinMeshFromXof函数及.x在不同dx版本中

在看到《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版本,希望对遇到同样问题的朋友有帮助,本代码仅供参考,有错误还请指出…
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(961) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值