Scene management in Blitz Max
Übersicht![](/themes/Standard/arrow.png)
![](/themes/Standard/arrow.png)
![]() |
TrustBetreff: Scene management in Blitz Max |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Freunde,
hier mal ein kleines Beispiel wie man Szenen in BMax handeln kann. Mit Szenen sind verschiedene Zustände im Spiel/App gemeint. Zustände können zB. sein: Titelscreen, Hauptmenü, Game Over Screen, Level 1, Level 2, ... und so weiter. Dazu 2 Klassen, zum Einen "TComposer" welche das Szenenmanagement übernimmt und zum Anderen die Klasse TScene welche eine Szene repräsentiert. Folgen die 2 Klassen: ![]() BlitzMax: [AUSKLAPPEN] ' Class for manageing scenes ![]() BlitzMax: [AUSKLAPPEN] ' Class for a scene Möchte man nun neue Szenen erstellen, müssen diese immer von TScene abgeleitet werden. Ebenfalls ist es wichtig, der neuen Szene einen Namen zu geben. Dies muss in der Create Funktion der neuen Szene über die TScene.name variable passieren. Folgend 3 Beispiele neuer Szenen Klassen: titelscreen, mainmenu und level01 ![]() BlitzMax: [AUSKLAPPEN] ' Titlescreen ![]() BlitzMax: [AUSKLAPPEN] ' Main menue ![]() BlitzMax: [AUSKLAPPEN] ' Level 01 Wie man in jedem Beispiel sehen kann, wird jeder Szene einen Namen gegeben: BlitzMax: [AUSKLAPPEN] Function Create() Dies ist wie schon oben erwähnt wichtig, damit man diese Scene über den Composer aufrufen kann: BlitzMax: [AUSKLAPPEN] composer.goToScene("level01")
Desweiteren kann man sehen, dass in jeder Klassendatei gleich nach der Klassendefinition eine Instanz der Klasse erstellt wird. (dies gleich nach der Klassendefinition zu tun ist übersichtlich und bei kleinen Projekten deshalb anzuraten. Allerdings muss auf den Arbeitsspeicher geachtet werden, da alle Szenen auf einmal in den Arbeitsspeicher geladen werden - dazu mehr unter Tipps weiter unten): BlitzMax: [AUSKLAPPEN] ' Call the create function to create an instance of this scene Folgend noch ein kleines Beispiel "main.bmx", welches alle oben genannten bmx-Dateien verwendet: ![]() BlitzMax: [AUSKLAPPEN] Strict ![]() Code-übersichtlichkeit: Der Übersichthalber ist es zu empfehlen, der Szene den gleichen Namen wie der Klassendatei zu geben: BlitzMax: [AUSKLAPPEN] ... Dies hat den Vorteil, dass man auf einen Blick erkennt, zu welcher Szene man dort wechselt. Projekt-übersichtlichkeit: In dem obigen Beispiel befinden sich alle Dateien im Rootverzeichnis des Projekts, so auch alle Szenen, das ist natürlich nicht sehr übersichtlich. Empfehlenswert wäre hier, als Beispiel, einen Ordner namens "scenes" zu erstellen und dort für jede Szene einen eigenen Unterordner: Code: [AUSKLAPPEN] -MyGame
main.bmx TComposer.bmx TScene.bmx -scenes -titlescreen titlescreen.bmx -mainmenu mainmenu.bmx -level01 level01.bmx Und in jedem Szenenordner auch alle Assets wie Bilder und Sounds zu dieser Szene speichern. Dies könnte man ebenfalls wieder in einem Unterordner zB. "assets" tun. Jedenfalls müssen dann aber natürlich die Pfade angepasst werden: BlitzMax: [AUSKLAPPEN] ... Arbeitsspeicher management: Im obigen Beispiel wurde die Szene gleich nach der Klassendefinition erstellt. Dies ist übersichtlich und kann man bei kleineren Projekten mit kleinen Szenen gut machen, allerdings wenn man größere Projekte mit tausenden Szenen hat, welche mehrere megabytes groß sind kann es eng mit dem Arbeitsspeicher werden, da alle Szenen beim Start des Spiels in den Arbeitsspeicher geladen werden. Um dies bei größeren Projekten zu verhindern, kann die Szene nach Bedarf erstellt werden, jedoch muss man darauf achten, dass man diese Szene dann nicht vorher schon über den Composer aufruft, da diese Szene zu diesem Zeitpunkt noch nicht existiert. Zudem kann man die Szene, insofern man diese wirklich nicht mehr braucht (Level abgeschlossen etc.) dann über den Composer aus dem Arbeitsspeicher entfernen. Hier ist dann auch wieder darauf zu achten, dass diese Szene dann nicht mehr aufgerufen wird. Folgend ein Beispiel wie man Szenen dann nach Bedarf erstellt und ggf. wieder aus dem Arbeitsspeicher entfernt: Als erstes muss der Aufruf der Create-Funktion aus der Szenenklassendatei entfernt werden: BlitzMax: [AUSKLAPPEN] ' Call the create function to create an instance of this scene Nun wird die Szene nicht mehr über die Klassendatei erstellt. Nun erstelle die Szene dann nach Bedarf (in diesem Beispiel wird sie in der main.bmx erstellt, kann aber zu jeder Zeit erstellt werden. Wichtig ist nur, dass sie vorher nicht Aufgerufen wird mit "composer.goToScene()" BlitzMax: [AUSKLAPPEN] ... Jede Szene kann über einen der beiden Befehle "composer.removeScene("sceneName")" und "composer.removeLastScene()" aus dem Arbeitspeicher gelöscht werden. Der Unterschied zwischen den Beiden ist, dass "composer.removeScene("sceneName")" die Szene mit angegebenen Namen ("sceneName") löscht, und "composer.removeLastScene()" die zuletzt geladene, aber nicht aktuelle Szene löscht. Das heist, vom obigen Beispiel ausgehend: Wenn Szene "titlescreen" als erstes aufgerufen wird und danach die Szene "mainmenu", wäre die zuletzt geladene, nicht aktuelle Szene, die Szene "titlescreen". Somit würde diese dann mit "composer.removeLastScene()" aus dem Arbeitsspeicher gelöscht werden. Ich hoffe das es verständlich und hilfreich ist ![]() LG Trust |
||
Übersicht
![](/themes/Standard/arrow.png)
![](/themes/Standard/arrow.png)
Powered by phpBB © 2001 - 2006, phpBB Group