Ein Spiel hat oftmals mehrere verschiedene „Teile“, zwischen denen der Spieler
während des Spielens wechselt. Zum Beispiel gibt es neben der Hauptdarstellung,
Pausenmenüs, Inventare, Hauptmenüs, etc. Es wäre unnötig komplex, für den
Wechsel zwischen diesen Szenen stets alle grafischen Objekte zu zerstören und
wieder neu aufzubauen. Stattdessen werden alle grafischen Objekte in einer
Scene hinzugefügt. Dies passiert - wie in den vorigen Tutorials - über die
Methode add(...).
Über die Klasse Controller kann schnell zwischen Szenen gewechselt werden. Dazu gibt
es die Methode Controller.transitionToScene(Scene).
Szenen in der Engine: Beispiel mit Pausenmenü
Ein Pausenmenü
Das folgende Beispiel enthält zwei Szenen: Eine einfache Animation und ein
Pausenmenü. Ein Wechsel zwischen Hauptszene zu Pausenmenü und wieder zurück
Ein Wechsel zwischen Hauptszene zu Pausenmenü und wieder zurück
Die zwei Szenen
Die Hauptszene ist MainScene. Hier könnte ein Game Loop für ein
Spiel stattfinden. Dieses Tutorial zeigt stattdessen eine kleine Animation.
importjava.awt.event.KeyEvent;importpi.Controller;importpi.Rectangle;importpi.Scene;importpi.Text;importpi.animation.CircleAnimation;importpi.event.KeyStrokeListener;importpi.graphics.geom.Vector;publicclassMainSceneextendsSceneimplementsKeyStrokeListener{privatefinalPauseMenupauseMenu;publicMainScene(){pauseMenu=newPauseMenu(this);RectangletoAnimate=newRectangle(5,2);toAnimate.center(0,-5);toAnimate.color("orange");CircleAnimationanimation=newCircleAnimation(toAnimate,newVector(0,0),8,true,true);addFrameUpdateListener(animation);add(toAnimate);addKeyStrokeListener(this);Textinfo=newText("Pause mit P");info.center(-7,-5);add(info);}@OverridepublicvoidonKeyDown(KeyEventkeyEvent){if(keyEvent.getKeyCode()==KeyEvent.VK_P){gotoPause();}}privatevoidgotoPause(){Controller.transitionToScene(pauseMenu);}publicstaticvoidmain(String[]args){Controller.instantMode(false);Controller.start(newMainScene(),600,400);}}
importpi.Scene;importpi.Text;importpi.graphics.geom.Vector;publicclassPauseMenuextendsScene{publicPauseMenu(ScenemainScene){MenuItemback=newMenuItem(mainScene,newVector(0,-5),"Zurück");add(back,back.label);Textheadline=newText("Mach mal Pause.");headline.height(2);headline.center(0,3);add(headline);}}
Das Pausenmenü wird statt mit Tastatur per Mausklick geschlossen. Im internen
Steuerelement MenuItem wird dafür die entsprechende Methode aufgerufen, wann
immer ein Mausklick auf dem Element landet - dies wird durch die Methode
contains(Vector) geprüft:
In der Hauptszene findet eine interpolierte Rotationsanimation statt. Diese
rotiert ein oranges Rechteck wiederholend um den Punkt (0|0). Eine volle
Rotation im Uhrzeigersinn dauert 8 Sekunden.
Das Pausenmenü hat einen Hover-Effekt. Hierzu wird in jeden Einzelbild
überprüft, ob die Maus derzeit innerhalb des Steuerelementes liegt und abhängig
davon die Rechtecksfarbe ändert. Hierzu wird die Methode
Controller.getMousePositionInCurrentScene() genutzt:
Die Kreisrotation in der Hauptszene geht nicht weiter, solange das Pausenmenü
die aktive Szene ist. Dies liegt daran, dass die Animation als
FrameUpdateListener in der Hauptszene angemeldet wurde
(addFrameUpdateListener(animation)). Alle Beobachter einer Szene können nur
dann aufgerufen werden, wenn die Szene aktiv ist.
Deshalb lässt sich das Pausenmenü nicht durch drücken von P beenden. Der
KeyStrokeListener, der bei Druck von P zum Pausenmenü wechselt, ist in der
Hauptszene angemeldet.