游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1419|回复: 0

.X文件的一些问题

[复制链接]

20

主题

84

帖子

84

积分

注册会员

Rank: 2

积分
84
发表于 2010-1-7 14:40:00 | 显示全部楼层 |阅读模式
最近遇上一些.X文件相关的问题,希望大家能帮我解答下,先谢谢了。
《DirectX 角色扮演游戏编程》中p104:
“整个.X文件格式是基于模板的”
什么是.X文件中的模板?
什么是.X文件中的框架模板?


---------------------------------------------------------
解析.X文件的函数:
BOOL ParseXFile(char *Filename)
{
 IDirectXFile *pDXFile = NULL;
 IDirectXFileEnumObject *pDXEnum = NULL;
 IDirectXFileData *pDXData = NULL;

 // 建立DirectXFile对象
 if(FAILED(DirectXFileCreate(&pDXFile)))
  return FALSE;

 // 注册使用的模版
 // 使用标准的Direct3D保留模式模版

 if(FAILED(pDXFile->RegisterTemplates((LPVOID)D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES))) {
  pDXFile->Release();
  return FALSE;
 }

 // 建立列举器对象
 if(FAILED(pDXFile->CreateEnumObject((LPVOID)Filename, DXFILELOAD_FROMFILE, &pDXEnum))) {
  pDXFile->Release();
  return FALSE;
 }

 // 列举所有最高层模版
 while(SUCCEEDED(pDXEnum->GetNextDataObject(&pDXData))) {
  ParseXFileData(pDXData);
  ReleaseCOM(pDXData);
 }

 // 释放对象
 ReleaseCOM(pDXEnum);
 ReleaseCOM(pDXFile);

 // 返回
 return TRUE;
}

void ParseXFileData(IDirectXFileData *pData)
{
 IDirectXFileObject *pSubObj = NULL;
 IDirectXFileData *pSubData = NULL;
 IDirectXFileDataReference *pDataRef = NULL;
 const GUID *pType = NULL;
 char *pName = NULL;
 DWORD dwSize;
 char *pBuffer;

 // 取得模版类型
 if(FAILED(pData->GetType(&pType)))
  return;

 // 取得模版名称(如果有)
 if(FAILED(pData->GetName(NULL, &dwSize)))
  return;
 if(dwSize) {
  if((pName = new char[dwSize]) != NULL)
   pData->GetName(pName, &dwSize);
 }

 // 如果模版没有名称,给他一个默认的名称
 if(pName == NULL) {
  if((pName = new char[9]) == NULL)
   return;
  strcpy(pName, "Template");
 }

 // 判断模版的类型,并且对其进行操作
 // 在这部分可以加入你自己的代码

 if(*pType == TID_D3DRMFrame) {
  MessageBox(NULL, pName, "Frame template found", MB_OK);
 }

 if(*pType == TID_D3DRMMesh) {
  MessageBox(NULL, pName, "Mesh template found", MB_OK);
 }

 if(*pType == TID_D3DRMMaterial) {
  MessageBox(NULL, pName, "Material template found", MB_OK);
 }

 if(*pType == TID_D3DRMFrameTransformMatrix) {
  MessageBox(NULL, pName, "Frame transformation matrix template found", MB_OK);

  // 获得模版中的数据Get the template data
  if(FAILED(pData->GetData(NULL, &dwSize, (PVOID*)&pBuffer)))
   return;

  // 可以对数据进行任何操作。  
  // 注意在进行操作之前要把数据从缓冲中复制出来
 }

 // 扫描以得到内层模版
 while(SUCCEEDED(pData->GetNextObject(&pSubObj))) {

  // 递归处理内层模版数据
  if(SUCCEEDED(pSubObj->QueryInterface(IID_IDirectXFileDataReference, (void**)&pDataRef))) {
   if(SUCCEEDED(pDataRef->Resolve(&pSubData))) {
    ParseXFileData(pSubData);
    ReleaseCOM(pSubData);
   }
   ReleaseCOM(pDataRef);
  }

  // Process non-referenced embedded templates
  if(SUCCEEDED(pSubObj->QueryInterface(IID_IDirectXFileData, (void**)&pSubData))) {
   ParseXFileData(pSubData);
   ReleaseCOM(pSubData);
  }
  ReleaseCOM(pSubObj);
 }

 // 释放名称缓冲
 delete pName;
}

(原文:http://unfadinglove.bokee.com/1484772.html)

-------------------------------------------------------------
“函数ParseXFile完成初始化IDirectXFile对象的工作,这项工作在打开.X 文件的同时完成。然后,你需要注册(Register)一个你要在.X文件中寻找的模版的列表。”
为什么要注册一个模板列表?这个列表是什么?

代码中
// 列举所有最高层模版
 while(SUCCEEDED(pDXEnum->GetNextDataObject(&pDXData))) {
  ParseXFileData(pDXData);
  ReleaseCOM(pDXData);
 }
这里“最高层模版”是什么?


            |->头部
跟框架-胸部 |->上臂
            |     |->前臂
            |           |->手
            |
            |->大腿
                  |->小腿
                        |->脚

在这样的“框架层次中”,最高层模板是指“头、上臂、大腿”?

------
const GUID *pType = NULL;
// 取得模版类型
 if(FAILED(pData->GetType(&pType)))
  return;
// 判断模版的类型,并且对其进行操作
 // 在这部分可以加入你自己的代码

 if(*pType == TID_D3DRMFrame) {
  MessageBox(NULL, pName, "Frame template found", MB_OK);
 }

 if(*pType == TID_D3DRMMesh) {
  MessageBox(NULL, pName, "Mesh template found", MB_OK);
 }

 if(*pType == TID_D3DRMMaterial) {
  MessageBox(NULL, pName, "Material template found", MB_OK);
 }

 if(*pType == TID_D3DRMFrameTransformMatrix) {
  MessageBox(NULL, pName, "Frame transformation matrix template found", MB_OK);

globally unique identifier (GUID)这个东西怎么能判断类型的?
----------------------------------------------------------------
《DirectX 角色扮演游戏编程》中p106:
“(解析一个.X文件时)搜索整个对象的层次,查找想要使用的数据对象(网格模型和框架的对象)。最困难的部分是要记住那些嵌入到其他对象中的对象,因而可能会遇到对象的引用,而不是对象。”
  if(SUCCEEDED(pSubObj->QueryInterface(IID_IDirectXFileDataReference, (void**)&pDataRef))) {
   if(SUCCEEDED(pDataRef->Resolve(&pSubData))) {
    ParseXFileData(pSubData);
    ReleaseCOM(pSubData);
   }
   ReleaseCOM(pDataRef);
  }

  // Process non-referenced embedded templates
  if(SUCCEEDED(pSubObj->QueryInterface(IID_IDirectXFileData, (void**)&pSubData))) {
   ParseXFileData(pSubData);
   ReleaseCOM(pSubData);
  }
  ReleaseCOM(pSubObj);
 }

.X文件中“对象的引用”与“对象”是什么区别?
pDataRef->Resolve(&pSubData)是什么意思?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-16 19:26

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表