坦克大战—day 27

坦克与地图块的碰撞处理

判定碰撞

在地图块中选取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;
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值