一個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以上。。。)
附:作者的原文以及我翻譯的內部分,有東西要扔過來嗎?我閃~~~