發表文章

目前顯示的是 7月, 2020的文章

C/C++遊戲程式透過Emscripten編譯為javascript移植成web版

圖片
最近一兩周利用空檔時間將過去作過的幾個小遊戲,改版成簡單的對應的web版。原來的程式底層都是使用C/C++實作,透過 Emscripten 將原來的程式build成javascript,然後再結合web應用完成簡單的移植。因為原來的程式一開始在實作時就幾乎是可以跨平台的,所以移植很順利很快。我目前使用的Emscripten是1.35.0版本,因為只是用作移植測試目的,自從安裝後就沒有再更新過。 完成移植的遊戲分別是: 成語四則運算 單人撲克101 Paint by Numbers 2005 精彩數獨詳解 移植的基本原則很簡單: 首先確定原來的C/C++程式可以在Emscripten的command line環境下編譯。 再來定義一些API可以讓html綱頁裡的javascript呼,這個部份更多細節可以參考 官方網站的文件 說明。 C/C++讓javascript呼叫的API定義好後,也編譯成功了。就可以先用printf的方式作簡單的測試,測試方式也很簡單。如下圖的例子,是一個簡單的將兩個數字相加並回傳和數的cAPI cAdd。在mainl裡用一個printf作簡單的測試,然後在cmdline環境下編譯成功後,透過nodejs來執行觀察結果是否正確。 API初步沒有問題了,然後就可以真正撰寫些code來呼叫這些API,主要方式是在javascript裡透過Module.ccall來呼叫我們的API。Module.ccall的第一個參數是API的名稱,第二個參數是API的回傳值類型,第三個參數是API的參數列表類型,第四個參數是參數列表。在我們的例子裡,API名稱叫作cAdd,回傳值是一個數字類型,參數列表是兩個數字類型,輸入1和2。結果用一個alert顯示出來,正確答案是3。 透過以上幾個簡單的原則,很容易就可以把一些原本用C/C++寫成的程式,改版成網頁版。