Android坦克大战游戏设计解析四

jerry Android 2015年08月24日 收藏

有了游戏所需的图象及声音资源后,下面就可以开始定义游戏中的各种角色。为了方便起见,坦克大战游戏中定义了一个角色接口。

  1. public interface Actor{
  2.  
  3. ////////////////////////////////////////////////////////////////////////////
  4.  
  5. /**
  6. * Operation be done in each tick.
  7. */
  8. void tick();
  9. }

该接口有一个tick方法,为每个游戏帧该角色所要完成的动作,比如说背景可能要更换图形以形成动画效果(如水面波浪)。坦克可以完成前面一步,子弹飞行等等。
坦克大战游戏中定义了背景类BattleField ,子弹Bullet,各种坦克类(Tank, PlayTank, EnemyTank, FastTank, HeavyTank, SimpleTank,  PlayerTank,SmartTank) , 升级法宝Powerup,以及动态显示的分数Score类,都实现了Actor接口。
而这些角色类同时又是Game API中 Layer的子类。因些游戏逻辑比较简单,下面代码是GameScene中线程Run的方法,为游戏进行时主线程

  1. public void run(){
  2.     Thread currentThread = Thread.currentThread();
  3.  
  4.     try {
  5.         while (currentThread == animationThread) {
  6.         long startTime = System.currentTimeMillis();
  7.         // Don't advance game or draw if canvas is covered by a system
  8.         // screen.
  9.         if (isShown()) {
  10.            tick();
  11.         if(hasSurface){
  12.            Canvas canvas=holder.lockCanvas();
  13.            updateGame(canvas);
  14.            holder.unlockCanvasAndPost(canvas);
  15.         }
  16.        }
  17.       timeTaken = System.currentTimeMillis() - startTime;
  18.       if (timeTaken < MILLIS_PER_TICK) {
  19.         synchronized (this) {
  20.           if(MILLIS_PER_TICK > timeTaken){
  21.          wait(MILLIS_PER_TICK - timeTaken);
  22.          timeTaken = System.currentTimeMillis() - startTime;
  23.       }
  24.      }
  25.   } else {
  26.         Thread.yield();
  27.     }
  28. }
  29.    } catch (InterruptedException e) {
  30. }
  31.  
  32. }

而其中的tick()方法就是调用游戏中所有角色的tick()方法:

  1. private void tick(){
  2.  
  3. for(int i=0;i<TOTALLAYERS;I++){
  4. Layer layer=layerManager.getLayerAt(i);
  5. if(layer.isVisible()){
  6. Actor actor=(Actor)layer;
  7.  
  8. actor.tick();
  9. }
  10. }
  11. applyGameLogic();
  12. }

这样参与游戏中的各个角色完成自已每帧所需要更新,整个游戏就动起来了。

在后面的文章将主要介绍各个角色类的基本实现方法。