坦克大战—day 34

地图的重新生成和敌人坦克的重新生成

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

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值