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();
}