地图的重新生成和敌人坦克的重新生成
1.将老巢的地图块换成图片
MapTile类:
package map;
import game.Bullet;
import util.BulletPool;
import util.MyUtil;
import java.awt.*;
import java.util.List;
public class MapTile {
//四种不同的元素块
public static final int TYPE_NORMAL = 0;
public static final int TYPE_HOUSE = 1;
public static final int TYPE_COVER = 2;
public static final int TYPE_HARD = 3;
//地图块的宽度
public static int tileW = 40;
public static int radius = tileW >> 1;
private int type = TYPE_NORMAL;
private static Image[] tileImg;
static {
tileImg = new Image[4];
tileImg[TYPE_NORMAL] = MyUtil.createImage("res/tile.png");
tileImg[TYPE_HOUSE] = MyUtil.createImage("res/house.png");
tileImg[TYPE_COVER] = MyUtil.createImage("res/cover.png");
tileImg[TYPE_HARD] = MyUtil.createImage("res/hard.png");
if(tileW <= 0){
tileW = tileImg[TYPE_NORMAL].getWidth(null);
}
}
//砖块左上角坐标
private int x,y;
private boolean visible = true;
public MapTile(){
}
public MapTile(int x, int y) {
this.x = x;
this.y = y;
if(tileW <= 0){
tileW = tileImg[TYPE_NORMAL].getWidth(null);
}
}
public void draw(Graphics g){
if(!visible)
return;
if(tileW <= 0){
tileW = tileImg[TYPE_NORMAL].getWidth(null);
}
g.drawImage(tileImg[type],x,y,null);
}
//地图块是否和子弹有碰撞
public boolean isCollideBullet(List<Bullet> bullets){
if (!visible )//|| type == TYPE_COVER)
return false;
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){
//子弹的销毁
bullet.setVisible(false);
BulletPool.theReturn(bullet);
return true;
}
}
return false;
}
//判断当前的地图块是否是老巢
public boolean isHouse(){
return type == TYPE_HOUSE;
}
public void setType(int type) {
this.type = type;
}
public int getType() {
return type;
}
public boolean isVisible() {
return visible;
}
public void setVisible(boolean visible) {
this.visible = visible;
}
public static int getTileW() {
return tileW;
}
public static void setTileW(int tileW) {
MapTile.tileW = tileW;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
Tankhouse类:
package map;
import util.Constant;
import java.util.ArrayList;
import java.util.List;
/**
* 玩家的大本营
*/
public class TankHouse {
//老巢的坐标
public static final int HOUSE_X = (Constant.FRAME_WIDTH - 3*MapTile.tileW >> 1) + 2;
public static final int HOUSE_Y = Constant.FRAME_HEIGHT - 2*MapTile.tileW ;
//一共六块地图块
private List<MapTile> tiles = new ArrayList<>();
public TankHouse(){
tiles.add(new MapTile(HOUSE_X,HOUSE_Y));
tiles.add(new MapTile(HOUSE_X,HOUSE_Y + MapTile.tileW));
tiles.add(new MapTile(HOUSE_X + MapTile.tileW,HOUSE_Y));
tiles.add(new MapTile(HOUSE_X + MapTile.tileW * 2,HOUSE_Y));
tiles.add(new MapTile(HOUSE_X + MapTile.tileW * 2,HOUSE_Y + MapTile.tileW));
tiles.add(new MapTile(HOUSE_X + MapTile.tileW,HOUSE_Y + MapTile.tileW));
//设置老巢地图块类型
tiles.get(tiles.size()-1).setType(MapTile.TYPE_HOUSE);
}
// public void draw(Graphics g){
// for (MapTile tile : tiles) {
// tile.draw(g);
// }
// }
public List<MapTile> getTiles() {
return tiles;
}
}
2.敌方坦克的重新生成
package tank;
import game.GameFrame;
import util.Constant;
import util.MyUtil;
import util.TankPool;
import java.awt.*;
public class EnemyTank extends Tank{
private int type = TYPE_GREEN;
private static final int TYPE_GREEN = 0;
private static final int TYPE_YELLOW = 1;
private static Image[] greenImg;
private static Image[] yellowImg;
//记录开始的时间
private long aiTime;
static {
greenImg = new Image[4];
greenImg[0] = MyUtil.createImage("res/ul.png");
greenImg[1] = MyUtil.createImage("res/dl.png");
greenImg[2] = MyUtil.createImage("res/ll.png");
greenImg[3] = MyUtil.createImage("res/rl.png");
yellowImg = new Image[4];
yellowImg[0] = MyUtil.createImage("res/u.png");
yellowImg[1] = MyUtil.createImage("res/d.png");
yellowImg[2] = MyUtil.createImage("res/l.png");
yellowImg[3] = MyUtil.createImage("res/r.png");
}
private EnemyTank(int x, int y, int dir) {
super(x, y, dir);
//敌人一旦出现就计时
aiTime = System.currentTimeMillis();
type = MyUtil.getRandomNumber(0,2);
}
public EnemyTank(){
type = MyUtil.getRandomNumber(0,2);
aiTime = System.currentTimeMillis();
}
//创建一个敌人的坦克
public static Tank createEnemy(){
//左上角,右上角,中间可以出现坦克
int x = MyUtil.getRandomNumber(0,3) ;
if (x == 0){
x = RADIUS;
}else if (x == 1){
x = Constant.FRAME_WIDTH - RADIUS;
}else {
x = (Constant.FRAME_WIDTH-RADIUS)/2;
}
int y = GameFrame.titleBarh + RADIUS;
int dir = DIR_DOWN;
EnemyTank enemy = TankPool.get();
enemy.setX(x);
enemy.setY(y);
enemy.setDir(dir);
enemy.setEnemy(true);
return enemy;
}
@Override
public void drawImgTank(Graphics g) {
ai();
g.drawImage(type == TYPE_GREEN ? greenImg[getDir()] : yellowImg[getDir()],
getX()-RADIUS,getY()-RADIUS,null);
}
private void ai()
{
if(System.currentTimeMillis()-aiTime>Constant.ENEMY_AI_INTERVAL)
{
//间隔5秒随机一个状态
setDir(MyUtil.getRandomNumber(0,4));
setState(MyUtil.getRandomNumber(0,2)==0?STATE_STAND:STATE_MOVE);
aiTime=System.currentTimeMillis();
}
//发射子弹
if(Math.random()<Constant.ENEMY_FIRE_PERCENT)
{
fire();
}
}
}