RPG引擎 - CRPG

#RPG #C++

這兩週全在寫一個跨平台的RPG引擎,來記錄一下第一階段所達成的

最近換了mac,想說要是能夠Mac上玩恐怖RPG那該有多好,可是大多經典恐怖RPG都沒有Mac版,可是去翻了一下RPGMaker並沒有支援Mac,覺得非常可惜。想說自己乾脆開發一個專門為恐怖RPG設計的引擎。 先給一下Github:crpg

以下大致說明三個重點:

引擎架構

基本上,為了能夠儘量讓RPGMaker無縫接軌,引擎架構很像RPGMaker的腳本,有在改RPGMaker腳本的朋友應該很熟悉以下這幾個物件:

為了能夠有一個大型的Global Pool,有一個會把const char* map到 void*的map:

1
2
3
4
5
6
struct StrCompare : public std::binary_function<const char*, const char*, bool>{
    public:
        bool operator() (const char* str1, const char* str2) const
            { return std::strcmp(str1, str2) < 0; }
};
typedef std::map<const char*, void* , StrCompare> Env;

其他幾個主要物件:

地圖格式

這是最主要的問題,要能被廣泛接受,並且有現成成熟的編輯器,原先有點擔心這塊,不過竟然已經有一群人做出來了,而且還開源:TiledMapEditor,xml格式也很容易讀取。

這裡直接推薦rapidxml。好用又快。

事件腳本

這裏我直接用Python,引擎會直接把腳本讀進來,呼叫腳本裡的函數。使用Function Pointer Callback達成腳本和遊戲引擎溝通。詳細方式見C和Python混和編程

然後腳本可以這樣寫:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
from Event import Event 

class Event1(Event):
    def __init__(self, func):
        Event.__init__(self, func)
        self.config = {
            "event_name" : "event1",
            "image" : "hero.bmp",
            "trigger_condition" : "on chat",
            "solid" : "true",
            "fixed_direction" : "false"
        }
    def Action(self):
        self.global_value["Test1"] += 1
        self.global_flag["Test2"] = True
        self.ShowMsg("Hello~" + str(self.global_value["Test1"]))
        self.DoMove((["Right"],
                     ["Right"],
                     ["Right"]))
        self.WaitForMove()

繼承的Event母類別把Callback包裝好了,所以可以直接Callself.xxx(yyy)

以上是第一階段較為重要的完成,不過仍然有許多待完成的部分:

音效

打算採用OpenAL做到

遊戲物件

跨平台

目前g++的編譯參數仍然只有辦法在mac上編譯

事件當前狀態取得和設定

就是事件Python當前的執行狀態(包括Call Stack, Heap..等),目前上無頭緒,可能需要動到Python-dev的底層。要不一個替代的解決方案就是自己設計一個很像Python的Script,自行做他的Interpreter。

目前在stackoverflow的發問

地形

這部分包括背景與主角的前後關係

不過這引擎的方向並不是全然RPG,我打算是往恐怖遊戲類型遊戲進行開發優化,所以並不會出現回合制對戰系統。及時制系統有可能會出現。