2004年11月28日 星期日

Flash遊戲程式設計

許多程式技巧,其實只要有人點你一下,可能就讓自己立刻有很大的改變,
以下這篇也許可以讓即將跨進Action Script中級班的同學,有些小小的幫助吧!!

本文於2004/8/28發表於神魂顛倒論壇
一.變數管理
製作遊戲時所要用到的變數相當的多,好的變數管理與命名,通常會讓你對
整體有較好的掌握,特別是在執行大型遊戲時特別有用
舉例來說當要寫一個馬力喔兄弟的橫向捲軸遊戲,遊戲中可能會有幾種物件
主角:character
敵人:enemy
背景:bg
對於主角你可能需要設定座標(x,y),移動速度(speed),目前生命值(life)
對於敵人你可能需要設定座標(x,y),移動速度(speed),型態(type),運動模式(motion)
整個遊戲做下來會有相當多的變數,如何讓這些變數的關係清楚,且讓自己很容易了解自己的
變數設定?使用object來管理是個很好的方法
game=new Object();
game.character={x:10,y:10,speed:5,life:5};
game.enemy={x:100,y:100,speed,type:2,motion:2};
這樣就可以很清楚的把遊戲內容結構做出來
更方便的是,當你在遊戲結束要把所有變數初始化時
只要再
game=new Object();一次
就把所有變數清乾淨了,完全不需擔心那些散落的變數值沒被初始化

二.表現層與程式運作分離
在執行一個遊戲的設計專案,通常在進度壓力下,是需要程式設計與動畫設計師
分開進行的,要如何讓兩者的工作切分清楚,同時並行,畫面與程式分離是相當重要的工作,
1.首先在進行coding,將程式寫在as檔內,利用include方式來進行
這樣做法對於程式設計師與動畫設計師分隔兩地作業,是相當方便的做法,
通常完成fla檔若含有聲音檔,檔案就是幾Mb的大小,當有一小部份要修改
就要幾mb傳來傳去,是非常沒有效率的,若寫在as檔內,更新程式,只要將更動的as檔(只有幾k)
寄給動畫設計師,重新compile就可以了,至於as檔的編輯,個人建議可以使用UltraEdit,
可以上ultraedit網站下載WORDFILE,有支援到as2.0,我是覺得相當好用
2.儘可能將用來呈現畫面用的程式碼,與與程式中核心運算演算分離開來
好處是寫好的程式以後的再利用性高,只要修改表現層的東西即可,
當然,如果能用as2.0的class來寫更佳

三.避免使用_root
使用_root是很方便的寫法,但當有一天你所有的遊戲需被其他程式載入,做特別控制時
_root很可能就會出現問題,當然在2004已經有rootlock指令可用,但良好的寫作風格
還是可以幫自己避免很多問題,那如何避免_root呢?使用_global是很好的方法
_global.gameRoot=this;
多加這一行,只要在需要用到_root的地方就用gameRoot取代,這樣是不是就很簡單

四.範例
以下是一個計數器的示範
1.一般寫法:
呼叫counter_start()即啟動計數器,呼叫counter_stop()即停止
數字內容呈現在
Stage的Dynamic txt(變數txt)上
//-------------------------------------------
function counter_start(){
counter_start_id=setInterval(sub_counter_start,1000);
}
function sub_counter_start(){
_root.txt+=1;
}
function counter_stop(){
clearInterval(counter_start_id);
}

2.表現層與執行程式分離
呼叫counter_start()即啟動計數器,呼叫counter_stop()即停止,數字內容呈現在
Stage的Dynamic txt(變數txt)上
//-------------------------------------------
function counter_start(){
counter_start_id=setInterval(sub_counter_start,1000);
}
function sub_counter_start(){
game.now_time+=1;
counter_show();
}
function counter_stop(){
clearInterval(counter_start_id);
}
function counter_show(){
gameRoot.txt=game.now_time;
}
_global.gameRoot=this;
game=new Object();
game.now_time=0;

以上兩段程式碼做的是相同的事情,但是似乎第二種寫法看起來反而較複雜,
通常在遊戲裡寫出來的程式碼是多很多,
當要將這計數器移殖當別的程式時,所要改的東西只有在counter_show()內
其他都可以不用再去看(有時寫了很多程式碼,自己要回想都有困難)

沒有留言: