Love2DからJavaコードを呼び出す



すべての人に良い一日を!







Love2Dのゲームに広告を埋め込む必要がありました。 プレーヤーが勝った後にバナーを表示することにしました。その後、困難が発生しました。バナーはJavaアプリケーションコードによって呼び出され、勝ちはLuaコードで決定されます。 それらのCコードリンクは、エンジンにメソッドを追加する方法に関するチュートリアルがなく、自分でコードを掘り下げる必要がありました。 Android用のLove2Dリポジトリはこちらです。







どこから始めますか?



love.system.vibrate()



メソッド-AndroidでLove2Dを使用するときに表示されるメソッドを調査することから始めることにしました。これは、広告を追加したいだけでなく、どこかに追加されることを意味します。

GameActivityクラスを開くと、探しているバイブレーションメソッドが見つかります。ここでは、LuaからJavaコードがどのように呼び出されるかを説明する価値があります。







アプリケーションを起動すると、Love2Dモジュールごとに、モジュールクラスのインスタンスとバンドルクラスのインスタンス(スキーマオブジェクトをLua変数にバインドするオブジェクト)が作成されます。 Luaに統合する必要がある各メソッドのバインディングオブジェクトには、独自の小さなメソッドと、Luaのどのメソッドが一致する文字列に関連付けられているかを示すリストがあります。 次のようになります。







 //   static const luaL_Reg functions[] = { { "getOS", w_getOS }, { "getProcessorCount", w_getProcessorCount }, { "setClipboardText", w_setClipboardText }, { "getClipboardText", w_getClipboardText }, { "getPowerInfo", w_getPowerInfo }, { "openURL", w_openURL }, { "vibrate", w_vibrate }, { 0, 0 } }; extern "C" int luaopen_love_system(lua_State *L) { //   System *instance = instance(); if (instance == nullptr) { instance = new love::system::sdl::System(); } else instance->retain(); //   WrappedModule w; w.module = instance; w.name = "system"; w.type = MODULE_ID; w.functions = functions; w.types = nullptr; return luax_register_module(L, w); }
      
      





また、アンドロイド用に追加された追加メソッドは、. ./jni/love/src/common/



フォルダーにあり、 android



と呼ばれる別のクラスに保存されることに注意してください。







メソッドを追加する



まず、GameActivityクラスで静的メソッドを作成します。







 private static GameActivity instance; @Override protected void onCreate(Bundle savedInstanceState) { instance = this; // ... } // ... // ,    ,     //      public static void showAd() { Toast.makeText(instance, "Ad example", Toast.LENGTH_LONG).show(); }
      
      





次に、 love.system



モジュールにメソッドを作成します。 広告を紹介しているため、このモジュールを選択しましたが、システムを使用する必要はありません。 必要に応じて、独自のモジュールを作成することもできます。







最初に、 android



クラスにメソッドの主要部分を記述する必要があります。 宣言:







 // ./jni/love/src/common/android.h bool openURL(const std::string &url); void showAd(); void vibrate(double seconds);
      
      





そして作成:







 // ./jni/love/src/common/android.cpp void showAd() { //    Java JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv(); //  ,       jclass activity = env->FindClass("org/love2d/android/GameActivity"); //    jmethodID show_ad_method = env->GetStaticMethodID(activity, "showAd", "()V"); //    env->CallStaticVoidMethod(activity, show_ad_method); env->DeleteLocalRef(activity); }
      
      





3番目のパラメーターでメソッド識別子を受け取ると、メソッドが返すものと受け入れるパラメーターを示します。 メソッドが引数を受け入れる場合は、引数を括弧内にリストする必要があります。 メソッドが値を返す場合、 V



を対応する文字に変更する必要もあります。 したがって、この方法を説明するには:







 bool isGreater(double a, double b) { return a > b; }
      
      





次の行が使用されます: (DD)Z



詳細はこちら







モジュール自体にshowAd



メソッドを追加します。







 // ./jni/love/src/modules/system/System.h /** * Shows ad */ virtual void showAd() const;
      
      





さて、コード自体:







 // ./jni/love/src/modules/system/System.cpp void System::showAd() const { #ifdef LOVE_ANDROID love::android::showAd(); #endif }
      
      





接着剤



これで、これらすべてを束にして接続することができます。 バンドルクラスに適切なメソッドを追加します。







 int w_showAd(lua_State *L) { instance()->showAd(); return 0; } //       static const luaL_Reg functions[] = { { "getOS", w_getOS }, { "getProcessorCount", w_getProcessorCount }, { "setClipboardText", w_setClipboardText }, { "getClipboardText", w_getClipboardText }, { "getPowerInfo", w_getPowerInfo }, { "openURL", w_openURL }, { "vibrate", w_vibrate }, { "showAd", w_showAd }, { 0, 0 } };
      
      





最初からチュートリアルですべてをまとめます。







コードをluaに追加し( love.system.showAd()



)、チェックします:







出来上がり。







おわりに



このような操作の助けを借りて、広告を埋め込み、LED、カメラを制御し、一般的にゲームの助けを借りて多くの有用なことを行うことができます。







読んでくれてありがとう(:








All Articles