要实现魔塔,首先是将图片做成tmx画出来。
tmx的图片分为好几层。每一层有不同的作用,主要的有瓦片层、对象层和固态层。
可以通过函数直接获取层上的每一个对象。
第一步自然是显示,将该显示的层都显示出来。
疑问:对象层的楼梯是如何显示的?
第二步则是英雄的移动。
分为移动触发、移动前检测、英雄移动或者其他事件的触发。
第三步则是精灵等对象的反应。
分为触发和动作。
以英雄作为主要的事件触发者。也以英雄的行动作为游戏主进程。
触发英雄移动
得到英雄的下一个位置p,检查该层p处是否有对象,以结果为依据将指令传给英雄和对象。
动作执行完成之前无法再次触发英雄的移动
如果给触发定义一个优先级会怎样?
主动触发的只有按键,其他都是被动触发。只要被动触发之前没有时间重叠区域
getNextTileCoord(方位)
{
return 当前位置+位移;
}
getMoveBy(方位)
{
return 位移;
}
英雄有三种动作Move,kill和getItem
英雄提供信息表明自己的动作是否已经处理完。
执行动画,销毁
如何销毁一个对象?
在碰撞检测的时候,是通过遍历图层的每一个节点来进行的。
用一个全局的类来保存地图信息,在碰撞检测后传入待销毁对象的位置即可。
执行操作
单例类,保存每个层的对象信息
构造的时候传入父节点以便添加
removeTileAt()//删除某个位置的对象,不包括地面层对象 和固体对象层
根据不同的层给出不同的行动
通过获取精灵的位置,以及精灵的速度,来将其与固态层进行比较。
得到英雄的下一个位置p,检查该层p处是否有对象,以结果为依据将指令传给英雄和对象。
将逻辑抽象成数据与代码分离。
CCTMXTiledMap对象只负责初始的读取,对于地图数据的读写操作需要自己进行管理。
瓦片层与对象层的区别在哪里?
成员:
bWorking
函数:
getNextTileCoord(方位)
{
return 当前位置+位移;
}
getMoveBy(方位)
{
return 位移;
}
英雄有三种动作Move,kill和getItem
implements Singleton //单例类,保存每个层的对象信息
init(CCNode *parent);//构造的时候传入父节点以便添加
removeTileAt()//删除某个位置的对象,不包括地面层对象 和固体对象层
getLayer(enLayer);
根据不同的层给出不同的行动
takeAction(enLayer)
管理关闭和英雄移动的方位按键
实现Touch功能
控制游戏的运行,管理所有游戏相关的节点。
onTouch(enDirection);//触发英雄移动
- CollisionHandle();//得到英雄的下一个位置p,检查该层p处是否有对象,以结果为依据将指令传给英雄和对象。
动作执行完成之前无法再次触发英雄的移动
GameLayer 还要负责自己的移动,在确定英雄需要移动后,根据条件判断是英雄移动还是图层移动。
管理GameLayer 与MenuLayer的交互。
检测英雄是否还在行动,并合理阻止Touch事件。
enum enLayer
{
……
}
enum enDirection
{
……
}
对地图的移动本质上是对英雄
先处理零散的,对其他类没有依赖的类对象。