移动的时候不能出边界:
boundsCheck();
private void boundsCheck() {
if (this.x < 0) {//坦克不能出左边界
this.x = 0;
}
if(this.x > (TankFrame.GAME_WEIGHT - Tank.getWIDTH())){//坦克不能出右边界
x=TankFrame.GAME_WEIGHT- Tank.getWIDTH();
}
if(this.y < 30){//坦克不能出上边界
y= 30;
}
if(this.y >= (TankFrame.GAME_HIGHE - Tank.getHEIGHT())){ //坦克 不能开出下边界
y= TankFrame.GAME_HIGHE- Tank.getHEIGHT();
}
}
看看碰撞检测这个方法有什么问题呢?
public void collidewith(Tank tank) {
if(this.group == tank.getGroup()) return;//如果当前的子弹跟坦克是一个组的就不碰撞检测。
Rectangle rect1 = new Rectangle(this.x, this.y, WIDTH, HEIGHT);
Rectangle rect2 = new Rectangle(tank.getX(), tank.getY(), Tank.WIDTH, Tank.HEIGHT);
if (rect1.intersects(rect2)) {
tank.die();
this.die();
int ex = tank.getX() + Tank.WIDTH / 2 - Explode.WIDTH / 2;
int ey = tank.getY() + Tank.HEIGHT / 2 - Explode.HEIGHT / 2;
tankFrame.explodes.add(new Explode(ex,ey,tankFrame));
}
}
每次碰撞都要创建2个Rectangle 对象,如果有m个坦克,每个坦克打n个子弹,那么每次的检测碰撞就会有2mn个对象产生,虽然会被回收,但是增加了GC的频率。从而影响游戏的体验
在坦克和子弹的类中各自要有Rectangle的引用,在创建的时候和移动的时候要个给它赋值;
代码如下:
Rectangle rect = new Rectangle();
private boolean living = true;
private TankFrame tankFrame = null;
private Group group = Group.BAD;
public Bullet(int x, int y, Dir dir, TankFrame tankFrame,Group group) {
this.x = x;
this.group=group;
this.y = y;
this.dir = dir;
this.tankFrame = tankFrame;
rect.x=this.x;
rect.y=this.y;
rect.width=WIDTH;
rect.height=HEIGHT;
}
private void move() {
switch (dir) {
case LEFT:
x -= SPEED;
break;
case UP:
y -= SPEED;
break;
case RIGHT:
x += SPEED;
break;
case DOWN:
y += SPEED;
break;
}
rect.x=this.x;//位置改变重新赋值
rect.y=this.y;//位置改变重新赋值
}
坦克也是如此: