坦克大战—day 24

地图的简单实现

由于在游戏中砖块可以被销毁,所以使用对象池。

package util;

import map.MapTile;

import java.util.ArrayList;
import java.util.List;

public class MapTilePool {
    public static  final int DEFAULT_POOL_SIZE=50;
    public static  final int DEFAULT_POOL_MAX_SIZE=70;

    private static List<MapTile> pool =new ArrayList<>();

    static {
        for(int i=0;i<DEFAULT_POOL_SIZE;i++)
            pool.add(new MapTile());
    }

    /**
     * 从对象池中获取一个对象
     * @return
     */
    public static MapTile get()
    {
        MapTile mapTile = null;
        //判断对象池是否为空
        if(pool.size()==0){
            //生成对象
            mapTile =new MapTile();
        }
        else  {
            //拿走第一个位置上的对象
           mapTile = pool.remove(0);
        }
        return mapTile;
    }
    //归还
    public static void theReturn(MapTile mapTile){
        if(pool.size()==DEFAULT_POOL_MAX_SIZE)
            return;
        pool.add(mapTile);
    }
}

在map包创建GameMap类。

package map;

import game.GameFrame;
import tank.Tank;
import util.Constant;
import util.MapTilePool;
import util.MyUtil;

import java.awt.*;
import java.util.ArrayList;
import java.util.List;


public class GameMap {
    private int x,y;
    private int width;
    private int height;

    public static final int MAP_X=Tank.RADIUS*3;
    public static final int MAP_Y=Tank.RADIUS*3+ GameFrame.titleBarh;
    public static final int MAP_WIDTH = Constant.FRAME_WIDTH-Tank.RADIUS*6;
    public static final int MAP_HEIGHT = Constant.FRAME_HEIGHT-Tank.RADIUS*8-GameFrame.titleBarh;

    private List<MapTile> tiles = new ArrayList<>();

    public GameMap(){
       initMap();
    }

    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);
            mapTile.setX(x);
            mapTile.setY(y);
            tiles.add(mapTile);
        }
    }
    public void draw(Graphics g)
    {
        for(MapTile tile :tiles)
        {
            tile.draw(g);
        }
    }
}

在GameFrame调用

private void newgame() {
        gameState = STATE_RUN;
        //创建坦克对象,敌人的坦克对象
        myTank = new MyTank(FRAME_WIDTH/3, FRAME_HEIGHT-Tank.RADIUS, Tank.DIR_UP);
        //使用一个单独的线程用于控制生产敌人的坦克
       new Thread(() -> {
           while (true) {
               if(enemies.size()<ENEMY_MAX_COUNT)
               {
                   Tank enemy= EnemyTank.createEnemy();
                   enemies.add(enemy);
               }
               try {
                   Thread.sleep(ENEMY_BORN_INTERVAL);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
               if(gameState!=STATE_RUN)
               {
                   break;
               }
           }
       }).start();
       gameMap = new GameMap();
    }
//重置游戏状态
    private void resetGame(){

        menuIndex = 0;
        //先让自己坦克的子弹还回对象池
        myTank.bulletsReturn();
        //销毁自己的坦克
        myTank = null;
        //清空敌人相关资源
        for(Tank enemy:enemies) {
            enemy.bulletsReturn();
        }
        enemies.clear();
        //清空地图资源

        gameMap=null;
    }
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);
    }

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值