Advanced game pausing -- Pause-Funktion im Spiel einsetzen

0
  • 0 favourites

Tagged

Stats

3,691 visits, 3,937 views

Tools

License

This tutorial is licensed under CC BY 4.0. Please refer to the license text if you wish to reuse, share or remix the content contained within this tutorial.

Basierend auf Gnome's vor kurzem veröffentlichtem Kurztutorial A Simple Pause menu, gehe ich hier auf weitere zu berücksichtigende Themen ein.

Es gibt einige Punkte, die man in einer Pausenfunktion berücksichtigen sollte.

Pause sprite erzeugen

Mit einem Bildbearbeitungs- oder Vektorprogramm erzeugt man den "Pause" Sprite.

Der Spieler muss natürlich wissen, wie er zurück ins Spiel kommt. Ein Text wie "Taste 'P' zum Weiterspielen drücken" kann man sowohl im Sprite aber auch in einer Textbox angeben.

Am besten sollte man die Datei im .png Format speichern.

Pause Sprite in Construct 2 importieren

Ich habe die Pausenfunktion im Tutorialspiel "Ghost shooter" (von Ashley:Beginner's guide).

Damit der Pausebutton immer an der gleichen Stelle erscheint, habe ich den Sprite in der Ebene HUD reingesetzt (Tipp: andere Ebenen sperren). Durch die Parallaxeinstellung von 0,0 erscheint der Pausebutton immer an der gleichen Stelle.

Doppelklicke auf dem Layout und setze den Sprite in der Fenstermitte im Bereich des Spiels, also 640x480 (nicht zu verwechseln mit der größe der Hintergrundebene, die ja 1280x1024 Pixel groß ist). Am besten klickt man die Sichtbarkeit (Visibilty) der Hintergrundebene und blendet diese aus. Die gestrichelten Linien zeigen den bereich, den der Spieler sehen wird.

Eigenschaften des Pause Sprites setzen

Im Eigenschaftenfenster "properties panel":

- "Name" auf pauseButton ändern

- "Initial visibility" auf invisible (damit wird anfangs der Sprite unsichtbar; ebenso kann man den Sprite mit dem Event On start of layout unsichtbar machen)

- Neue "instance variable" mit dem Namen isPaused hinzufügen, Typ Boolean und mit "initial value" auf false

Events

Wechsele in das Event Sheet.

Erzeuge eine neue Keyboard-Bedingung :

Add condition Keyboard -> On key pressed -> P

Noch keine Aktionen definieren!

Klick mit der rechten Maustaste auf dem grünen Pfeilchen der condition, gehe im Kontextmenü auf Add und wähle Add sub-event.

Füge condition pauseButton -> Is boolean instance variable set -> isPaused hinzu

In dieser Bedingung wird geprüft, ob die Taste 'P' gedrückt wurde und ob die Variable isPaused "true" ist. Da bei Spielbeginn der Wert "false" gesetzt wurde, muss die condition invertiert oder umgekehrt werden. man klickt mit der rechten Maustaste auf die condition Is isPaused condition und man wählt invert aus.

Folgende Aktionen werden abgearbeitet, wenn die 'P' Taste gedrückt wurde und auch die Variable isPaused auf "false" gesetzt ist.

Füge folgende Aktionen hinzu:

- pauseButton -> Set boolean -> isPaused to True

- System -> Set time scale -> 0

- pauseButton -> Set visible -> Visible

- Text -> Set text -> "Press 'P' to continue"

Was wird nun passieren?

Jedwede Bewegung friert ein: der Spieler, die Monster, die Geschosse und auch die Explosionen, da wir hier time scale=0 gesetzt haben.

Weiterhin ist der Pausebutton sichtbar und der Score-Text wird auf Press 'P' to continue geändert.

Schließlich wird der Boolsche Wert der Variable isPaused auf "true" gesetzt.

Um Weiterspielen zu können, wird die nächste Bedingung erforderlich:

Klicke auf dem Sub-Event pauseButton - Is isPaused mit der rechten Maustaste und füge die 'Else' Bedingung hinzu.

Folgende Aktionen sind nun hinzufügen:

- pauseButton -> Set boolean -> isPaused to False

- System -> Set time scale -> 1.0

- pauseButton -> Set visible -> Invisible

- Text -> Set text -> "Score: "& Score

Also, wenn das Spiel pausiert wird, kann man weiterspielen, wenn die 'P' Taste wieder gedrückt wurde und die isPaused-Variable den Boolschen Wert "true" besitzt.

Alles beginnt sich wieder zu bewegen und zu explodieren. Das Pausebutton wird wieder unsichtbar gemacht und die Punktezahl wieder dargestellt.

Problem 1: Spiel kann trotz Tod des Spielers pausiert werden

Selbst wenn man das Spiel verloren hat, kann man das Spiel pausieren.

Also habe ich dem Spieler einen Lebenspunkte mit der Variable health gegeben.

Im Layoutbereich klickt man auf den Spieler "Player", und fügt in den Eigenschaftenfenster (Properties panel) eine neue instance Variable namens health und einem Wert von 1 hinzu. Hinweis: Keine Angst, Construct 2 wird nicht mit den health-Variablen der Spieler und Monster durcheinanderkommen

Im Event sheet, geht man auf die Bedingung Monster -> On collision with Player und fügt folgende Aktion hinzu:

Player -> Subtract from -> health -> 1

In unserem vorhin erzeugen Tastatur-Event (mit der Abfrage der P-Taste) fügen wir folgende Bedingung ein:

Keyboard - On P pressed (Klick mit der rechten Maustaste und füge ein neues event hinzu)

Player -> Compare instance variable -> health -> Greater than -> 0

Wenn der Spieler in einem Spiel gestorben ist, kann man danach das Spiel nicht pausieren und die Monster tummeln sich weiterhin im Spiel rum...

Problem 2: Während der Pause ist die Maus noch aktiv

Während der Pause fand ich heraus:

a) Man kann den Spieler weiterhin mit der Mausbewegung drehen

b) Der Spieler kann weiterhin schiessen!

Die Lösung wäre hier, eine Bedingung hinzuzufügen, die den Boolschen Wert der Varaible isPaused prüft, also:

a) System -> Every tick --> Player -> Set angle toward -> Mouse.X, Mouse.Y

b) Mouse -> On Left button Clicked --> Player -> Spawn Bullet

Nicht vergessen, die Bedingung umzukehren (invert)! (siehe in Screenshot das rote 'x')!

Jetzt dreht sich der Spieler nicht mehr und kann auch nicht mehr schiessen.

Fazit

Wenn man also ein Menü oder Fenster während eines Spiels aufruft, darf man bestimmte Sachen nicht vergessen

1. Prüfen von Tastatur und Mausbedingungen und diese ggf. einfrieren/deaktivieren

2. Prüfen, was Objekte im Spiel während einer Pause alles machen können

3. Zeit ggf. prüfen (wenn nicht mit time-scale gearbeitet wird)

Ta-daa!!! :-)

  • 0 Comments

  • Order by
Want to leave a comment? Login or Register an account!