2006-04-01(RTTI)

本文介绍了一种在游戏开发中利用运行时类型识别(RTTI)和动态创建对象(DynamicCreation)来简化游戏对象生成的方法。通过定义枚举类型作为对象ID,并结合XML配置文件和宏定义,实现了灵活高效的游戏对象实例化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我又回来啦!虽然这几天任务没有什么进展,过不那已成为过去了。

 

RTTI          :运行时期类型识别

Dynamic Creation:动态创建对象

经过几天,我发现我需要一个简单的RTTI以及一个Dynamic Creation。假如后面要做保存的话可能需要一个 永久保存机制,也许就好象MFC做的那种方法吧。

 

首先说说为什么要RTTI Dynamic Creation。因为我的游戏中的地图是以 资源ID的方式存放的。也就是说,我们要通过资源ID生成游戏对象需要一个这样的函数:

CGameObject *Create(int nObjID)

 

假如我们不使用RTTI,那么必然导致类似于

switch (id)

case 1:

case 2:

case 3:

这样的代码,而游戏中游戏对象ID估计后面会有1百多个,这是很难做到的。

 

 

现在说说我的方法:

1>     首先在XML资源文件中定义游戏对象ID,以及相关参数

    <myobj name="bomman1" id="1" type=”1”

width="32" height="32" up_spr="1" down_spr="2" left_spr="3" right_spr="4" spr="1"/>

 

2>     VC中定义了游戏对象大体的类型,这些类型址接映射到游戏的代码中相应的class中。就相当于这些classTYPE了。它是这样的:

   enum GAME_OBJECT_TYPE{

       EM_GAME_UNKNOW     = 0,  //用于错误判断

       EM_GAME_PLAYER     = 1,  //游戏中的玩家

       EM_GAME_BOM        = 2,  //炸弹

       EM_GAME_BACKGROUND = 3,  //游戏背景

       EM_GAME_COLLISION  = 4,  //游戏碰撞物

       EM_GAME_SPRIZE     = 5   //游戏奖品};

 

3>     每个游戏对象都应该提供一个动态生成的方法:

typedef CGameObject *CREATE_GAME_OBJ(GAME_OBJECT_TYPE type/*对象类型*/,

void *param/*创建对象的参数*/,int nSize /*参数大小*/);

 

  typedef CGameParam COVER_GAME_PARAM(GAME_OBJECT_TYPE type/*对象类型*/

   CL_Resource &res/*XML中读取出来的参数字符串*/)

4>     提供一个宏,用于方便的为游戏类生成一些必要的东西:

1.       创建建立对象的方法(CREATE_GAME_OBJ)

2.       创建把XML资源数据转换为二进制数据的方法

3.       把该类的类型信息插入RTTI的表中

 

 

 

5>     与深入浅出MFC中的相关不同的是

1.      我的类型是以 枚举型为KEY,而MFC则是以字符串。

2.      在动态生成的函数指针有带参数,用于适应对象函造参数的不同。

6>     初始化的时候从XML中把所有对象ID以及相当数据读出来生成一个表

Struct {

对象ID,为该表的KEY(实际上就是stl::map中的key)

RTTI中的该类的信息指针

该对象构造参数的二进制数据
}

7>     现在就可以通过其ID创建其对象

 

上面就说到这里,因为是日志,所以更详细的技术细节只能是以后看正式的文档。

当动态生成游戏对象实现之后,我们可以再把控制方法加入到游戏中。到时就可以看到

游戏人物在地图上移动了。

 

 

对于后面的游戏开发,我们要做到什么程度呢?

在这里我承诺:

1.  最多支持同时8人对战

2.  支持录象保存功能

3.  支持网络连线功能

4.  支持游戏手柄,等输入设置

5.  游戏的体验与NEOGEO的那个BOMMAN游戏差不多。

 

 

 

参考书籍:深入浅出MFC
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值