基于Java的簡單2DRPG游戲系統設計
來源:用戶上傳
作者:
摘 要:近年來游戲的發展十分迅速,中國成為了全球最大的游戲市場,而且游戲行業的整體收入還在不斷增長。2D像素風RPG游戲在二三十年前曾經紅極一時,憑借自身的特點,在今天也得到了很多人的喜愛。而Java具有很多特性,用Java開發的軟件可以方便地移植到不同的平臺上。而游戲玩家使用的操作系統并不統一,為了方便游戲在各種系統下的穩定運行,所以采用了Java進行編碼。
關鍵詞:Java RPG 游戲 swing 腳本
中圖分類號:TP311 文獻標識碼:A 文章編號:1672-3791(2019)03(c)-0021-02
1 游戲系統結構
該游戲系統使用Java的swing來建立GUI界面。除此之外,它的系統中包括了碰撞檢測、畫面渲染、音效、腳本處理、文件I/O等部分。利用swing的事件監聽來接收玩家的操作。碰撞檢測用來限制玩家的移動范圍。畫面渲染部分將多個圖層以及特效繪制在屏幕上。在事件觸發時由音效部分來播放各種音樂。腳本處理用來處理提取編寫好的游戲腳本,引導游戲發展。文件I/O部分用于游戲從本地加載數據或保存數據。
2 圖形界面
當程序開始運行后首先加載本地的各種配置文件,如果配置文件正常,就會通過配置中的信息來創建窗口,通過用窗口監聽AWT事件來接收所有玩家的控制,并根據具體的事件類型進行反饋。
窗口在創建后會創建多個panel,分別用來顯示游戲中不同的界面。當游戲需要進行頁面切換時只需要調整這些panel之間的可視性即可。各個面板在被顯示的時候都會執行響應的操作,存取檔的panel在被顯示的時候會加載本地的存檔索引。設置界面的panel在被顯示的時候會根據當前的設置顯示對應的數據。游戲界面的panel在被顯示的時候會實例化一個線程用于游戲的主循環。
2.1 雙緩沖刷新畫面
由于游戲畫面分為多個圖層,而且人物之間也有可能出現覆蓋,如果將每個圖像直接刷新在屏幕上可能會造成游戲畫面的閃爍。為了防止這種情況出現,系統會將所有需要刷新的畫面提前處理。將這些圖像先在內存中繪制到一張圖上,等到游戲下一幀刷新時再一次性刷新到屏幕,這樣可以有效提高畫面質量。
2.2 循環渲染延時
游戲畫面的渲染放在了游戲的主循環中,每次循環更新過游戲數據后,渲染模塊才會根據最新的數據進行游戲畫面的渲染,并進行響應的延時。
系統默認畫面幀數為60幀,也就是說理想情況下每幀應該用時16.67ms。每幀渲染后延時模塊會用1/60減去本幀從開始到結束所用的時間和上一幀多耗費的納秒時間,得到本幀應該延時的時間。如果本幀超過了自己應該用的時間就放棄本次延時。當放棄達到某一數量就讓自己的CPU使用時間一次。
3 數據文件
游戲中需要用到很多的本地文件,或者有些信息必須從本地加載,為了統一加載這些數據,每種都有其對應的數據文件。
3.1 地圖配置文件
一張地圖有時會有多個圖層,可能會有對應的BGM,地圖中的某些位置可能無法移動,也可能會觸發某些事件。這些信息就需要記錄在地圖的配置文件當中。配置文件包含地圖的寬高、地圖圖片的地址、地圖對應的事件二維數組、地圖中自動觸發事件的編號,以及可以行走的區域編號、地圖默認的BGM編號。
所有地圖配置文件的地址存在一個地圖配置索引文件中,這個文件在程序初始化階段被加載。
3.2 角色配置文件
每個角色都有自己對應的立繪、id、名字等數據,這些數據被保存在角色配置文件中,此文件包含所有角色的名字、立繪地址、行走圖地址,以數據的順序作為角色的id。此文件在程序初始化時被加載,并且根據其中信息在程序中實例化角色的對象。
3.3 腳本文件
每張地圖中都會有很多個事件,每個事件都對應著一個腳本文件,在玩家觸發此事件的時候,腳本解釋器就會根據所處的地圖,到本地圖對應的腳本文件夾下加載對應的腳本文件,解釋器對腳本中每條命令進行順序執行。
3.4 存檔文件
游戲中事件觸發的順序,每個事件需要實行的步驟都被保存在一個數組中。游戲中玩家對物品的擁有情況只分為有或沒有,為了節省空間使用壓位法將數據保存在一個64位的長整形中。
在玩家進行存檔操作時,系統會將保存事件進度的數組、保存物品有無的長整型、當前玩家所在地圖編號、玩家在當前地圖的坐標這幾個數據輸出到本地的存檔文件。
當需要繼續游戲時,系統只需要讀取本地的存檔數據,再跟進存檔加載其他文件就可以繼續游戲。
3.5 事件索引文件
為了方便維護和修改,每張地圖中的腳本編號都是重新開始的,這樣避免了想在靠前的地圖中加入新腳本時需要把所有后面的腳本編號后移的問題。
事件索引文件中記錄的是每個地圖中一共有多少事件,腳本系統會根據這個文件來為各個事件分配id。這樣某個腳本在需要修改其他事件進度的時候,就可以地圖編號和事件編號得到那個事件的id。
4 腳本系統
系統采用了自主設計的腳本格式和對應的腳本解釋模塊。將所有事件根據地圖順序進行統一編號。將每一個事件對應到一個獨立的腳本文件。把每個事件可能對應的不同情況以分步的方式寫在事件對應的腳本文件中,解釋器會根據玩家的操作、其他事件完成情況、玩家的狀態等來選擇對應的步驟執行。 通過這種腳本命令可以實現以下功能:
?。?)控制顯示,切換或取消圖片、特效、對話、表情;(2)在沒有玩家控制的情況下移動人物;(3)播放各種音效;(4)切換地圖;(5)修改各個事件的完成度;(6)顯示選擇框來讓玩家做判斷。
通過這些功能,基本可以滿足游戲的敘事和過場表演的效果。
事件觸發后,解釋器會首先判斷當前玩家是否滿足此事件的觸發要求,如果滿足就開始按行讀取并執行腳本。
腳本命令大致分為兩類。
需要玩家響應的:解釋器在讀取到這一行命令時就會進入循環判斷玩家是否有做出一些響應。只有在有響應時才會執行這一行命令。否則會一直等待玩家的響應。
不需要玩家響應的:解釋器在讀取到這一行命令的時候會進行一些與本命令有關的條件判斷,如果滿足就直接執行,不等待玩家的響應。
5 玩家控制
系統通過對AWT事件的監聽處理來獲取玩家的控制輸入。在主循環中每次更新游戲時會根據讀取到的控制信息來更新系統中各個對象的狀態。
游戲中的角色在系統中被抽象為一個矩形,在角色移動的時候,系統會以這個矩形的四邊和地圖對應的事件數組為基礎,對角色的移動進行碰撞檢測。如果下一次移動角色會進入不能進入的區域,系統將會把角色的位置信息更新為緊貼著區域邊界,以防止角色越界。
6 結語
該游戲系統通過Java代碼實現了以上部分,完成了作為一個簡單RPG游戲系統所需要的基本功能。通過對這些部分的組合運用,可以實現很多游戲效果。其中大部分模塊都可以單獨作為組件,只需要給它對應的配置文件,就可以在其他代碼中復用。但是在某些地方還存在著一些缺陷,比如渲染延時會使游戲內時間收到影響、畫面渲染時前后兩幀可能浪費了時間因為大部分區域沒有發生變化等。這些問題還需要進行優化。
參考文獻
[1] 邱仲潘.Java游戲編程[M].北京:科學出版社,2004:32.
[2] 趙滿來.可視化Java GUI程序設計教程——基于Swing組件庫及NetBeans IDE[M].北京:清華大學出版社,2015.
[3] Gregory J,葉勁峰.游戲引擎架構[M].北京:電子工業出版社,2014:277-356.
轉載注明來源:http://www.hailuomaifang.com/8/view-14874954.htm