[翻译]国外的一篇AS2飞机教程(2)

在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呈现变化的变量值.
这在技术方面对我们而言语是一个有些份量的跳跃,我想,我会把它放在那里一会儿让我们消化消化。
下一步我们将会做一个检查分数的方法用以来检查分数及生命数是否出界,如果是,就结束游戏。

但在呢,让我们体息。下面的注意事项和第一部分一样...
接下来要进入第三部分,在那里,我们将会整理出一个呈现分数的方法并制作一个水平方面移动的背景.

未完待续...

你可能感兴趣的:([翻译]国外的一篇AS2飞机教程(2))