[翻譯]國外的一篇AS2飛機教程(2)

來源:互聯網
上載者:User

在FLASH MX2004中做好你的敵人MC,然後在連結對話方塊中,在標識文字框內寫下“baddie”,在AS2類文字框中寫下“Enemy”。
現在在你的FLA的互動面板中寫下下面的指令碼,把敵人MC串連到情境中,並把它們放進enemyArray數組中:
(譯者注:看來,AS2的ARRAY還是和AS1一樣(還有JAVASCRIPT),什麼東東都能放啊,這裡用的相當的妙。)

// ------ 串連到ENEMY數組 --------- //
for(var j=0;j<3;j++){
 attachMovie("baddie", "baddie"+j, 200+j);
 enArray[j] = _root["baddie"+j];
 enArray[j]._x = 50*j;
 enArray[j]._y = 100;
}

這就是到目前為止在我們的 Enemy 類中寫的東西:
class Enemy extends MovieClip{
  // 把實現的代碼寫在這裡
} // ------- enemy類結束

移動Enemy類
沒有,所以我們需要些什麼呢 ? 來些變數如何.
讓我們回到先前的類表中去看一下我們在文檔裡能設計些什麼.
好的,我們需要速度,所以我把它放進去,並且我們需要一個移動的方法
噢,還有一些我在設計裡忘記的東西,一個reset()方法,使敵機從情境的左邊移出時或者它們被刺擊中時重新回到情境的右邊.
我們可以在建構函式裡設定初始的速度,這就是我到目前為止所完成的內容:

class Enemy extends MovieClip{
  // 聲明屬性
  private var speed:Number;
 // ======= 建構函式
  function Enemy(){
  speed = 20;
  }
 
 // ===== 移動
 function moveEnemy(){
  
  if(_x<=-30){// 當移出情境左邊時
   reset();
   }
  else{
   _x -= speed;
  }
 }
 // ====== 重設
 function reset()
 {
  _x = Stage.width+50;
  _y = Math.random()*380 + 10;
  speed = Math.random()* 10 + 10;
 }

} // ----- enemy類結束
通過編譯測試它.
啊哈! 湊效了.敵機以在X方向上以10-20像素/幀的速度開始始動.
噢,然後我們會把我們的機子放進game類中,所以把下面的代碼放進Game類中.
// 在 Game類中
// 移動敵人
 function moveBaddies(){
  for(var i=0;i<3;i++){
   enemyArray[i].moveEnemy();
  }
 }
並且再度確認你有movebaddies方法在你的flash檔案中的Enterframe迴圈中,這使得你的ACTION面板裡的代碼十分的整齊和乾淨.

//   迴圈
_root.onEnterFrame = function(){
 myGame.checkKey();
 myGame.moveShip(dir);
 myGame.moveLaser();
 myGame.moveBaddies();
}
碰撞檢測
我不是很清楚我將要如何?它,或許是在遊戲類中。
並且要做一些迴圈...

//在game類中
// 碰撞檢測
 function collision(){
 for(var j = 0; j<6;j++){
  for(var k=0;k<3;k++){
   if(laserArray[j].hitTest(enemyArray[k])){
    trace("enemy hit, no. " + k );
    }
   }
  }
 }
並把這裡的方法放進我們的FLA檔案中的ENTERFRAME事件中去 :

// 迴圈:
_root.onEnterFrame = function(){
 myGame.checkKey();
 myGame.moveShip(dir);
 myGame.moveLaser();
 myGame.moveBaddies();
 myGame.collision();
}
製造爆炸效果,當子彈擊中敵機的時候,我們想看到爆炸(那是當然的)。
在你的FLASH MX 2004的檔案裡做一個爆炸的MC。
我只是聚集了一些煙和霧的映像放在每一幀裡,並在最後加一個空白幀,還有一個stop()。
我把這個MC取名叫做“Splode_mc”並且在連結對話方塊中把它的連結名子叫做"Splode".
所以在磁碰撞的方法裡,我應該串連上splode這個MC,重設敵機,然後我們把分數給加上。

// 在 game類中
// 碰撞檢測
 function collision(){
 for(var j = 0; j<6;j++){
  for(var k=0;k<3;k++){
   if(laserArray[j].hitTest(enemyArray[k])){
    // 爆炸效果
    _root.attachMovie("splode", "splode", 301);
    // 使爆炸作用於敵機的位置
    _root.splode._x = enemyArray[k]._x;
    _root.splode._y = enemyArray[k]._y;
    // 把敵機重設在情境的右邊
    enemyArray[k].reset();
    break;
    }
   }
  }
 }

