1

私はいくつかの基本的な2Dシューティングゲームを作成しましたが、それらは、それらが進む限り、うまく機能します。プログラミングの知識に基づいて、いくつかのオブジェクトを制御するための単純なスクリプト言語を使用してゲームを拡張することにしました。目的は、ランダムオブジェクトの実際の制御ではなく、スクリプトパーサー/エグゼキュータを作成する設計の一般的なプロセスに関するものです。

したがって、私の現在の考え方は、ラムダ式のコンテナー(おそらくマップ)を利用することです。パーサーは各行を読み取るときに、式のタイプを判別します。次に、命令のタイプを決定し、処理する必要のある値を検出すると、式の種類へのマップを開き、処理する必要のある値を渡します。

多かれ少なかれ疑似コードの例は次のようになります。

//We have determined somehow or another that this is an assignment operator
someContainerOfFunctions["assignment"](whatever_variable_we_want);

では、このようなデザインについてどう思いますか?

4

3 に答える 3

2

落胆することはありませんが、SquirrelやLuaのようなものをプロジェクトに埋め込み、APIと言語自体の使用法を学ぶことでより多くのことが得られると思います。これの利点は、実装について考える必要がなく、優れたパフォーマンスが得られることです。

スクリプト言語(基本的な言語でも)を最初から実装することは、特にこれまでに行ったことがない場合は、かなりの作業です。

于 2009-09-30T02:01:19.233 に答える
2

正直に言うと、あなたが説明したように良い考えだとは思いませんが、可能性はあります.

これにより、C++ の静的な数の引数の「煩わしい」負担が制限されます。これは、言語で必要な場合とそうでない場合があります。

これを想像してみてください - 関数を表現したいとします:

VM::allFunctions["functionName"](variable1);

しかし、その関数は 2 つの引数を取ります! dynamic-args 関数をどのように定義しますか? " ..." とは、 と を意味stdargs.hva_listます。残念ながら、va_list には欠点があります。追加の変数を指定する必要があります。これにより、変数がいくつあるかを何らかの形で知ることができます。そのため、架空の関数呼び出しを次のように変更します。

VM::allFunctions["functionName"](1, variable1);
VM::allFunctions["functionWithtwoArgs"](2, variable1, variable2);

これにより、新しい問題が発生します-実行時に、複数の引数を渡す方法はありません! したがって、これらの引数を組み合わせて、実行時に定義および使用できるものにする必要があります。(仮説的に)次のように定義しましょう。

typedef std::vector<Variable* > VariableList;

そして、私たちの呼び出しは次のとおりです。

VM::allFunctions["functionName"](varList);
VM::allFunctions["functionWithtwoArgs"](varList);

ここで「スコープ」に入ります。スコープなしで関数を「実行」することはできません。特に、複数の仮想マシン (サンドボックスなど) を持つことができる埋め込みスクリプト言語では、Scope型が必要になります。これにより、仮想呼び出しが次のように変更されます。

currentVM->allFunctions["functionName_twoArgs"].call(varList, currentVM->currentScope);

私は何度も続けることができますが、あなたは私の答えの要点を理解していると思います-C++は動的言語が好きではなく、ABIも変更される可能性が高いため、それに合わせて変更される可能性はほとんどありません。

うまくいけば、これはあなたを正しい方向に導くでしょう。

于 2009-09-30T02:34:49.580 に答える
0

C ++でのスクリプトエンジンの作成に関するGameDev.netのGregRosenblattの一連の記事(http://www.gamedev.net/reference/articles/article1633.asp)に価値があるかもしれません。

彼が採用しているアプローチは、ミニマリズムの側面で誤りを犯しているように思われるため、実装のアイデアにぴったりか、または優れた情報源である可能性があります。

于 2009-09-30T02:10:48.490 に答える