|

- 帖子
- 3146
- 积分
- 383
- 技术分
- 29
- 来自
- 黑龙江
- 在线时间
- 231 小时
- 注册时间
- 2007-3-17
|
标准的坦克大战适用于“数组地图”碰撞检测方法,但是有特殊因素,玩家未必像普通RPG一样每次走满一个格子。
坦克大战的地图非常有规则,每个地图单位均是相同大小的方块。
根据地图形成一个数组,用1来表示墙壁,0来表示通路,假设如下:
var map:Array = [
[1,1,1,1,1,1,1,1,1,1],
[1,0,0,0,0,0,1,0,0,1],
[1,0,0,0,1,1,1,0,0,1],
[1,0,0,0,1,0,0,0,0,1],
[1,0,0,0,1,1,1,1,0,1],
[1,0,0,0,0,0,0,0,0,1],
[1,1,1,1,1,1,1,1,1,1]];
设每个方格的大小都是30x30,左上注册,第一个方格剪辑坐标(0,0)
玩家(player)初始坐标(x=30,y=30),对应map[1][1]位置。下文使用
玩家(player)移动速度是3(10帧走完一格)
玩家每次左移动需要做如下判定(伪码):
if(player.x%30){ //如果坦克横坐标不是30的整数倍,此刻坦克肯定没有紧贴墙壁,无条件批准这次移动
批准移动;
}else{//否则可能碰到墙壁,需要判断能否移动
if(player.y%30){//如果坦克纵坐标不是30的整数倍,坦克最多可能碰到两块墙壁
if(map[int(player.y/30)][player.x/30-1]||map[int(player.y/30)+1][player.x/30-1]){
禁止移动
}else{
批准移动
}
}else{//否则坦克只能碰到一块墙壁
if(map[player.y/30][player.x/30-1]){
禁止移动
}else{
批准移动
}
}
}
本帖所有坐标直接用了flash中的坐标计算,
实际制作时为了方便管理和提高效率,可以专门用变量记录坦克当前位置对应数组的哪部分。
使用这个思路一定保证所有除法是整除,不会出现小数,否则会很麻烦。 |
|