2015-09-23 19 views
6

私のC++ゲームエンジンにスクリプト機能を追加したいと思います。ゲームエンジンのスクリプト言語としてのラケット

私はEngine.exePhysics.dllAudio.dllを持っていると私は、高レベルのラケットのラッパーであるScripting.dllを追加しています。

Engine.exeロードPhysics.dll物理ワールドを設定し、ロードAudio.dllを設定し、オーディオワールドを設定します。バインディングをPhysics.dll,Audio.dllに設定し、ゲームスクリプトをロードするには、Scripting.dllをロードすることになっています。 C++プログラムにラケットを埋め込むための2つの方法があります私の知る限り

Foreign Interfaceを使用して

Physics.dllAudio.dll 2回ロードすることにより、必要に奇妙なようです。まずEngine.exeから、次にゲームスクリプトから。

書くことExtensionsは、C++側でスクリプトのバインディングを実行できるため、より魅力的です。一方、raco ctoolで拡張機能を構築しなければなりません。mzdynオブジェクトファイルとリンクする必要があります。これは厄介なものです。mzdynは静的ライブラリですか?

私は単一のメソッドを実装したいと思います。 setupScriptBindings()Physics.dllおよびAudio.dllの両方で使用し、起動時にEngine.exeから呼び出します。

これを行う簡単な方法はありますか?

+0

Hm、多分[this](http://docs.racket-lang.org/inside/embedding.html)の説明が役に立ちます。 –

+0

Hm ...あなたが提供するリンクは、** RacketプログラムにC /その他のコードを埋め込むことについて話します**。あなたからの説明から、あなたはそれを他の方法で欲しいと思います。あなたのC++アプリケーションにラケットを埋め込む:http://docs.racket-lang.org/inside/embedding.html 最も簡単でおそらく最もクリーンな解決策は、あなたのゲームエンティティを制御するための何らかのプロトコルを定義し、ラケットを開始することです新しいプロセスとして、ソケットやその他のIPCメカニズムを使用して通信します。 –

+0

Offtopic:RacketはNaughty Dogのビデオゲーム制作に成功しました。 [«Racket on the Playstation 3»](http://www.youtube.com/watch?v=oSmqbnhHp1c)と[«未知の2の国家ベースのスクリプト作成»:泥棒の中で»](http://www.gameenginebook .com/resources/gdc09-statescripting-uncharted2.pdf)。 –

答えて

3

ラケットをCコードに接続する拡張とFFIの両方の方法を使用していたのですが、FFIのアプローチはと多くてです。 RacketのC関数へのバインディングは明確に規定されており、ラケットのCタイプを扱うのは非常にうまくいきます。 FFIアプローチを使用する唯一の欠点は、AFAIK、あなたのラケットプログラムはドライバアプリケーションでなければならないということです。

埋め込みアプローチでは、C/C++実行ファイルはドライバですが、ラケットコードでインターフェイスを宣言する方がはるかに手作業でエラーが発生しやすくなります。 raco ctoolを見つけてそれを複製するか、ラケットのビルドシステムがあなたのものを引き継ぐようにする必要はありません。私たちの目的のために、我々はラケットのソースを抽出し、それを自分で構築しました。私は本当にそのアプローチを推奨していません。

究極的に私のアプリケーションをCの関数用に読み込んだ外部の.DLL/.soファイルを持つRacketアプリケーションにするのが最も効果的でしたが、あなたが埋め込みの方法に固執しているように思えます。

+0

ありがとうございます。はい、私は組み込みソリューションが必要です。あなたはそれが難しいかもしれないと言いますが、ソースからラケットを構築することは私にとってもっと魅力的なようです。埋め込みベースのアプローチから«native»↔ "script"バインディングの例を提供できれば、非常に役に立ちます。プレーンテキスト、[バイトコード](http://docs.racket-lang.org/raco/make.html)または[スタンドアロン実行可能ファイル](http://docs.racket-lang。 org/raco/exe.html)? –

+2

プレーンテキストまたはバイトコードを使用します。バイトコードの方がはるかに高速ですが、必要に応じてRacketが更新するように注意する必要があります。 –

+2

私たちの固有の<->スクリプトバインディングは、ドキュメントの例のように見えますが、特別なものはありません。 –

関連する問題