程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> J2ME 2D小游戲入門之旅(五) 實現爆炸效果、並加入道具導彈

J2ME 2D小游戲入門之旅(五) 實現爆炸效果、並加入道具導彈

編輯:J2ME
五、實現爆炸效果、並加入道具導彈

大多數游戲都有著豐富的效果類,在精靈移動類游戲中曾一度以此為一個重要的賣點,。光光是一些豐富的特效是不能夠產生一個好的游戲的,但是一個好的游戲是萬萬不能缺少好的效果的。

很多人認為游戲的效果層有時和跟游戲邏輯本身並沒有太大的關系,往往就是在最終屏幕上再畫上一層效果層。但是游戲邏輯和效果層之間的通信是很重要的。這種通信往往體現在延時與等待上。比如飛機爆炸時,不接受任何用戶輸入,並且爆炸效果還要繼續跟隨飛機墜落,甚至爆炸的范圍會影響周圍的物體,要等待爆炸結果結束了才繼續進行游戲。游戲邏輯和效果層之間的通信是很復雜的問題。在這裡我突然有了罪惡感,我們沒有對游戲進行任何的分析就起步了,游戲完全是基於硬編碼的,我想到那兒,大家跟著看到那兒。飛機類僅僅是一個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中有欠妥當,生命周期也不一定就是基於桢的,有時基於時間,有時還有別的什麼。我是說她足夠復雜到交給另一個獨立類處理,在這裡實際需要的是一個足夠強大的顯示方法,其支持以桢數為參數顯示罷了。





其實我覺得自己說多了,也許你也被我搞糊塗了。對了目錄上少了一節,我們還缺少游戲的獎懲系統,下回我補上。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved