程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> J2ME潛艇大戰游戲設計與實現

J2ME潛艇大戰游戲設計與實現

編輯:J2ME

摘要

    本文給出了一個飛機射擊類(潛艇)游戲的設計過程以及相應的流程圖,並提供了Demo版源代碼下載地址,游戲在sun wtk v2.2 下調試通過。

聲明:本游戲所用的資源大多不屬於作者,代碼僅供非商業用途的學習參考。

以下為游戲的幾張截圖



游戲設計

1 游戲操作流程:

    游戲的初始畫面是一個implusive的List列表格式,選擇new game以後就可以啟動游戲,游戲是以全屏方式開啟,但仍有用於暫停/開始和退出的命令響應功能鍵。在游戲當中啟動暫停,海水和海洋生物仍將繼續活動,但敵方潛艇和所有魚雷都將靜止下來,玩家的控制也將不起作用,直到游戲被再次啟動為止。從游戲狀態退出將回到菜單界面,再次選擇退出將退出程序。

以下是游戲的總體流程圖:




2 算法處理

游戲自身是一個單態結構(singletone),由一個Controller來處理目前應該顯現的屏幕和狀態。主要的顯示類包括主畫面,游戲畫布,幫助畫面和一些輔助的Alert,其中最重要是游戲畫面。游戲是在MIDP 2的狀態下運行的,所以畫面繼承了GameCanvas。游戲中的角色圖層全部加載在一個遠大於手機屏幕大小的圖層管理器上。當玩家位置移動時,圖層管理器同步計算出玩家的相對位置,移動當前圖層的顯示位置。

這個游戲的本質就是在midlet啟動後把整個畫布作為一個線程,每隔25ms掃描一下用戶按鍵操作,每隔50ms掃描一次敵人和魚雷等物體的運動狀態,對於比較苛求的子彈射出實時響應,則繼承了keyPressed方法。

在掃描玩家移動操作時,按鍵編碼被傳入到玩家潛艇的響應方法。在掃描敵人和魚雷運動時,分兩步完成。

第一步,執行各個物體畫面的移動方法。程序並不為每個新增魚雷或者敵人開啟一個新線程,太多線程會造成程序的性能直線下降;而是為每一個物體類型保留一個Vector數組,每當一個新物體產生,他將首先被加入改類型所屬的數組中,然後才在圖層上畫出;當物體消除時,除了在圖層上被消除,也需要從響應數組中刪除。這樣就形成一種注冊機制,所有游戲物體的產生和消除都需要向畫布注冊,畫布擁有不同類型物體的所有“名單”,所以,當執行移動命令時,只需要遍歷各個類型數組,依次執行其中每個元素的移動方法即可。

第二步,就是一般意義上重畫,這裡使用flushGraphics()替代了傳統的repaint(),由於本游戲是以導入圖片為操作對象,圖片位置的更改已經在第一步被執行,所以沒有怎麼涉及到象素級的重畫,只是在游戲初始化狀態時需要加載各個物體數組所對應的圖層到新的圖層管理器。


畫布觸發流程簡圖:

(由於手上沒有rose,只有暫時用EclipseUML的流程圖畫出草圖,若干有問題的地方需要商榷,也希望擅長此到的朋友不吝指正)



3 類結構

以下列出了主要組成類的含義結構,並以游戲畫布為中心列出一個類關聯圖。

Controller: 控制類,用以控制當前屏幕顯示哪一個Displayable類。

SubObject: 接口類型。玩家潛艇,敵人潛艇以及魚雷等可移動圖層類型皆擴展於此接口。

Sub: 玩家潛艇。包含了位置,生命值等成員變量以及移動,開火等方法。

EnemySub, MoveableSprite, Tinfish: 敵人潛艇,海洋生物,魚雷。都是可移動圖層類型,一旦產生就在畫布中注冊,由時間觸發器維護其運動和生命狀態。

SubCanvas: 游戲主畫布。存儲著游戲地圖信息,游戲狀態,玩家信息,同步維護著敵人潛艇,魚雷,海洋生物的運動和生存狀態。

SubCanvas關聯類圖:





4 源代碼

本程序的源代碼,包括jad,混淆過的jar和一個rar文件,全部可以在 http://www.hyweb.Net/BrowseFiles.ASPx?Folder=Public/My%20Project 上下載到,代碼中包含了較為詳細的注釋。這份程序只是一個demo版本,有一些遺留問題(玩家生命值顯示,性能優化)還需要進一步完善,有任何好的建議,請一定聯系我. ^_^

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