接下来完成的目标:玩家能在地图上行走,并且有碰撞检测。
目标队列:
1.玩能在地图上行走,并且有碰撞检测。
2.读文件地图数据
3.实现炸弹
4.实现奖品
?代表有部分近期完成
(*)代表近期完成
X代表近期不会制做
游戏系统:
程序管理器(*)
|
|--程序库初始化(*)
|
|--应用程序WINDOWS消息响应(*)
|
|--产生游戏世界(*)
游戏世界(CGameWorld)?
|
|---游戏对象ID管理器(*)
|
|----游戏地图(*)
|
|---特殊碰撞物辅助列表X
|
|----游戏主循环(*)
资源管理器 (?)
|
|---精灵资源管理(动画管理)(*)
|
|---图片管理 (X)
|
|---声音管理 (X)
输入设备管理(*)
|---输入设备接口(把所有输入信号转换为 ”上下左右AB“ 这类控制信息。(*)
相关支持系统
|
|--自定义RTTI(*)
主要游戏类关系图::
CGameObject (?)
|
|--CGameWorld (?)
|
|--CMover (?)
| |
| |--CBomb (X)
| |
| |--CPlayer (*)
| |
| |--CMounster (X)
|
|--CPrize (X)
|
|--CFire (X)
|
|--CCollision (*)
| |
| | --CBox (*)
| |
| | --CStone (*)
|
|--CDieMoive(*)
游戏类简单说明:
CGameObject:提供游戏对象基本接口,如对象激活、对象二进制化(序列化)、对象显视等
CGameWorld :产生游戏对象、拥有地图、可以遍历所有游戏对象
CBomb :游戏中的炸弹,也具有障碍功能。
CPlayer :游戏中的玩家
CMounster :游戏中的怪物
CPrize :游戏奖品
CBox、CStone:游戏中的碰撞物,分别是:Box能被炸坏并且可能会穿墙,CStone石头是怎样都不会变化的,但是一定是阻挡物。
CDieMoive :死亡动画,其对象不会对任游戏对象产生作用,当人物或怪物死后就会产生。
游戏中的碰撞检测:
先说说更新后的一般碰撞规则:
1>所有碰撞物不能重叠
2>移动者在产生碰撞的的前一刻,立即停止运动。
再来看看最新的游戏地图中的格子:
struct ITEM
{
struct
{
soft; //有穿墙可以被穿透功能就可以穿透
hard; //任何方式都不可以穿透
}coll;
bomb; //炸弹ID
fire ; //火焰ID
};
地图数据则类似这样 GameMap[colY][colX];
几种最当出现在事件都放在这些方格中了,当我想检测前面是否有碰撞,直接就可以地图中取出数据。这是最快的方式了。
关于炸弹的移动,箱子的移动功能的实现:
其实这些都不是目前的目标,不过还是给出相关实现的方法思路,
这两种物体其实是又能检测碰撞(移动物体)、本身自已又产生碰撞的。
对于这种物体在移动的时间,我们可以先把在地图中的相关数据抽除,并且把其自身的ID加入特殊碰撞队列中,在特殊碰撞队列中的碰间检测就是
精确的检测了。
其实现在就是两种碰撞检测方式都在同时使用,当使用数组的话就是最快的,当使用碰撞队列就是最精确的。