0

Allegro を使用して C++ で 2D RPG ゲーム エンジンを作成しています。スクリプト システムを実装する必要があるところまで来ました。だから、私の問題はこれです:

Eventという構造体があります。この構造体内には、イベントが発生したときに実行する関数を指す関数ポインターがあります。例を次に示します。

struct Event {
    //...
    void (*func)(Player*, void*);
    //...
}

さて、イベントを作成するには、次の関数があります。

Event* Events::register_event_source(int x, int y, std::string name, Player* player, void (*func)(Player*, void*));

したがって、それを使用するには、この署名で関数を作成するだけです:

void test_event(Player* p, void* data)
{
    //Do something cool here
}

次に、イベント ソースを登録し、その関数にアドレスを指定します。

//...
Player* player = new Player(0, 0);
//...
Event* evt = Events::register_event_source(10, 10, "test event", player, &test_event);
//Eventually set some data for the event
evt->set_data(new std::string("Just some test data"));

このようにして、プレーヤーが割り当てられたスポット (この場合は x = 10、y = 10) を通過すると、イベントが発生し、test_event関数のコードが実行されます。

さて、私の質問は、実行時にこのプロセスを行うこと、または少なくともそれに近づくことは可能ですか?? ...実行時に関数(この場合は「test_event」)を作成する必要がありますが、調査を行ったところ、実行時に関数を作成することは実際には不可能であることがわかったと思います。それで、私はどのアプローチをとるべきですか?? ...私はそれが抽象的な質問であることを知っています...しかし、私は本当にこの問題にアプローチする方法を知りません.

アドバイスありがとうございます!説明が下手ですみません…英語は私の言語ではありません!

4

1 に答える 1

2

私があなたが表現しようとしていることを正しく理解しているなら、あなたは実行時に構築されたいくつかのロジックを文字列に解釈するスクリプトエンジンを書いています、そしてこれは何をすべきかを決定するはずPlayerですdata。もしそうなら、私はあなたが次のような機能を持っているべきだと想像することができます

void InterpretScriptCode(Player* p, void* data, string const& code)

または、およびで説明されているロジックを解釈して実行する同等のもの。codepdata

次に、およびを使用std::bindstd::functionて、スクリプトエンジンへの呼び出しをカプセル化できます。

// Header <functional> needs to be included, and a proper "using namespace"
// directive must be present for bringing placeholders _1 and _2 into scope

std::function<void(Player*, void*)> fxn = std::bind(
    &InterpretScriptCode,
     _1,
     _2,
    "int x = 0; ... blah blah" // this should be your run-time generated script
    );

そしてfxn、入力をregister_event_source()関数に渡します。

ところで、イベントの登録/処理を実現するためにBoost.Signals/Boost.Signals2を使用することに興味があるかもしれません。

C ++ 11を使用していない場合は、boost::bindandboost::functionの代わりにstd::bindandを使用できますstd::function

于 2013-01-13T17:15:24.887 に答える