Ist es möglich, dasselbe Fenster in mehreren Spielen wiederzuverwenden?

7

Insbesondere denke ich an C # und XNA und natürlich an Windows. Angenommen, ich habe das Hauptspiel, das ein normales XNA-Spiel ist, aber irgendwann möchte ich kurz auf ein Minispiel umsteigen, das ebenfalls in XNA implementiert wurde, aber völlig unabhängig von meinem Spiel ist.

Gibt es eine Möglichkeit, zwischen den beiden Spielen hin und her zu wechseln, während ich das gleiche Windows-Handle wieder verwende? Und vorzugsweise den alten Zustand im Speicher behalten, obwohl ich dieses persistente Schreiben auch in eine Datei implementieren könnte.

Und wenn ich zum ersten Spiel zurückkehre, gibt es eine Möglichkeit, auf den Wert zuzugreifen, der von der Hauptmethode des Minispiels zurückgegeben wird? Zum Beispiel 1 oder 0, je nachdem, ob der Spieler das Minispiel beendet hat oder nicht.


Andrew Russell schrieb:

Sie sollten Ihr Minispiel und Ihr Hauptspiel in separate Klassen innerhalb desselben Programms einteilen. Jede dieser Klassen sollte über Methoden zum Aktualisieren, Zeichnen, Initialisieren usw. verfügen. Sie sollten dann eine Art Master-Controller haben, der diese Methoden aufruft, um jeweils nur ein Spiel aktiv zu haben (dies könnte auch einfach in Ihrer Hauptspielklasse sein).

Danke für die Antwort. Ihr Vorschlag ist das, was ich in einer normalen Spielsituation tun würde - eine, in der ich alle Minispiele und deren Inhalte erstellen würde.

Dies ist jedoch kein Spiel, sondern ein Game-Maker-Tool zum Erstellen grafischer Abenteuer, und es ist der Endbenutzer, der möglicherweise das Bedürfnis verspürt, externe Minispiele als Reaktion auf bestimmte Spielereignisse anzuschließen.

Die ältere interne Engine, die ich ersetzen möchte, wurde in Flash erstellt und löste dieses Problem einfach durch Laden einer SWF in die Haupt-SWF. In den meisten Fällen hat es gut funktioniert. Ich versuche etwas Ähnliches zu machen, aber jetzt mit XNA.

Aber wenn ich Ihrem Zug oder Gedanken folge, könnte ich vielleicht eine separate Assembly erstellen, die eine Basisklasse oder eine gemeinsame Schnittstelle für alle Minispiele enthält, und sie als DLL kompilieren. Dann würde der Benutzer auf diese Bibliothek verweisen, die Schnittstelle implementieren und in seine eigene Bibliothek kompilieren, die zur Laufzeit von der Engine geladen und als separater Status innerhalb des Hauptspiels ausgeführt werden könnte. Vermisse ich einige versteckte Implikationen?

David Gouveia
quelle
Wahrscheinlich könnte so etwas wie eine Implementierung eines Szenensystems funktionieren?
Gustavo Maciel
Ich denke, es hängt wirklich davon ab, ob Sie Zugriff auf Code für andere Minispiele haben oder nicht. theoretisch sollte es möglich sein. Zumindest habe ich eine Idee, wie das geht, wenn die Minispiele in reinem C / C ++ - Code geschrieben sind.
Ali1S232
@ Gajet Ich habe einige weitere Informationen zu meiner Frage hinzugefügt. Ich habe keinen Zugriff auf den Code der Minispiele. Es ist ein Game Maker-Tool, das auf XNA ausgeführt wird, und es sind die Benutzer des Tools, die möglicherweise ihre eigenen Minispiele anschließen möchten.
David Gouveia

Antworten:

6

Nein, es gibt keine offizielle Möglichkeit, dies in der API zu tun.

Wenn Sie verrückt waren , können Sie möglicherweise mithilfe von Reflection auf die zugrunde liegenden DirectX-Objekte zugreifen und sie dann dazu verleiten, ein Fenster wiederzuverwenden und zum richtigen Zeitpunkt ein erneutes Laden von Inhalten auszulösen. (Grundsätzlich kann jeweils nur ein Gerätekontext an ein Fenster angehängt werden.)

Sie könnten sie separate Fenster haben lassen. Dies könnte jedoch zu Problemen führen, insbesondere wenn beide im Vollbildmodus angezeigt werden müssen.


Sie sollten Ihr Minispiel und Ihr Hauptspiel in separate Klassen innerhalb desselben Programms einteilen. Jede dieser Klassen sollte über Methoden zum Aktualisieren, Zeichnen, Initialisieren usw. verfügen. Sie sollten dann eine Art Master-Controller haben, der diese Methoden aufruft, um jeweils nur ein Spiel aktiv zu haben (dies könnte auch einfach in Ihrer Hauptspielklasse sein).

Sie können für jedes Spiel / Minispiel separate Inhaltsmanager verwenden, sodass Sie den Inhalt für jedes Spiel entladen können, sobald sie fertig sind.

Schauen Sie sich das Game State Management- Beispiel an.


So beantworten Sie Ihre Bearbeitung:

Ja. Eine Art Plugin-System wie dieses sollte gut funktionieren.

Beachten Sie, dass Sie die Plugin-DLL nach dem Laden in einen Prozess nicht mehr entladen können, ohne den gesamten Prozess zu entladen - obwohl Sie die Ressourcen auf die übliche Weise entladen können. (Hinweis für alle anderen, die darauf stoßen: Sie können bei Verwendung von AppDomains entladen, aber ich bin mir ziemlich sicher, dass dies mit XNA nicht gut funktioniert.)

Andrew Russell
quelle
Danke für die Antwort. Ich habe angefangen, einen Kommentar zu Ihrer Antwort zu schreiben, aber er wurde zu groß, sodass ich ihn stattdessen meiner Frage hinzufügte. Was ist deine Meinung dazu?
David Gouveia
@DavidGouveia Aktualisiert, um Ihr Follow-up zu beantworten.
Andrew Russell
Danke, ich glaube, ich habe es irgendwie geschafft, mir vorzustellen, wie man das umsetzt, und die Antwort war hilfreich. Trotzdem werde ich ein paar Tage warten, bevor ich akzeptiere, denn ich bin gespannt, ob jemand inoffizielle und verrückte Wege finden kann, damit es ohne Plugin-System funktioniert.
David Gouveia