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