边界检测,坦克不能抛出界面范围(18)(写代码如何减少垃圾器的回收)

移动的时候不能出边界:
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;//位置改变重新赋值
}

坦克也是如此:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值