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

jerry Android 2015年08月24日 收藏

本篇介绍坦克大战游戏除坦克之外的几个角色。
1. Bullet 子弹类        坦克发射出的子弹在游戏中飞行
2.Explosion 爆炸类   子弹击中子弹,障碍物,或是坦克显示爆炸
3. Powerup 增强宝贝类  星星,加坦克,定时器等
4. Score 分数类。         击中坦克或是攻取增强宝贝,加分显示,分数有100,200,300,400,500,击中不同坦克分数不同。
为直观起见,参见下图,红圈里从上到下分别是Bullet, Powerup, Explosion, Score.

子弹类,屏幕中所有显示子弹从一个子弹池BULLET_POOL中取出,子弹有方向,速度,及强度等属性,高强度的子弹可以击破石块。
它每个游戏帧所要完成的操作如下。

  1. /**
  2.  * Operation be done in each tick.
  3.  */
  4. public void tick(){
  5.  if (!isVisible() || direction==BattleField.NONE)
  6.   return;
  7.  // Move the bullet.
  8.  move(dx, dy);
  9.  int x = getRefPixelX();
  10.  int y = getRefPixelY();
  11.  PlayerTank playerTank=(PlayerTank)Tank.getTank(0);
  12.  //outside the battle field, hitting the border
  13.  if (x <= 0 || x >= battleField.getWidth() || y <= 0
  14.    || y >= battleField.getHeight()) {
  15.  
  16.   //this is to avoid explosition outside the battlefield.
  17.   if(x<=0) x=0;
  18.   if(x >= battleField.getWidth()) x= battleField.getWidth();
  19.   if(y<=0) y=0;
  20.   if(y>= battleField.getHeight())y=battleField.getHeight();
  21.   setPosition(x,y);
  22.   explode();
  23.   return;
  24.  }
  25.  
  26.  // See if it hit a tank.
  27.  if (friendly) {
  28.   // See if it hit an enemy tank.
  29.   for (int i = 1; i < Tank.POOL_SIZE; i++) {
  30.    EnemyTank enemy = (EnemyTank)Tank.getTank(i);
  31.    if (enemy!=null && enemy.isVisible() &&
  32.      collidesWith(enemy, false)) {
  33.     enemy.explode();
  34.     explode();
  35.     return;
  36.    }
  37.   }
  38.  } else {
  39.   // See if it hit player tank.
  40.   
  41.   if (collidesWith(playerTank, false)) {
  42.    playerTank.explode();
  43.    explode();
  44.    return;
  45.   }
  46.  }
  47.  
  48.  //check to see if hit player's home
  49.  if(Powerup.isHittingHome(this)){
  50.   //TODO: Game Over
  51.   explode();
  52.   return;
  53.  }
  54.  // See if it hit a wall.
  55.  if (battleField.hitWall(x, y, strength)) {
  56.   explode();
  57.   return;
  58.  }
  59.  
  60.  // See if it hit another bullet.
  61.  for (int i = 0; i < POOL_SIZE; i++) {
  62.   Bullet anotherBullet=BULLET_POOL;
  63.   if(this!=anotherBullet && anotherBullet.isVisible()){
  64.    if (collidesWith(anotherBullet, false)) {
  65.     explode();
  66.     BULLET_POOL.explode();
  67.     return;
  68.    }
  69.   }
  70.  }
  71. }

要判断是否击中墙壁,对方坦克,或是对方子弹,是否击中“家”,如果有,则爆炸,如都没有,则同方向前行一步。
爆炸类,子弹击中障碍物(墙,子弹,坦克)时显示爆炸动画效果。它有两种一个是大爆炸,一个是小爆炸。
它每个游戏帧所要完成的操作比较简单,每步显示一个动画帧,直到显示完。

  1. /**
  2.  * Operation be done in each tick.
  3.  */
  4. public void tick() {
  5.  if (!isVisible())
  6.   return;
  7.  nextFrame();
  8.  if (getFrame() == 0){
  9.   setVisible(false);
  10.  }
  11. }

增强宝贝类,有多种,无敌,加坦克,地雷,定时器等。不同的增强宝贝可以使玩家获得不同的能力,玩过坦克大战游戏的人都比较熟悉。
在游戏进行中, 会不时或者当玩家打中红色坦克时,会有游戏中随机出现不同增强宝贝。
它每个游戏帧所要完成的操作如下:
如果玩家得到“无敌”增强功能时,“无敌”具有一定的时效性,需要判断无敌是否过时,其它时候则让该增强宝贝有闪烁效果,引起玩家注意。

  1. /**
  2.  * Operation be done in each tick.
  3.  */
  4. public void tick(){
  5.  if(type==NOTHING || !isVisible()) return;
  6.  long tickTime = System.currentTimeMillis();
  7.  long refreshPeriod=MILLIS_PER_TICK;
  8.  
  9.  //invulnerable powerup is controlled by the player tank.
  10.  if(type!=INVULNERABLE &&type!=HOME && type!=HOME_DESTROYED){
  11.   if(tickTime-startTime>livePeriod){
  12.    setFrame(NOTHING);
  13.    setVisible(false);
  14.    return;
  15.   }
  16.  }else{
  17.   refreshPeriod=MILLIS_PER_TICK/10;
  18.  }
  19.  if(timeTaken>=refreshPeriod){
  20.   showNextFrame=!showNextFrame;
  21.   if(type==INVULNERABLE){
  22.      if(showNextFrame){
  23.     setFrame(0);
  24.    }else{
  25.     setFrame(1);
  26.    }
  27.   }else if(type==HOME || type==HOME_DESTROYED){
  28.      setFrame(type);
  29.   }else{
  30.    if(showNextFrame){
  31.     setFrame(type);
  32.    }else{
  33.     setFrame(NOTHING);
  34.    }
  35.   }
  36.   timeTaken = System.currentTimeMillis() - tickTime;
  37.  } else{
  38.   timeTaken+=1;
  39.  }
  40. }

最后一个是分数类,比较简单,它每个游戏帧所要完成的操作如下

  1. /**
  2.  * Operation be done in each tick.
  3.  */
  4. public void tick(){
  5.  if(isVisible()){
  6.   long tickTime = System.currentTimeMillis();
  7.   if(startTime>0){
  8.    if(tickTime-startTime>livePeriod){
  9.     setVisible(false);
  10.     startTime=0;
  11.     return;
  12.    }
  13.   }
  14.  }
  15. }

在屏幕上显示几秒种后消失。