2007年2月21日 星期三

TJS特訓99解說篇

上一篇忘了說,我的架構主要是參考這篇TJS實作教學的

先講一下類別的設計:
  • MovingObject:所有戰場上會移動的物件,Player及Enemy的父類別
  • Player:玩家自機,畫面上那個藍點
  • Enemy:敵機,不停撞過來的那些小紅點
  • GameMaster:管理整個遊戲的迴圈與邏輯
  • GameWindow:遊戲視窗
GameWindow類別
作用其實很簡單
  • 建立一個視窗,設定大小為400x400。
  • 建立一個Layer,該視窗的主要圖層。
  • 然後建立一個GameMaster物件,就這樣。接下來遊戲的進行都交給GameMaster控制。
GameMaster類別
  • 建立fore(前景)圖層,所有遊戲的物件都畫在這個圖層上。
  • 建立玩家物件及99個敵人物件,敵人物件用一個陣列(Array)存放。
  • 建立一個Timer,每25ms呼叫一次 (理想狀態下40fps),負責玩家、敵機的移動、碰撞判定。
MovingObject類別
  • 之前說過這個範例不要想用到圖檔,所以我們使用正方形來表示自機與子彈。size是邊長,color是顏色
  • 繼承Layer物件,建構時將自己放在fore這個圖層上
Enemy類別
  • 建構時指定顏色(子彈是紅色)及邊長。
  • init函式負責初始化敵機 (在畫面的邊緣出現,向畫面內非)
  • check_bound函式負責檢查敵機是否出界了,如果是的話,呼叫init來重置敵機。
  • update函式負責敵機的移動
Player類別
  • 建構時指定顏色(藍色)
  • update函式負責移動,使用System.getKeyState()來判斷方向鍵是否已被按下。
我就不一行一行的講解程式碼了,有興趣的話可以留言討論。



延伸練習:這只是個小小範例,我的code有滿多問題的,如果你想練習的話...
  1. 我忘了寫Player出界的判定,請補上
  2. 碰撞判定的公式其實是不對的,你發現了嗎?請修正
  3. Frame穩速的機制是否有比使用Timer還要好的方式呢?
  4. 敵機移動的速度目都只是整數,請修改init函式讓敵機的移動速度不要那麼規律。
  5. 找找看還有沒有其他bug吧 :)

沒有留言: