在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Android/ Android 坦克大戰(zhàn)游戲設(shè)計(jì)解析六
Android 坦克大戰(zhàn)游戲設(shè)計(jì)解析八
Android 坦克大戰(zhàn)游戲設(shè)計(jì)解析一
Android 坦克大戰(zhàn)游戲設(shè)計(jì)解析五
Android 坦克大戰(zhàn)游戲設(shè)計(jì)解析六
Android 坦克大戰(zhàn)游戲設(shè)計(jì)解析七
Android 坦克大戰(zhàn)游戲設(shè)計(jì)解析二
Android 坦克大戰(zhàn)游戲設(shè)計(jì)解析三
Android 坦克大戰(zhàn)游戲設(shè)計(jì)解析四

Android 坦克大戰(zhàn)游戲設(shè)計(jì)解析六

本篇介紹坦克大戰(zhàn)游戲除坦克之外的幾個(gè)角色。

  1. Bullet 子彈類。坦克發(fā)射出的子彈在游戲中飛行
  2. Explosion 爆炸類。子彈擊中子彈,障礙物,或是坦克顯示爆炸
  3. Powerup 增強(qiáng)寶貝類。星星,加坦克,定時(shí)器等
  4. Score 分?jǐn)?shù)類。擊中坦克或是攻取增強(qiáng)寶貝,加分顯示,分?jǐn)?shù)有 100,200,300,400,500,擊中不同坦克分?jǐn)?shù)不同。
    為直觀起見,參見下圖,紅圈里從上到下分別是 Bullet, Powerup, Explosion, Score.

http://wiki.jikexueyuan.com/project/android-game-design/images/16.jpg" alt="pic" />

子彈類,屏幕中所有顯示子彈從一個(gè)子彈池 BULLET_POOL 中取出,子彈有方向,速度,及強(qiáng)度等屬性,高強(qiáng)度的子彈可以擊破石塊。 它每個(gè)游戲幀所要完成的操作如下。

/**
 * Operation be done in each tick.
 */
public void tick(){
 if (!isVisible() || direction==BattleField.NONE)
  return;
 // Move the bullet.
 move(dx, dy);
 int x = getRefPixelX();
 int y = getRefPixelY();
 PlayerTank playerTank=(PlayerTank)Tank.getTank(0);
 //outside the battle field, hitting the border
 if (x <= 0 || x >= battleField.getWidth() || y <= 0
   || y >= battleField.getHeight()) {

  //this is to avoid explosition outside the battlefield.
  if(x<=0) x=0;
  if(x >= battleField.getWidth()) x= battleField.getWidth();
  if(y<=0) y=0;
  if(y>= battleField.getHeight())y=battleField.getHeight();
  setPosition(x,y);
  explode();
  return;
 }

 // See if it hit a tank.
 if (friendly) {
  // See if it hit an enemy tank.
  for (int i = 1; i < Tank.POOL_SIZE; i++) {
   EnemyTank enemy = (EnemyTank)Tank.getTank(i);
   if (enemy!=null && enemy.isVisible() &&
     collidesWith(enemy, false)) {
    enemy.explode();
    explode();
    return;
   }
  }
 } else {
  // See if it hit player tank.

  if (collidesWith(playerTank, false)) {
   playerTank.explode();
   explode();
   return;
  }
 }

 //check to see if hit player's home
 if(Powerup.isHittingHome(this)){
  //TODO: Game Over
  explode();
  return;
 }
 // See if it hit a wall.
 if (battleField.hitWall(x, y, strength)) {
  explode();
  return;
 }

 // See if it hit another bullet.
 for (int i = 0; i < POOL_SIZE; i++) {
  Bullet anotherBullet=BULLET_POOL;
  if(this!=anotherBullet && anotherBullet.isVisible()){
   if (collidesWith(anotherBullet, false)) {
    explode();
    BULLET_POOL.explode();
    return;
   }
  }
 }
}

要判斷是否擊中墻壁,對(duì)方坦克,或是對(duì)方子彈,是否擊中“家”,如果有,則爆炸,如都沒有,則同方向前行一步。 爆炸類,子彈擊中障礙物(墻,子彈,坦克)時(shí)顯示爆炸動(dòng)畫效果。它有兩種一個(gè)是大爆炸,一個(gè)是小爆炸。 它每個(gè)游戲幀所要完成的操作比較簡(jiǎn)單,每步顯示一個(gè)動(dòng)畫幀,直到顯示完。

/**
 * Operation be done in each tick.
 */
public void tick() {
 if (!isVisible())
  return;
 nextFrame();
 if (getFrame() == 0){
  setVisible(false);
 }
}

增強(qiáng)寶貝類,有多種,無敵,加坦克,地雷,定時(shí)器等。不同的增強(qiáng)寶貝可以使玩家獲得不同的能力,玩過坦克大戰(zhàn)游戲的人都比較熟悉。
在游戲進(jìn)行中, 會(huì)不時(shí)或者當(dāng)玩家打中紅色坦克時(shí),會(huì)有游戲中隨機(jī)出現(xiàn)不同增強(qiáng)寶貝。
它每個(gè)游戲幀所要完成的操作如下:
如果玩家得到“無敵”增強(qiáng)功能時(shí),“無敵”具有一定的時(shí)效性,需要判斷無敵是否過時(shí),其它時(shí)候則讓該增強(qiáng)寶貝有閃爍效果,引起玩家注意。

/**
 * Operation be done in each tick.
 */
public void tick(){
 if(type==NOTHING || !isVisible()) return;
 long tickTime = System.currentTimeMillis();
 long refreshPeriod=MILLIS_PER_TICK;

 //invulnerable powerup is controlled by the player tank.
 if(type!=INVULNERABLE &&type!=HOME && type!=HOME_DESTROYED){
  if(tickTime-startTime>livePeriod){
   setFrame(NOTHING);
   setVisible(false);
   return;
  }
 }else{
  refreshPeriod=MILLIS_PER_TICK/10;
 }
 if(timeTaken>=refreshPeriod){
  showNextFrame=!showNextFrame;
  if(type==INVULNERABLE){
     if(showNextFrame){
    setFrame(0);
   }else{
    setFrame(1);
   }
  }else if(type==HOME || type==HOME_DESTROYED){
     setFrame(type);
  }else{
   if(showNextFrame){
    setFrame(type);
   }else{
    setFrame(NOTHING);
   }
  }
  timeTaken = System.currentTimeMillis() - tickTime;
 } else{
  timeTaken+=1;
 }
}

最后一個(gè)是分?jǐn)?shù)類,比較簡(jiǎn)單,它每個(gè)游戲幀所要完成的操作如下

/**
 * Operation be done in each tick.
 */
public void tick(){
 if(isVisible()){
  long tickTime = System.currentTimeMillis();
  if(startTime>0){
   if(tickTime-startTime>livePeriod){
    setVisible(false);
    startTime=0;
    return;
   }
  }
 }
}

在屏幕上顯示幾秒種后消失。