C ++とLuaを使用したゲーム用のカスタムスクリプトエンジン(パート-1)

まえがき



おそらく、ゲーム用に独自のエンジンを作成したい、または単にそれを実装する方法を学習したかったのに、何らかの理由で成功しなかったのかもしれません。

まあ、トピックは非常に広範囲であるため、2Dゲームエンジンの作成に関する一連のレッスンを開始し、同じLove2dよりも悪くないことを信じています。これが私たちのエンジンのスタイルです。



何が必要ですか?





すべてはどのように配置されていますか?



すべてのゲームロジックは、たとえば「main.lua」などのファイルにプログラムされます。 エンジンはこのファイルを読み取り、このファイルに記述されているアクションを実行します。 グラフィックス出力は、SDL 2.0、物理学-Box2D、オーディオ-OpenAl、スクリプト-Luaを使用します。 IDE-Microsoft Visual Studioのすべてのバージョン。



図を描いた







さあ始めましょう!



最初にダウンロードする必要があります:



  1. ルア
  2. SDL 2.0
  3. Box2D(自分でコンパイルする必要があります)
  4. オープン


すべてのファイルをダウンロードして、別のフォルダーに移動します(例:「Engine SDK」)。 MVSを開き、「空の」コンソールアプリケーションを作成してから、ファイル「main.cpp」を追加します。



これまでのところ、次のように記入しています。



int main() { return 0; }
      
      





コンパイルする場合は、コンパイルします。 「プロジェクト→プロジェクトのプロパティ」をクリックします。 「C / C ++→一般」を選択し、追加の包含フォルダーを追加します(Luaアーカイブから抽出したパスを示します)。 Luaを「含める」パスを指定します。







その後、「リンカー→一般」に進み、libへのパスを追加します。







「main.cpp」を適用および変更します



 int main(int argc, char * argv[]) { return 0; }
      
      





コンパイルして先に進みます。 次に、エンジンの主要部分となる別のヘッダーファイルを作成する必要があります。 ファイル「Engine.h」を追加します。 そして、すぐにこの方法で記入してください。



 #include<iostream> #include<lua.hpp> #pragma comment(lib,"lua53") //      Lua 5.3. using namespace std; class Lua { private: lua_State * lua_state; public: void Init() //    . { lua_state = luaL_newstate(); static const luaL_Reg lualibs[] = { { "base", luaopen_base }, { "io", luaopen_io }, { "os",luaopen_os }, { "math",luaopen_math }, { "table",luaopen_table }, { "string",luaopen_string }, { "package",luaopen_package }, { NULL, NULL } }; for (const luaL_Reg *lib = lualibs; lib->func != NULL; lib++) { luaL_requiref(lua_state, lib->name, lib->func, 1); lua_settop(lua_state, 0); } } void Open(const char*filename) //     (main.lua) { luaL_openlibs(lua_state); if (luaL_dofile(lua_state, filename)) { const char*error = lua_tostring(lua_state, -1); } } void Close() //  { lua_close(lua_state); } void Reg_int(int value, char*name) { lua_pushinteger(lua_state, value); lua_setglobal(lua_state, name); } void Reg_double(double value, char*name) { lua_pushnumber(lua_state, value); lua_setglobal(lua_state, name); } void Reg_bool(bool value, char*name) { lua_pushboolean(lua_state, value); lua_setglobal(lua_state, name); } void Reg_string(char*value, char*name) { lua_pushstring(lua_state, value); lua_setglobal(lua_state, name); } void Reg_function(lua_CFunction value, const char*name) //    { lua_pushcfunction(lua_state, value); lua_setglobal(lua_state, name); } int Get_int(int index) //      { return (int)lua_tointeger(lua_state, index); } double Get_double(int index) { return lua_tonumber(lua_state, index); } char* Get_string(int index) { return (char*)lua_tostring(lua_state, index); } bool Get_bool(int index) { return lua_toboolean(lua_state, index); } void Return_int(int value) //      { lua_pushinteger(lua_state, value); } void Return_double(double value) { lua_pushnumber(lua_state, value); } void Return_string(char*value) { lua_pushstring(lua_state, value); } void Return_bool(int value) { lua_pushboolean(lua_state, value); } int Call_load() //    { lua_getglobal(lua_state, "Load"); lua_call(lua_state, 0, 1); return 0; } int Call_update() //     { lua_getglobal(lua_state, "Update"); lua_call(lua_state, 0, 1); return 0; } int Call_draw() { lua_getglobal(lua_state, "Draw"); //   "Update" lua_call(lua_state, 0, 1); return 0; } }; Lua lua;// lua 
      
      





エラーがない場合はコンパイルし、エラーがある場合はどこかで台無しにします。 「main.cpp」を変更します。



 include "Engine.h" int main(int argc, char * argv[]) { lua.Init(); lua.Open("main.lua"); lua.Call_load(); lua.Close(); return 0; }
      
      





エラーがなければ、コンパイルを続けます。 プロジェクトフォルダーにテキストファイル「main.lua」を作成します。 次のように入力します。



 function Load() print("Lua inited!") end function Update() end function Draw() end
      
      





コンパイルし、「lua5 * .dll」をプロジェクトフォルダーにドロップして実行し、Oppa! コンソールで、「Lua inited!」 基本的に、単純なLuaインタープリターを作成しました。 第二部では、グラフィックスの結論に進みます。



All Articles