我又回来啦!虽然这几天任务没有什么进展,过不那已成为过去了。
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中。就相当于这些class的TYPE了。它是这样的:
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