0

eventReceiver オブジェクト内からエンジンにアクセスしたいと考えています。彼らはゲームクラスの仲間ですが、どうすれば到達できますか?

// game.h
class game
{
    public:
        game();
        3dEngine* engine;
        eventReceiver* receiver;
};

// eventReceiver.h
class eventReceiver 
{
    public:
        eventReceiver () {}
        virtual bool OnEvent (const SEvent& event)
        {
            ...
            case QUIT_BUTTON_PRESSED:
>>>             engine->quit();     // how to access engine from here??
                return true;
            ...
        }
};

「これ」を使うべきですか?受信機からエンジンが見えない理由がわかりません。

4

3 に答える 3

1

クラスをシングルトンとして実装し、プロパティのゲッターを記述しengineます。コードへのアクセスは次のようになります。

game::getInstance()->getEngine()->quit();

ただし、ゲームクラス自体にメソッドを作成しquite()て実装の詳細を非表示にし、以下だけでなくアプリケーション全体のシャットダウンを処理できるようにすることをお勧めし3dEngineます。

game::getInstance()->quit();

gameクラスをシングルトンとして実装したくない場合は、gameオブジェクトの参照/ポインターをイベント ハンドラーのコンストラクターに渡すこともできます。

class CloseButtonHandler : public eventHandler {
    game& game;

public:

    CloseButtonHandler(game& game) : game(game) {
    }

    virtual bool OnEvent(const SEvent& event){
         ...
         game.getEngine()->quit();
    }
}
于 2012-07-29T22:21:51.693 に答える
0

eventReceiver はエンジンについて何も知らないはずです。それは悪い設計です。いくつかの解決策があります。合理的な解決策の 1 つは、イベントを明確に受け取ることができるので、gameから派生させることです。その後、ゲーム固有のハンドラーをそれ自体に実装できます。そこから を呼び出すことができます。eventReceivergameOnEventgameengine->quit

于 2012-07-29T22:08:45.987 に答える
0

このデザインがどれほどエレガントかはわかりませんが、機能します。

レシーバーをゲーム クラスから分離し、そのコンストラクターに myGame のインスタンスへのポインターを指定しました。(Paranaix のおかげで)

class eventReceiver {
    public:
        eventReceiver (game* gameInstance) : gamei(gameInstance)
        virtual bool OnEvent (...) 
            {...
            case QUIT_BUTTON_PRESSED:
                gamei.engine->quitGame();
            ...}
    private:
        game* gamei;
}

int main() {
    game myGame;
    eventReceiver receiver (&myGame);
}
于 2012-07-29T23:20:08.000 に答える