离线下载
PDF版 ePub版

引路蜂 · 更新于 2018-11-28 11:00:43

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

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

public interface Actor{

////////////////////////////////////////////////////////////////////////////

/**
* Operation be done in each tick.
*/
void tick();
}

该接口有一个 tick 方法,为每个游戏帧该角色所要完成的动作,比如说背景可能要更换图形以形成动画效果(如水面波浪)。坦克可以完成前面一步,子弹飞行等等。

坦克大战游戏中定义了背景类 BattleField ,子弹 Bullet,各种坦克类(Tank, PlayTank, EnemyTank, FastTank, HeavyTank, SimpleTank, PlayerTank,SmartTank) , 升级法宝 Powerup,以及动态显示的分数 Score 类,都实现了 Actor 接口。

而这些角色类同时又是 Game API 中 Layer 的子类。因些游戏逻辑比较简单,下面代码是 GameScene 中线程 Run 的方法,为游戏进行时主线程

public void run(){
    Thread currentThread = Thread.currentThread();

    try {
        while (currentThread == animationThread) {
        long startTime = System.currentTimeMillis();
        // Don't advance game or draw if canvas is covered by a system
        // screen.
        if (isShown()) {
           tick();
        if(hasSurface){
           Canvas canvas=holder.lockCanvas();
           updateGame(canvas);
           holder.unlockCanvasAndPost(canvas);
        }
       }
      timeTaken = System.currentTimeMillis() - startTime;
      if (timeTaken < MILLIS_PER_TICK) {
        synchronized (this) {
          if(MILLIS_PER_TICK > timeTaken){
         wait(MILLIS_PER_TICK - timeTaken);
         timeTaken = System.currentTimeMillis() - startTime;
      }
     }
  } else {
        Thread.yield();
    }
}
   } catch (InterruptedException e) {
}

}

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

private void tick(){

for(int i=0;i<TOTALLAYERS;I++){
Layer layer=layerManager.getLayerAt(i);
if(layer.isVisible()){
Actor actor=(Actor)layer;

actor.tick();
}
}
applyGameLogic();
}

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

pic

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