碰撞檢測之敵機碰飛船.
現在讓我們審視一下敵機我和我們的宇宙飛船之間的碰撞。
我重複利用了sploe_mc,改變了它的顏色及x,y方向的展開值,
我們也能夠把一個聲音的效果加在每一次擊中的判定中。
但是我還是把那件是交給你們吧。

 

// 碰撞檢測
 function collision(){
 for(var j = 0; j<6;j++){
  for(var k=0;k<3;k++){
   //檢查子彈擊中敵機
   if(laserArray[j].hitTest(enemyArray[k])){
    // // 爆炸效果
    _root.attachMovie("splode", "splode", 301);
    // 使爆炸作用於敵機的位置
    _root.splode._x = enemyArray[k]._x;
    _root.splode._y = enemyArray[k]._y;
    // 把敵機重設在情境的右邊
    enemyArray[k].reset();
    }// end if
   // 檢查敵機擊中飛船
   if(enemyArray[k].hitTest(ship)){
    _root.attachMovie("splode", "splode", 301);
    // 使得爆炸符合飛機的座標
    _root.splode._x = ship._x;
    _root.splode._y = ship._y;
    // 改變顏色
    var my_color:Color = new Color(_root.splode);
    my_color.setRGB(0xff0000);
    // 改變大小
    _root.splode._xscale = _root.splode._yscale = 400;
   }
   }
  }
 }

分數以及身命值:
剩下的是什麼呢?
分數以生命值.我或許應該做一些文字框,在改變發生的時候去改變它們的TEXT屬性。
所以在我們的FLASH MX 2004檔案中製做兩個文字框,把它們分別取名叫做score_txt和lives_txt.
然後給遊戲類增加兩個變數,score和lives 並在在我們的建構函式中初始化它們。

 

 // 在 Game 類中
 //聲明變數
    var score:Number;
 var lives:Number;
 
 // ====   建構函式  ==============
 function Game(_ship:Spaceship, _enArray:Array,
  _bullArray:Array){
  ship       = _ship;
  enemyArray = _enArray;
  laserArray = _bullArray;
  //初始化子彈及生命值
  score = 0;
  lives = 10;
 }
現在讓我們把score及lives變數設定給textfields

// 在 Game 類中
// 碰撞檢測
 function collision(){
 for(var j = 0; j<6;j++){
  for(var k=0;k<3;k++){
   //檢查子彈擊中敵機
   if(laserArray[j].hitTest(enemyArray[k])){
    // 增加分數值並呈現它
    score += 10;
    _root.score_txt.text = " Score: " + score;
    // 爆炸效果
    _root.attachMovie("splode", "splode", 301);
    // 使爆炸作用於敵機的位置
    _root.splode._x = enemyArray[k]._x;
    _root.splode._y = enemyArray[k]._y;
    // 把敵機重設在情境的右邊
    enemyArray[k].reset();
    }// end if
   //  檢查敵機擊中飛船
   if(enemyArray[k].hitTest(ship)){
    // 重設敵機,減小生命值
    // 顯示生命值
    enemyArray[k].reset();
    lives -= 1 ;
    _root.lives_txt.text = " Lives : " + lives;
    _root.attachMovie("splode", "splode", 301);
    // 使得爆炸符合飛機的座標
    _root.splode._x = ship._x;
    _root.splode._y = ship._y;
    // 改變顏色
    var my_color:Color = new Color(_root.splode);
    my_color.setRGB(0xff0000);
    // 改變大小
    _root.splode._xscale = _root.splode._yscale = 400;
   }
   }
  }
 }
在上面的代碼中在敵機擊中飛船的時候我不得不重設敵機,由於碰撞會持續幾幀,所以生命數會持續的減少。
把enemyArray[k].reset() 一行注釋掉你會看到生命數持續的減少。

上面所做的是一個相當簡單的過程:
1碰撞檢測。
2變數值的增加或減少。
3呈現變化的變數值.
這在技術方面對我們而言語是一個有些份量的跳躍,我想,我會把它放在那裡一會兒讓我們消化消化。
下一步我們將會做一個檢查分數的方法用以來檢查分數及生命數是否出界,如果是,就結束遊戲。

但在呢,讓我們體息。下面的注意事項和第一部分一樣...
接下來要進入第三部分,在那裡,我們將會整理出一個呈現分數的方法並製作一個水平方面移動的背景.

未完待續...

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.