複数のゲームで同じウィンドウを再利用することは可能ですか?


7

特に、私はC#とXNA、そして明らかにWindowsについて考えています。通常のXNAゲームであるメインゲームがあるとしますが、ある時点で、XNAにも実装されているがゲームとは完全に独立したミニゲームに一時的に切り替えたいと考えています。

同じウィンドウハンドルを再利用しながら、2つのゲームに切り替えたり、元に戻したりする方法はありますか?また、古い状態をメモリに保持することもできますが、この永続的なファイルへの書き込みも実装できます。

また、最初のゲームに戻るときに、ミニゲームのメインメソッドによって返された値にアクセスする方法はありますか?たとえば、プレーヤーがミニゲームをクリアしたかどうかに応じて、1または0になります。


アンドリュー・ラッセルは書いている:

ミニゲームとメインゲームを同じプログラム内の別々のクラスに構築する必要があります。これらの各クラスには、Update、Draw、Initializeなどのメソッドが必要です。次に、これらのメソッドを呼び出して一度に1つのゲームのみをアクティブにする何らかの種類のマスターコントローラーを用意する必要があります(これは単にメインゲームクラスにある場合もあります)。

答えてくれてありがとう。あなたの提案は、私が通常のゲーム状況で行うことです-私がミニゲームとそのコンテンツのすべてを作成している状況です。

しかし、これはゲームではなく、グラフィックアドベンチャーを作成するためのゲームメーカーツールであり、特定のゲームイベントに応答して外部ミニゲームを接続する必要性を感じるのはエンドユーザーです。

私が交換しようとしている古い内部エンジンはFlashで行われ、メインのSWF内にSWFをロードするだけでこの問題を解決しました。ほとんどの場合、問題なく動作しました。同様のことをしようとしていますが、現在XNAを使用しています。

しかし、あなたの電車や考えに従って、おそらくすべてのミニゲームの基本クラスまたは共通インターフェイスを含む個別のアセンブリを作成し、それをdllとしてコンパイルできます。次に、ユーザーはそのライブラリを参照し、インターフェイスを実装して、実行時にエンジンによってロードされ、メインゲーム内の別の状態として実行される独自のライブラリにコンパイルします。私はいくつかの隠された影響を逃していますか?


おそらく、シーンシステムの実装のようなものが機能する可能性がありますか?
Gustavo Maciel

他のミニゲームのコードにアクセスできるかどうかにかかっていると思います。理論的には可能であるべきです。ミニゲームが純粋なC / C ++コードで記述されている場合、少なくともその方法を知っています。
Ali1S232 2012年

@Gajet質問にいくつかの情報を追加しました。ミニゲームのコードにアクセスできません。これはXNAで実行されているゲームメーカーツールであり、独自のミニゲームをプラグインしたい場合があるツールのユーザーです。
David Gouveia

回答:


6

いいえ。APIでこれを行う公式な方法はありません。

あなたがいた場合は非常識な、あなたは可能性があり、おそらく基礎となるDirectXのオブジェクトで取得するためにリフレクションを使用して、ウィンドウを再利用し、適切なタイミングでコンテンツリロードをトリガーにそれらをだまします。(基本的に、一度にウィンドウにアタッチできるデバイスコンテキストは1つだけです)

あなたはそれらに別々のウィンドウを持たせることができます。特に両方をフルスクリーンにする必要がある場合は、問題が発生する可能性があります。


ミニゲームとメインゲームを同じプログラム内の別々のクラスに構築する必要があります。これらの各クラスには、Update、Draw、Initializeなどのメソッドが必要です。次に、これらのメソッドを呼び出して一度に1つのゲームのみをアクティブにする何らかの種類のマスターコントローラーを用意する必要があります(これは単にメインゲームクラスにある場合もあります)。

ゲーム/ミニゲームごとに個別のコンテンツマネージャーを使用して、完了したらそれぞれのコンテンツをアンロードできます。

Game State Managementサンプルを見てみましょう。


あなたの編集に答えるには:

はい。このようなプラグインシステムは問題なく動作するはずです。

プロセスに一度読み込まれると、通常の方法でリソースをアンロードできますが、プロセス全体をアンロードせずにプラグインDLL をアンロードすることはできません。(これに遭遇した他の人への注意:AppDomainsを使用するとアンロードできますが、これはXNAでうまく機能しないと合理的に確信しています。)


答えてくれてありがとう。私はあなたの答えにコメントを書き始めましたが、コメントが大きくなりすぎたので、代わりに質問に追加しました。どう思いますか?
David Gouveia

@DavidGouveiaあなたのフォローアップに答えるために更新されました。
Andrew Russell

おかげで、どうにかしてこれを実装する方法を想像できたと思う。それでも、受け入れるまでに数日待ちます。なぜなら、プラグインシステムなしで動作させるための非公式でめちゃくちゃな方法を誰かが思い付くことができるかどうか知りたいからです。
David Gouveia
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.