} } }

    坦克大战底层框架搭建并思路解析(一)

    添加时间:2013-6-11 点击量:

          坦克大战是我们都很熟悉的游戏,这游戏是含有多量的 J2ee 的根蒂根基常识,是一个值得研究,固然简单的入手项目:从java的面向对象思惟出发,


       这个游戏首要的角色就是 坦克,是以起首先包装出一个坦克类来,以便今后复制临盆更多的坦克:



    import java.awt.;
    import java.awt.event.KeyEvent;



    1 public class Tank {
    
    2 public static final int WIDTH = 30; //定义一个常量默示坦克的宽度
    3 public static final int HEIGHT = 30;
    4 public static final int XSPEED = 5; //定义一个常量表坦克每次的移动速度
    5 public static final int YSPEED = 5;
    6 private int x,y; //坦克呈现的坐标



    public Tank(int x,int y){   构建坦克的机关办法,传入坦克呈现的坐标地位x,y 
    
    this.x = x;
    this.y = y;
    }


    空话说了一大箩,咱先把坦克给画出来才是王道对吧,下面定义一个draw()的办法来画坦克


    public void draw(Graphics g){
    
    Color c
    = g.getColor(); //获取默认的画笔色彩
    g.setColor(Color.RED); //设置画笔的原色
    g.fillOval(x, y, WIDTH, HEIGHT); //用方才设好的红色按照上方供给的参数画出坦克来
    g.setColor(c); //再把画笔的色彩设回默认的色彩,用完了归位!
    move();
    //把move()包装到draw()里,一画完就执交活动(这个办法我们临时不管,先挂着,下面会讲到它的)
    }




    private boolean BL,BU,BR,BD = false;     //定义坦克的四个按键的初始化状况,默认布尔值设为false,一旦到被按下时再更改为 true


    //因为坦克的攻打标的目标或是移动标的目标起码都得有高低阁下四个标的目标,但仅有四个会显得太单调,并且不合适一般游戏的思路,是以别的


    定义出LU(左上)、RD(右下)、LD()左下 、RU(右上),别的还有一个不动的时辰的状况 STOP ,若是这几个对象是有限的,是以为了


    应用便利,我们直接应用列举的办法(enum)来规定这几个标的目标:



    enum Direction{ //这是标的目标
    
    L,U,R,D,LU,LD,RU,RD,STOP;
    }



    Direction dir = Direction.STOP;  //把坦克的默认状况设置为不动 STOP;


    下面来讲讲坦克活动的办法 move() ,在上方我们定义了八个标的目标(STOP除外),我们要按照标的目标来进交活动,是以先写出坦克的move()办法来



     1 void move(){
    
    2 switch(dir){ //应用switch来断定坦克的标的目标
    3 case L:x-=XSPEED;break; //若是坦克标的目标为做,则向左迈 XSPEED 个单位,
    4 case U:y-=YSPEED;break; //同上;
    5 case R:x+=XSPEED;break;
    6 case D:y+=YSPEED;break;
    7 case LU:x-=XSPEED;y-=YSPEED;break;
    8 case LD:x-=XSPEED;y+=YSPEED;break;
    9 case RU:x+=XSPEED;y-=YSPEED;break;
    10 case RD:x+=XSPEED;y+=YSPEED;break;
    11 }
    12 }


    如今题目来了,我们怎么知道用户按下了那个标的目标键呢? 不知道标的目标键我们又怎么能断定出这move()里的八个标的目标来呢?


    解: java里有器帮我们用户按下了那个键,这时就应用到了事务的内容了


    我们知道按键的类是 KeyListenner,应用其适配器 KeyAdapter 来实现想要应用的办法 (不过这里不设置器,只定义两个断定按键办法以便客户端里的


    器接管调用)



    public void keyPressed(KeyEvent e){     //定义键盘被按下的办法
    
    int key = e.getKeyCode(); //获取键盘按键的编码
    switch(key){
    case KeyEvent.VK_LEFT: BL = true;break; //在键盘中 向左 <- 的键盘编码为 KeyEvent.VK_LEFT; 静态常量,一旦辨认出(被按下)是这个编码时就把它的状况更改为true
    case KeyEvent.VK_UP: BU = true;break; //同上
    case KeyEvent.VK_RIGHT: BR = true;break;
    case KeyEvent.VK_DOWN: BD = true;break;
    default:break; }
    locateDirection(); //定位办法,下面即将谈到...
    }


    有了一个按键被按下时的办法,我们还必须有一个按键被开释的办法,总不克不及够让 标的目标键一旦被按下之后状况就一向都为true吧,必然都有办法让其恢复为原始状况,不然会


    造成一向发弹,或是按了一次标的目标键之后再想改标的目标就不灵了,并且无法停止你的战车向前疾走去找MM...


    是以定义一个 keyReleased()办法,来恢复键状况



     1 public void keyReleased(KeyEvent e){
    
    2 int key = e.getKeyCode();
    3 switch(key){
    4 case KeyEvent.VK_LEFT: BL = false;break; //分别把状况改回false;
    5 case KeyEvent.VK_UP: BU = false;break;
    6 case KeyEvent.VK_RIGHT: BR = false;break;
    7 case KeyEvent.VK_DOWN: BD = false;break;
    8 default:break;
    9 }
    10 locateDirection(); //这里又调用了 定位办法 locateDirection(),那么下面就让我们来看看这办法毕竟是咋的吧?
    11 }


    上方我们有了断定按下了那个键的两个办法,但如今怎么靠四个按键来断定八个标的目标呢? ,这就请求定义一个定位办法来做出断定



     1 void locateDirection(){
    
    2 if( BL && !BU && !BR && !BD) dir = Direction.L; //若是只有一个左键为true(keyPressed()里设置的)的话,就把这个标的目标规定为左标的目标
    3 else if(!BL && BU && !BR && !BD) dir = Direction.U; //同上...
    4 else if(!BL && !BU && BR && !BD) dir = Direction.R;
    5 else if(!BL && !BU && !BR && BD) dir = Direction.D;
    6 else if( BL && BU && !BR && !BD) dir = Direction.LU;
    7 else if( BL && !BU && !BR && BD) dir = Direction.LD;
    8 else if(!BL && BU && BR && !BD) dir = Direction.RU;
    9 else if(!BL && !BU && BR && BD) dir = Direction.RD;
    10 else if(!BL && !BU && !BR && !BD) dir = Direction.STOP;
    11 }
    12 }


       返回keyPressed()办法来看,当断定玩按键之后就立即对齐进行定位的断定,是以在keyPressed()最后引入了 locateDirection() 办法来断定,同理keyRealease()办法。。。
    至此一个简单的底层坦克类搭建完成,下一讲将讲到坦克客户端调用这个坦克移动的题目,当然这不是终极坦克的类,而只是一个底层框架体下的坦克包装类,坦克的类
    筹算用三讲来讲全,分别是今朝这个仅仅用于演示坦克移动的,后面的发射弹的,有障碍的(也即完全版的)

         
      致: 小弟不才,有不合错误的处所或者可以精简代码的处所,迎接留言指出,感激感动不尽,望大神也别袭击小弟!





    真正的心灵世界会告诉你根本看不见的东西,这东西需要你付出思想和灵魂的劳动去获取,然后它会照亮你的生命,永远照亮你的生命。——王安忆《小说家的十三堂课》
    分享到: