坦克与地图块的碰撞处理
判定碰撞
在地图块中选取8个点,如果这8个点有一个点与坦克重合,则认定碰撞。
/**
* 一个地图块和当前坦克的碰撞的方法,
* 从tile中一区八个点,判断是否和其中任意一个点有了碰撞
* 点的顺序从左上角开始,顺时针
*/
public boolean isCollideTile(List<MapTile> tiles){
final int len = 2;
for (int i = 0; i < tiles.size(); i++) {
MapTile tile =tiles.get(i);
if(!tile.isVisible() )
continue;
//点 1 左上角
int tileX = tile.getX();
int tileY = tile.getY();
boolean collide = MyUtil.isCollide(x,y,RADIUS,tileX,tileY);
//如果碰上了,直接返回,否则判断下一个点
if (collide){
return true;
}
//点 2 上中
tileX += MapTile.radius;
collide = MyUtil.isCollide(x,y,RADIUS,tileX,tileY);
if (collide){
return true;
}
//点 3 右上角
tileX += MapTile.radius;
collide = MyUtil.isCollide(x,y,RADIUS,tileX,tileY);
if (collide){
return true;
}
//点 4 右中角
tileY += MapTile.radius;
collide = MyUtil.isCollide(x,y,RADIUS,tileX,tileY);
if (collide){
return true;
}
//点 5 右下角
tileY += MapTile.radius;
collide = MyUtil.isCollide(x,y,RADIUS,tileX,tileY);
if (collide){
return true;
}
//点 6 下中点
tileX -= MapTile.radius;
collide = MyUtil.isCollide(x,y,RADIUS,tileX,tileY);
if (collide){
return true;
}
//点 7 左下角
tileX -= MapTile.radius;
collide = MyUtil.isCollide(x,y,RADIUS,tileX,tileY);
if (collide){
return true;
}
//点 8 左中
tileY -= MapTile.radius;
collide = MyUtil.isCollide(x,y,RADIUS,tileX,tileY);
if (collide){
return true;
}
//点 9 中间
tileX +=MapTile.radius;
collide = MyUtil.isCollide(x,y,RADIUS,tileX,tileY);
if (collide){
return true;
}
}
return false;
}
坦克与地图块碰撞后应该回退
在Tank类中修改move方法,记录旧坐标。
//坦克移动功能和边界的处理
private int oldX = -1, oldY = -1;
private void move(){
oldX = x;
oldY = y;
switch (dir){
case DIR_UP:
y -=speed;
if (y < RADIUS + GameFrame.titleBarh){
y = RADIUS + GameFrame.titleBarh;
}
break;
case DIR_DOWN:
y +=speed;
if (y > Constant.FRAME_HEIGHT-RADIUS){
y = Constant.FRAME_HEIGHT-RADIUS;
}
break;
case DIR_LEFT:
x -=speed;
if (x < RADIUS){
x = RADIUS;
}
break;
case DIR_RIGHT:
x +=speed;
if (x > Constant.FRAME_WIDTH - RADIUS){
x = Constant.FRAME_WIDTH - RADIUS;
}
break;
}
}
回退方法
/**
* 坦克回退的方法
*/
public void back(){
x = oldX;
y = oldY;
}