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?
Antworten:
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.)
quelle