問題タブ [luabind]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - Lua / C ++ /luabind/他のlua動作スクリプトとの相互作用におけるメンバー関数の実行の遅延
私はメインループのあるゲームを持っています-各ループで、ゲーム内のすべてのNPCを呼び出します-> ProcessAI()でアクションを実行します。これはサーバーであるため、ProcessAIの呼び出しは、クライアントゲームのようにすべてのフレームで実行されるわけではありません。また、シングルスレッドです。
今、私はluabindを使用してluaでC ++コードベースを拡張したいと思いました(多分、ブーストオーバーヘッドがあっても)。だから私は私のNPCクラスのいくつかの関数をLUAに公開します。
たとえば、アクタースクリプト(より洗練された動作をするボスバトル)を作成したかったのですが、c ++ ProcessAI関数でイベントが発生するたびに、これを特定のNPCの対応するluaスクリプトに委任します。
私はboss.luaスクリプトで次のようなものを想像しました
ただし、これを行う方法がわかりません。ScheduleEventはLuaにエクスポートされたC ++関数である必要がありますが、これを使用してNPC(ボス)のオブジェクト参照を保持し、そのスクリプトで関数を呼び出すための最良のアプローチは何でしょうか。約2秒後?
さらに、この遅延実行(NPCが相互に対話できるようにしたい)とともに、私の現在のアイデアは、特別なNPCごとにアクター動作スクリプトを用意することです。
今私が想像したのは、2人のNPC間の会話を開始することです。
基本的に-NPC2の動作スクリプトであるluascriptBに存在するluascriptAから関数を呼び出すにはどうすればよいですか。良いデザインは何でしょうか?
ありがとう
c++ - c++ オブジェクトのクラス メタテーブルを取得して、obj を引数として lua 関数にプッシュする luabind
C++ オブジェクトの 1 つを lua 関数の引数として導入すると、パフォーマンスが大幅に低下することに気付きました。
これは非常に高速です。10 万回の呼び出しで 30 ミリ秒未満です。
今、私は別のオブジェクトを追加しました
100k の呼び出しに 1 秒以上かかるようになりました。(int や string などの別のプリミティブを arg として追加しても、パフォーマンスに影響はありません! また、オブジェクトをグローバル スコープに入れます (たとえば、毎回 func arg としてプッシュしないでください。パフォーマンスにも影響はありませんが、引数として必要です)。
これは、luabindを使用して呼び出す方法です
この「ハック」を使用して、luas pcall関数を直接使用するだけで、時間を0.5秒短縮できました。
それでも、私はそれがより速く、より良いものになると思います-これは私がやっていることだと思いました
したがって、luabindは各クラスのいくつかのメタテーブルを管理していると思います-しかし、それを取得する方法がわかりません-ソースで「__luabind_classrep」について何かを見ました-さらに-グローバルには、クラスを登録した名前のユーザーデータobjがありますルバインド。
編集:私は実際に最初のスローダウンの問題を追跡しました-それはluabindでも私のコードでもありませんでした-VS2010 F5でベンチマークを行っていましたが、自動的にデバッガーをアタッチしました-何らかの理由で、MyCObjを引数としてlua関数に追加すると-デバッガーは処理全体を遅くしました-シェルから手動でコマンドラインプログラムを実行しましたが、再び許容範囲内でした(同じVSプロジェクトのより高速なコンピューターが1秒ではなく4秒かかっていたため、これを偶然認識しただけです)非常にありそうもない)
lua - luabind を使用して、基底クラスから継承された C++ メンバー関数を呼び出す
ここに C++ コード、コンソール プロジェクト
ここでluabindを使用したluaコード
Q:
Button:Create で継承された関数 self:AddAnimation() を呼び出したとき。うわー!「CControl::AddAnimation」は出力されません! どうしたの?私はそれを2時間チェックしました。イライラします!どんな助けでも本当に感謝します
c++ - C++ 基底クラスからの lua オブジェクトの作成
C++ から lua などの基本クラスにエクスポートしました。
輸出コード:
次の部分: 私は関数を持つ StateManager を持っています:void StateManager::Push(IState*)
そしてそれはエクスポートです:
ここで、IState 型のオブジェクトを Lua で作成し、それを StateManager にプッシュします。
もちろん、これはうまくいきません。IState 型のオブジェクトの場合、MainState と言う方法がわかりません。
UPD
例の後:
エラー: クラス 'IState' に静的 '__init' がありません
そして、state = StateManager
ブラケットを持っている必要がありますか?それらには、そのような演算子がないというエラーがあります。
lua - Luaメンバー関数へのコールバック
アニメーションループで使用されるコールバック関数を持つlua「アニメーション変数」があります。
詳細をスキップして、このaddCallback関数はC++で次のように定義されています。
アニメーション変数が更新されると、コールバックはそのように実行されます(1つの引数で関数を呼び出します)。
私の質問は次のとおりです。addCallbackでメンバー関数を使用するにはどうすればよいですか?関数があるとするとTicker:animate(ypos)
、TickerインスタンスでaddCallbackを使用addCallBack(ticker:animate)
してもコンパイルされず、機能addCallBack(ticker.animate)
しません。luaのメンバー関数には暗黙の「自己」最初のパラメーターがあることを理解しています。
解決策はありますか、それともグローバル関数を使用する必要がありますか?
c++ - luaおよびluabindとのリンクエラー-mingw
C ++クラスをluaにバインドするためにluabindを使用していますが、luabindとほとんどのlua関数を機能させることができますが、使用しようとすると次のようluaL_openlibs()
になります。
リンカーに-lluaを追加すると、次のようになります。
ビルド済みのmingwバイナリが見つからなかったため、自分でluabindをビルドしました。
lua - Luabind - Lua ライブラリが見つかりません
私のプロジェクト用に Luabind をコンパイルしようとしていますが、ほとんど成功していません。luabind の兄弟として lua ディレクトリ (src、makefile などを含む) があります。LUA_PATH を /my/dirs/lua フォルダーに設定しています。OSX Server 10.4 を実行しています。
luabind に入って bjam と入力すると、次のエラーが表示されます。
LUA_PATH を間違ったディレクトリに設定すると、73 行目にエラーが表示されます (Lua のインクルード ディレクトリを特定できません)。
私はこのチュートリアルに大まかに従いました: http://cfc.kizzx2.com/index.php/building-luabind-on-mac-os-x/
c++ - luabind がポインター mingw を変更しない
この質問で発生したリンカー エラーを修正しましたが、別の問題が発生しています。lua を呼び出してオブジェクトをcreateObject()
作成すると、boost::shared_ptr が新しいオブジェクトに作成され、リストに追加されて返されます。
mingw を使用する Windows では、lua で変更を行うと、変更が C++ オブジェクトに適用されません。Linuxで同じものを構築し、正常に機能したため、コードの問題になることはありません。
ObjectPtr
とPlayerPtr
は Object と Player の boost::shared_ptr でwindow
あり、静的な Window ポインタであり、引数なしで の代わりに使用するのcreatePlayer()
と同じです。createObject()
Player
Object
ルアで:
コンソールに「赤」が表示されます。しかし、C++ では、値は単に "" です。
私はそれをデバッグし、オブジェクトが作成され、C++ でリストに追加されましたが、すべての変数がデフォルト状態にあるため、変更は行われませんでした。
luabind と mingw の問題か、単にビルドの問題だと思いますが、
デフォルトのビルド設定から変更したのは、コンパイルするために必要だった 2 つのことだけでした。jamfile で LUA_PATH を設定して、lua が入っているディレクトリを指すようにしました (環境変数から取得するのではなく)。私が変更され
に
(
mingwは何らかの理由で好きではなかったので...(そして、はい、正しい場所に#endifを追加しました)
更新: msvc10 も使用してみましたが、まだ同じ問題があります。また、Linux にある同じバージョンのブーストに対してビルドしようとしました。しかし、役に立たない。
c++ - オブジェクトを作成する C++ テンプレート メソッド
Luabind を使用して、ゲーム エンジンを Lua に公開しています。最近、Lua で GUIObject * obj = new GUIObject() などの「新しい」オブジェクトを作成する方法がなく、代わりに Lua 内で作成されたものはすべて Lua によって所有されていることがわかったときに、問題が発生しました。
それは大きな問題ではありませんでしたが、GUIManager Has などのオブジェクトに一種の Factory パターンを作成することにしました。
私の Luabind バインディングは次のようになります。
を呼び出すことにより、Luaですべてが機能します。
ただし、渡すオブジェクトを本質的に作成しているため、これは「正しくない」と感じています。もっと簡単な方法があると確信していますが、これまでに試した他のすべての方法は、コンパイラまたはルビンド。
必要に応じて、さらに詳しい情報をお気軽にお尋ねください
ありがとう