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

一个FLASH AS2 OOP游戏的开发文档---第三部分

现在我们必须来检查我们的生命数并且当然相应的做出处理。


栓查生命数:

在你的FLA文档中
创建两个新帧,并把第一帧的代码放进第二帧f去。
In your fla, make 2 new frames and put the code that was on frame 1 onto frame 2.
添加一个stop();写在代码的开头部分,分别添加在第一帧和第三帧。
在第一帧中,加一个标题,一些说明及一个按纽。
在按纽上写下如下的代码:
on(release){
 _root.gotoAndStop(2);
}
在第三帧中加一个动态的文本框来呈现游戏中的结果,并把实例名命名为"result_txt"
添加一个重新开始的按纽,并给按纽写上如下的代码,好让它返回第二帧。
on(release){
 _root.gotoAndStop(2);
}

重新回到我们的游戏类中的代码并添加这个方法用以检查剩下多少生命以及处理结果:


// 在Game类中
// ============检查生命值=============== //
 function checkLives() {
  if (lives<=0) {
   // 擦屏
   // 重新移动mc对象
   ship.removeMovieClip();
   for(var i=0;i<enemyArray.length;i++){
    enemyArray[i].removeMovieClip();
   }
   // 设定文本框的文字量示位置
   _root.result_txt.autoSize = "left";
   // 展示分数(Good)
   _root.result_txt.text =
   "You have scored "+score+" . Congratulations.";
   // 跳转至结果的图像面.
   _root.gotoAndStop(3);
  }
 }
移动背景
我们此刻有两个选择。
我们可以只在我们的FLASH里做一个移动的背景动画或者是
做一个Background类并把移动的方式写在其中.
好吧,我决定做一个Background类并把移动的方式写在其中.
首先我做了4个mc,大小上两倍于舞台的宽度,高度与舞台一致。
我的做成了1400*400大小,我准备在我的背景中使用视差.
最近的背景会比较远的被放置在后面的背移动的快.
我把这些MC命名分别为sky,far,mid,和fore.
这里就是BackGround类了。


class Background {
 // ----- 初始化背景 --- //
 function initBack() {
  _root.attachMovie("sky", "sky", 1);
  _root.attachMovie("far", "far", 2);
  _root.attachMovie("mid", "mid", 3);
  _root.attachMovie("fore", "fore", 4);
 }
 // ========== 移动背景 ==== //
 function moveBack(){
  // sky移动
  if(_root.sky._x <= -Stage.width){
   _root.sky._x = 0;
  }
  _root.sky._x -= 2;
  // far前景移动
  if(_root.far._x <= -Stage.width){
   _root.far._x = 0;
  }
  _root.far._x -= 4;
  // mid移动
  if(_root.mid._x <= -Stage.width){
   _root.mid._x = 0;
  }
  _root.mid._x -= 6;
  // fore 移动
  if(_root.fore._x <= -Stage.width){
   _root.fore._x = 0;
  }
  _root.fore._x -= 8;
 } 
 //
 // ===擦除背景 ===  //
 function cleanBack(){
  _root.sky.removeMovieClip();
  _root.far.removeMovieClip();
  _root.mid.removeMovieClip();
  _root.fore.removeMovieClip();
 }
}
注意到我有三个方法:
initBack() - 在这里我把背景剪辑加载到了时间轴上
moveBack() -用不同的速度来移动背景对象
cleanBack() - 当生命数为0时,移除所有的背景对象。

在Game类中增加back变量,并改变构造函数把背景对象实体给传进去.

// 在Game中
// 声明变量
var back:Background;
//...构造函数
function Game(_ship:Spaceship, _enArray:Array,
  _bullArray:Array,_back:Background) {
  ship = _ship;
  enemyArray = _enArray;
  laserArray = _bullArray;
  back = _back;
  score = 0;
  lives = 10;
 }
现在我们需要来初始化我们的背景。
在game类中,在initGame方法中,初始化背景:
// 在Game中
// --- 初始化 ----------- //
 function initGame(){
  back.initBack();
  
 }
然后移动它:

//在Game中
// == 移动背景 ===== //
 function moveBackground(){
  back.moveBack();
 }

//在我们的fla中
//  游戏循时
_root.onEnterFrame = function(){
 myGame.checkKey();
 myGame.moveShip(dir);
 myGame.moveLaser();
 myGame.moveBaddies();
 myGame.collision();
 myGame.checkLives();
 myGame.moveBackground();
}
固定我们的分数并呈现.
现在所有都做的很好,但是我们看不现展示出的分数及生命脉数。
那是因为我们的文本框是在root层(level),而背景则是在1-4层,所以root层被覆盖了。
所以我们现在要做是增加一个动态检测,并把它们放在一个更高的层次上。
把这一等增加在游戏类中我们声明变量的地方:
var myformat:TextFormat;
这将会使得我们在后面去风格化我们的文本框,并且在initGame(初始化游戏)的方法中添加动态文本框:

 

// 在Game类中
// --- 初始化----------- //
 function initGame(){
  back.initBack();
  // 创建一个文本框并设置好格式
  _root.createTextField("score_txt",501,20,10,100,50);
  myformat = new TextFormat();
  myformat.color = 0xff0000;
  myformat.size =20;
  _root.score_txt.text = "Score : " + score;
  _root.score_txt.setTextFormat(myformat);
  //初始化显示生命值的文本框
  _root.createTextField("lives_txt", 502, 600,10, 100, 30);
  _root.lives_txt.text = "Lives : " + lives;
  _root.lives_txt.setTextFormat(myformat);
 }
删除我们放在场景中的广西文本框并进行子弹和敌机以及敌机和主机间的碰撞检测。
// 在Game类中
// 碰撞检测 ...
// 子弹击中敌机
 score += 10;
 _root.score_txt.text = " Score: " + score;
 _root.score_txt.setTextFormat(myformat);
// ...
// 敌机击中宇宙飞船
 lives -= 1;
 _root.lives_txt.text = " Lives : "+lives;
 _root.lives_txt.setTextFormat(myformat);
// ...

擦除
当游戏结束的时候,我们仍旧需要把场景从游戏场景中移出。
所以我做了一个新的方法来做这项工作:


//  在 Background 类中
// ===擦除背景===  //
 function cleanBack(){
  _root.sky.removeMovieClip();
  _root.far.removeMovieClip();
  _root.mid.removeMovieClip();
  _root.fore.removeMovieClip();
 }
现在把这一行checkLives()方法添加进Game类中:
// 在Game 类中
// 在 CheckLives 的方法里
if(lives<=0){
 // ...
 back.cleanBack();
 // ...
}


还剩下要做:
这个游戏还远没有完成。
对于我来说这是编程的一次练习并且我忽略了很多游戏性方面的因素,视觉上审还将美角度的效果以及别的一些东西。
这就是能被添加的东西:
声间---子弹射击,碰撞。
更多的关数,更大和更坏的敌人(译著注:作者在这里"更坏"用的是badder~~~~)
一张最高成绩表单
把按纽的代码写进游戏类中
难道没有一些别的什么东西吗?就凭你的想象了.
请下载下面的源文件,我只在FLA中添加了第二帧的代码,整个文件太大了点。
还要继续???


(译者注:好啦,终于算是翻完了,准备复习英语,目标:CET-4 80以上。。。)
附:作者的原文以及我翻译的内部分,有东西要扔过来吗?我闪~~~
 

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