坦克大战—day 5

1.创建坦克对象

在game包里创建坦克类Tank。

public class Tank {
    //四个方向
    public static final int DIR_UP=0;
    public static final int DIR_DOWN=1;
    public static final int DIR_LEFT=2;
    public static final int DIR_RIGHT=3;
    //半径
    public static final int RADIUS=20;
    //默认速度
    public static final int DEFAULT_SPEED=4;
    //坦克状态:静止,移动,死亡
    public static final int STATE_STAND=0;
    public static final int STATE_MOVE=1;
    public static final int STATE_DIE=2;

    //坦克的初始生命值
    private static final int DEFAULT_HP = 1000 ;
    //坐标
    private int x,y;

    //血量
    private int hp=DEFAULT_HP;
    //攻击力
    private int atk;
    //速度
    private int speed;
    //方向
    private int dir;
    //状态
    private int state = STATE_STAND;
    //颜色
    private Color color;
    //炮弹
    private List bullets =new ArrayList();

    public Tank(int x,int y,int dir){
        this.x=x;
        this.y=y;
        this.dir=dir;
        color= MyUtil.getRandomColor();
    }
}

 

为了使生成的坦克有颜色,并且是随机的。在util包中创建一个工具类MyUtil,实现颜色随机。

public class MyUtil {
    public  static  final int getRandomNumber(int min,int max){
        return (int)(Math.random()*(max-min)+min);
    }
    public  static  final Color getRandomColor(){
        int red=getRandomNumber(0,256);
        int blue=getRandomNumber(0,256);
        int green=getRandomNumber(0,256);
        return new Color(red,green,blue);
    }
}

 

画坦克(画一个圆加上两条线),而且坦克的炮是有上下左右方向的。

  /**
     * 绘制坦克
     * @param g
     */
    public void draw(Graphics g)
    {
        g.setColor(color);

        //绘制坦克的圆
        g.fillOval(x-RADIUS,y-RADIUS,RADIUS<<1,RADIUS<<1);
        int endX=x;
        int  endY=y;
        switch (dir){
            case DIR_UP:
                endY=y-RADIUS*2;
                g.drawLine(x-1,y,endX-1,endY);
                g.drawLine(x+1,y,endX+1,endY);
                break;
            case DIR_DOWN:
                endY=y+RADIUS*2;
                g.drawLine(x-1,y,endX-1,endY);
                g.drawLine(x+1,y,endX+1,endY);
                break;
                case DIR_LEFT:
                endX=x-RADIUS*2;
                    g.drawLine(x,y-1,endX,endY-1);
                    g.drawLine(x,y+1,endX,endY+1);
                break;
            case DIR_RIGHT:
                endX=x+RADIUS*2;
                g.drawLine(x,y-1,endX,endY-1);
                g.drawLine(x,y+1,endX,endY+1);
                break;
        }

    }

2.游戏开始状态下的方法

在菜单栏中选择开始游戏,按回车键进入。

private void KeyEventMenu(int keyCode) {
        switch (keyCode){
            case KeyEvent.VK_UP:
            case KeyEvent.VK_W:
                menuIndex=(menuIndex-1+MENUS.length)%MENUS.length;
               // repaint();
                break;
            case KeyEvent.VK_DOWN:
            case KeyEvent.VK_S:
                menuIndex=(menuIndex+1)%MENUS.length;
                //repaint();
                break;
            case KeyEvent.VK_ENTER:
                newgame();
                break;
        }
    }

在GameFrame中创建开始游戏的方法。切换到游戏开始状态,创建一个坦克对象。

   private void newgame() {
           gameState=STATE_RUN;
           //创建坦克对象,敌人的坦克对象
        mytank= new Tank(400,200,Tank.DIR_DOWN);

    }

切换到游戏开始状态。绘制游戏开始的画面。

    private void drawRun(Graphics g) {
        g.setFont(GAME_FONT);

        //绘制黑色的背景
        g.setColor(Color.black);
        g.fillRect(0,0,FRAME_WIDTH,FRAME_HEIGHT );

        mytank.draw(g);
    }

写游戏开始状态下键盘监听事件,通过上下左右键改变坦克的方向。

    private void KeyEventRun(int keyCode) {
        switch (keyCode){
            case KeyEvent.VK_UP:
            case KeyEvent.VK_W:
             mytank.setDir(Tank.DIR_UP);
                break;
            case KeyEvent.VK_DOWN:
            case KeyEvent.VK_S:
                mytank.setDir(Tank.DIR_DOWN);
                break;
            case KeyEvent.VK_LEFT:
            case KeyEvent.VK_A:
                mytank.setDir(Tank.DIR_LEFT);
                break;
            case KeyEvent.VK_RIGHT:
            case KeyEvent.VK_D:
                mytank.setDir(Tank.DIR_RIGHT);
                break;
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值