天天看點

坦克大戰—day 25

  1.生成的地圖塊不能重疊

private void initMap() {
        final int count =20;
        for (int i = 0; i < count; i++) {
            MapTile mapTile = MapTilePool.get();
            int x = MyUtil.getRandomNumber(MAP_X,MAP_X+MAP_WIDTH-MapTile.tileW);
            int y = MyUtil.getRandomNumber(MAP_Y,MAP_X+MAP_HEIGHT-MapTile.tileW);
           if(isCollide(tiles,x,y))
           {
               i--;
               continue;
           }
            mapTile.setX(x);
            mapTile.setY(y);
            tiles.add(mapTile);
        }
    }
    private boolean isCollide(List<MapTile>tiles,int x,int y)
    {
        for(MapTile tile: tiles)
        {
            int tileX=tile.getX();
            int tileY=tile.getY();
            if(Math.abs(tileX-x)<MapTile.tileW&&Math.abs(tileY-y)<MapTile.tileW)
            return true;

        }
        return false;
    }
           

2.子彈和地圖塊的碰撞

在mapTile類:

//地圖塊是否和子彈有碰撞
    public boolean isCollideBullet(List<Bullet> bullets){
       
        for (Bullet bullet : bullets) {
            int bulletX = bullet.getX();
            int bulletY = bullet.getY();
            boolean collide = MyUtil.isCollide(x + radius, y + radius, radius, bulletX, bulletY);
            if (collide){
                
                return true;
            }
        }return false;
    }
           

在Tank類中調用:

//坦克的子彈和地圖塊的碰撞
    public void bulletsCollideMapTile(List<MapTile> tiles){
    
        for (int i = 0; i < tiles.size(); i++) {
            MapTile tile = tiles.get(i);
            if (tile.isCollideBullet(bullets)){
                //添加爆炸效果
                addExplode(tile.getX() + MapTile.radius, tile.getY() + MapTile.tileW);

                }
            }
        }
           

進而在GameFrame類調用:

//所有的子彈和地圖塊的碰撞
    private void bulletAndTanksCollideMapTile() {
        //自己的坦克的子彈和地圖塊的碰撞
        myTank.bulletsCollideMapTile(gameMap.getTiles());
        //敵人所有的坦克和地圖塊的碰撞
        for (int i = 0; i < enemies.size(); i++) {
            Tank enemy = enemies.get(i);
            enemy.bulletsCollideMapTile(gameMap.getTiles());
        }
    }
           
private void drawRun(Graphics g) {
        g.setFont(GAME_FONT);

        //繪制黑色的背景
        g.setColor(Color.black);
        g.fillRect(0, 0, FRAME_WIDTH, FRAME_HEIGHT);

        gameMap.draw(g);
        drawEnemies(g);
        myTank.draw(g);
        bulletCollideTank();
        drawExplode(g);
        bulletAndTanksCollideMapTile();
    }
           

繼續閱讀