問題タブ [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.

0 投票する
1 に答える
390 参照

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から関数を呼び出すにはどうすればよいですか。良いデザインは何でしょうか?

ありがとう

0 投票する
1 に答える
970 参照

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秒かかっていたため、これを偶然認識しただけです)非常にありそうもない)

0 投票する
1 に答える
576 参照

lua - luabind を使用して、基底クラスから継承された C++ メンバー関数を呼び出す

ここに C++ コード、コンソール プロジェクト

ここでluabindを使用したluaコード

Q:

Button:Create で継承された関数 self:AddAnimation() を呼び出したとき。うわー!「CControl::AddAnimation」は出力されません! どうしたの?私はそれを2時間チェックしました。イライラします!どんな助けでも本当に感謝します

ここに画像の説明を入力

0 投票する
1 に答える
611 参照

c++ - C++ 基底クラスからの lua オブジェクトの作成

C++ から lua などの基本クラスにエクスポートしました。

輸出コード:

次の部分: 私は関数を持つ StateManager を持っています:void StateManager::Push(IState*)そしてそれはエクスポートです:

ここで、IState 型のオブジェクトを Lua で作成し、それを StateManager にプッシュします。

もちろん、これはうまくいきません。IState 型のオブジェクトの場合、MainState と言う方法がわかりません。


UPD

例の後:

エラー: クラス 'IState' に静的 '__init' がありません

そして、state = StateManagerブラケットを持っている必要がありますか?それらには、そのような演算子がないというエラーがあります。

0 投票する
1 に答える
1229 参照

lua - Luaメンバー関数へのコールバック

アニメーションループで使用されるコールバック関数を持つlua「アニメーション変数」があります。

詳細をスキップして、このaddCallback関数はC++で次のように定義されています。

アニメーション変数が更新されると、コールバックはそのように実行されます(1つの引数で関数を呼び出します)。

私の質問は次のとおりです。addCallbackでメンバー関数を使用するにはどうすればよいですか?関数があるとするとTicker:animate(ypos)、TickerインスタンスでaddCallbackを使用addCallBack(ticker:animate)してもコンパイルされず、機能addCallBack(ticker.animate)しません。luaのメンバー関数には暗黙の「自己」最初のパラメーターがあることを理解しています。

解決策はありますか、それともグローバル関数を使用する必要がありますか?

0 投票する
1 に答える
951 参照

c++ - luaおよびluabindとのリンクエラー-mingw

C ++クラスをluaにバインドするためにluabindを使用していますが、luabindとほとんどのlua関数を機能させることができますが、使用しようとすると次のようluaL_openlibs()になります。

リンカーに-lluaを追加すると、次のようになります。

ビルド済みのmingwバイナリが見つからなかったため、自分でluabindをビルドしました。

0 投票する
1 に答える
1637 参照

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/

0 投票する
0 に答える
177 参照

c++ - luabind がポインター mingw を変更しない

この質問で発生したリンカー エラーを修正しましたが、別の問題が発生しています。lua を呼び出してオブジェクトをcreateObject()作成すると、boost::shared_ptr が新しいオブジェクトに作成され、リストに追加されて返されます。

mingw を使用する Windows では、lua で変更を行うと、変更が C++ オブジェクトに適用されません。Linuxで同じものを構築し、正常に機能したため、コードの問題になることはありません。

ObjectPtrPlayerPtrは Object と Player の boost::shared_ptr でwindowあり、静的な Window ポインタであり、引数なしで の代わりに使用するのcreatePlayer()と同じです。createObject()PlayerObject

ルアで:

コンソールに「赤」が表示されます。しかし、C++ では、値は単に "" です。

私はそれをデバッグし、オブジェクトが作成され、C++ でリストに追加されましたが、すべての変数がデフォルト状態にあるため、変更は行われませんでした。

luabind と mingw の問題か、単にビルドの問題だと思いますが、

デフォルトのビルド設定から変更したのは、コンパイルするために必要だった 2 つのことだけでした。jamfile で LUA_PATH を設定して、lua が入っているディレクトリを指すようにしました (環境変数から取得するのではなく)。私が変更され

(mingwは何らかの理由で好きではなかったので...(そして、はい、正しい場所に#endifを追加しました)

更新: msvc10 も使用してみましたが、まだ同じ問題があります。また、Linux にある同じバージョンのブーストに対してビルドしようとしました。しかし、役に立たない。

0 投票する
1 に答える
624 参照

c++ - オブジェクトを作成する C++ テンプレート メソッド

Luabind を使用して、ゲーム エンジンを Lua に公開しています。最近、Lua で GUIObject * obj = new GUIObject() などの「新しい」オブジェクトを作成する方法がなく、代わりに Lua 内で作成されたものはすべて Lua によって所有されていることがわかったときに、問題が発生しました。

それは大きな問題ではありませんでしたが、GUIManager Has などのオブジェクトに一種の Factory パターンを作成することにしました。

私の Luabind バインディングは次のようになります。

を呼び出すことにより、Luaですべてが機能します。

ただし、渡すオブジェクトを本質的に作成しているため、これは「正しくない」と感じています。もっと簡単な方法があると確信していますが、これまでに試した他のすべての方法は、コンパイラまたはルビンド。

必要に応じて、さらに詳しい情報をお気軽にお尋ねください

ありがとう