地图的简单实现
由于在游戏中砖块可以被销毁,所以使用对象池。
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);
}