五、實現爆炸效果、並加入道具導彈
大多數游戲都有著豐富的效果類,在精靈移動類游戲中曾一度以此為一個重要的賣點,。光光是一些豐富的特效是不能夠產生一個好的游戲的,但是一個好的游戲是萬萬不能缺少好的效果的。
很多人認為游戲的效果層有時和跟游戲邏輯本身並沒有太大的關系,往往就是在最終屏幕上再畫上一層效果層。但是游戲邏輯和效果層之間的通信是很重要的。這種通信往往體現在延時與等待上。比如飛機爆炸時,不接受任何用戶輸入,並且爆炸效果還要繼續跟隨飛機墜落,甚至爆炸的范圍會影響周圍的物體,要等待爆炸結果結束了才繼續進行游戲。游戲邏輯和效果層之間的通信是很復雜的問題。在這裡我突然有了罪惡感,我們沒有對游戲進行任何的分析就起步了,游戲完全是基於硬編碼的,我想到那兒,大家跟著看到那兒。飛機類僅僅是一個sprite,沒有設計成一個狀態機,這也就使得我們的效果層和邏輯層的通信有些卡通了。也許本文給了你編寫自己第一個游戲的喜悅,也帶給了你對游戲擴展性與復雜性的一絲擔憂。或許這比便一個硬編碼的游戲更有意義呢?誰說得好呢,現還是以為那些擴展性良好的游戲是偉大游戲構架師的傑作吧,相信你有了一兩個好的想法後會重新設計這個游戲的,使之稍微有一些像個“系統”。然而好的技術不一定產生好的游戲……呵呵
有扯遠了,會到現實吧,boys and girls!goon.
描述一下我們的爆炸效果,在子彈擊中飛機後,子彈要迅速消失,飛機圖像保持不變,此時將爆炸效果至於飛機圖像之上,然後開始顯示boom動畫,在此期間,飛機不接受任何移動指示,因為他lose control。在爆炸效果後飛機消失。
我們的爆炸效果類:
GameObject explosion;//
初始化once:
img=ImageTools.getImage("/pic/explosion.png");//
explosion=new GameObject(img,32,32);
初始化:
explosion.reset();
explosion.lifetime=3;//生命周期定位三桢
邏輯處理:
if (gameover) {//如果游戲結束,顯示效果類
explosion.paint(g);
explosion.update();
if(!explosion.alive){//當生命周期結束了
plane.alive=false;//關閉plane
g.setColor(255,255,255);//輸出評語,下回分解
g.drawString(StringTools.timeOpinion(gametime),5,22,g.LEFT|g.TOP);
g.drawString("fly 0.1 ver by favo yang",2,100,g.LEFT|g.TOP);
g.drawString("E-mail :
[email protected]",2,115,g.LEFT|g.TOP);
g.drawString("simulate from:",2,130,g.LEFT|g.TOP);
g.drawString("Mr.tony 's <hold on 20sec 1.20> ",2,145,g.LEFT|g.TOP);
g.drawString("hello tony, just funny.",2,160,g.LEFT|g.TOP);
}
}
現在你看我是如何解決效果層與邏輯層之間的通信的,我使用的是全局變量gameover,在簡單游戲中使用大量的全局狀態變量也是一種常見的方法,可以避免動腦勁。不過缺點明顯,游戲硬編碼,結構既不清晰也不漂亮,幾乎沒有擴展性。所以說最好還是將飛機基於狀態機設計,並將效果類設計成含有回調函數的抽象類,然後繼承效果類實現回調函數來實現通信。至於總體層次上可以用堆棧將繪畫單元串起來。還有分層處理等等…給你個思考的起點…
導彈的是實現,是不是你已經有個想法了呢,其實就是利用Bullets.killbullets。
邏輯處理
if(bomb.alive){
bomb.moveto(plane.sprite.getX()-20,plane.sprite.getY()-20);
bomb.paint(g);
bomb.update();
bullets.killbullets(plane.sprite,32);
}
在這裡我不得不提一句,將生命概念封裝在GameObject中是很好的(其實我們只是將其用作顯示關鍵字),但將生命周期安排在GameObject中有欠妥當,生命周期也不一定就是基於桢的,有時基於時間,有時還有別的什麼。我是說她足夠復雜到交給另一個獨立類處理,在這裡實際需要的是一個足夠強大的顯示方法,其支持以桢數為參數顯示罷了。
其實我覺得自己說多了,也許你也被我搞糊塗了。對了目錄上少了一節,我們還缺少游戲的獎懲系統,下回我補上。