Math.floor可换成int()或者其他取整方法,对as2同
得到bulletMapX = 20,bulletMapY = 10,即其在数组地图上坐标。 只检测数组地图上的(20,10)位置标识,即可判断炮弹应继续飞行还是爆炸,如果爆炸杀伤的目标是谁。 SLG游戏可能需要自动寻路。数组地图公认A*算法为先进高效的寻路方法,该算法可于百度搜索到,不再赘述。
3.2 游戏->俯视->限定移动->不完全限定移动 特点:某游戏主要使用键盘操作,玩家只能向上下左右移动,障碍物是矩形障碍,大小和坐标可能不统一,没有小于玩家大小的障碍。 举例:赤色要塞、魂斗罗2的第二关等ACT游戏,大部分手柄操作的ARPG如黄金太阳(GBA)、赛达尔传说(NDS前的版本)。 此类游戏可以使用点描述方法检测碰撞,用顶点作为碰撞点,其点碰描述整个物体碰撞的方法。 图中红色点即为顶点,其坐标为(player.x±20,player.y±20) 在“地图没有小于玩家的物体”条件下,“玩家碰撞物体”等价于“不少于1个顶点碰撞了物体” 使用DisplayObject/hitTestPoint前,需将所有地图上固定的物体放入一个容器内,而不要用for循环检测与每个物体的碰撞。 运动物体虽然可以放入这个容器,但是运动物体往往是玩家自身或者需要运动碰撞检测的敌人自身,放入容器会导致和自身的碰撞检测,恒为true,没有意义。 解决办法是将碰撞点向外侧移动。略微放大碰撞区域,这样就不会与自身碰撞。 如碰撞区域必须小于等于运动物体实际图形大小,那么必须单独在运动物体之间检测碰撞(运动物体数量少使用for循环,如果运动物体过多需较高的解决方法,参加4楼使用BitmapData/hitTest的办法),不能使用这个方法。 如地图上的固定元素有小于玩家宽高大小,但是不小于玩家宽高大小一半的大小,请适当增加碰撞点数量
(4):360度不限定移动类型
特点:可能使用键盘或鼠标操作,玩家可以向任意方向移动,障碍物形状未必固定,大小和坐标未必统一,所有元素自由度非常高。 举例:赛车类游戏,大部分战争题材纵版游戏 此类游戏可以使用位图碰撞、点描述和函数描述的办法检测碰撞。
4.1 游戏->俯视->不限定移动->位图碰撞 使用BitmapData/hitTest 具体办法是将玩家用BitmapData.draw方法转成位图数据(注意,这个方法不会考虑玩家的缩放) 地图可能非常大(比如2000x1500)这个转换成位图效率非常低下。 正确的做法是根据玩家坐标,只描绘玩家周围的一小部分位图。 描绘区域高度有 玩家 |