GameMaker: Studio Tutorial | Top-Down Movement
-
Hallo ich dachte ich mach wieder einmal ein kleines Tutorial für GameMaker.
Eigentlich wollte ich ja Apple Clicker weitermachen aber irgendwie hab ich dazu keine Lust.
Ich will aber dennoch weiter Tutorials machen und hab jetzt lange überlegt was den interessant wäre.
Ich bin zum Entschluss gekommen das ein Tutorial für ein "Top-Down Movement" eine perfekte Grundlage für weitere Tutorials wäre.
Heute geht es also um ein bisschen "fortgeschrittenes" Movement System.Bilder sagen mehr als tausend Worte here we go:
(Talking is not included in this Tutorial!)
So wird unser System am Schluss zirka aussehen. Eine simple "möchtegern" State-Machine inklusive!Die Vorbereitung
Wir brauchen natürlich auch einen Player für das ganze und wer wäre ich wenn ich keinen erstellt hätte?
Das ist er unser wunderschöner NOCH NAMENLOSER Held (Namensvorschläge sind herzlich willkommen)
Hier könnt ihr ihn euch inklusive seiner Geh-Animation downloaden: Download
Jetzt müsst ihr nurnoch alle Sprites importieren und ein Objekt für unseren Spieler erstellen.
Wie ihr die Sprites und das Objekt nennt ist eigentlich euch überlassen.Wichtig ist nur das Player_walk_1.png und Player_walk_2.png in ein Sprite zusammengefasst werden.
Ich werde in laufe des Turtorials folgende Bezeichnungen nutzen:
-
spr_player_idle für den Idle Zustand (Player_Idle.png)
-
spr_player_walk für den Walk Zustand (Player_walk_1.png und Player_walk_2.png)
Sobald ihr diese impotiert habt müsst ihr nurnoch den Origin von den Sprites also sozusagen den Achsen ursprung auf die Mitte des Sprites setzen damit wir später keine Probleme mit der Rotation bekommen.
Ein Klick auf "Center" bei beiden Sprites und unsere Vorbereitungen sind abgeschlossen.
Die "State-Machine"
Das gesamte "Verhalten und Movement Zeug" vom Spieler werde ich außerhalb vom Player Objekt erstellen damit diese nicht an das Objekt gebunden sind und das ganze übersichtlicher bleibt. Wir rechtsklicken also links im Projekt-Explorer auf "Scripts" und klicken auf "Create Script"
Es öffnet sich der GML-Editor und wir können direkt mit der State-Machine beginnen, aber was sind den überhaupt diese "Scripts"?
Scripts im GameMaker kann man wie Funktionen in anderen Programmiersprachen sehen. Sie können überall in unserem Projekt genuzt werden sind also direkt Global. Sie können auch Argumente annehmen wie es eben bei Funktionen üblich ist. Dazu aber später mehr.Kommen wir zurück zur "State-Machine" diese ist bei mir in 3 Scripts unterteilt.
- InitPlayerStateMachine
- SetPlayerState
- UpdatePlayerState
Wir beginnen mit InitPlayerStateMachine also schreiben wir erstmal genau das bei "Name" hinein.
Das Script ist relativ winzig und ich denke das könnte man auch besser lösen aber wie schon im ersten Tutorial erwähnt ich bin nicht Perfekt.global.PlayerState = 0;
Das ist alles was in diesem Script gemacht wird es wird eine globale Variable mit dem Namen "PlayerState" erstellt.
Ich verzichte hierbei auf eine Namensvergabe der States und nummeriere diese lieber. Das ist schon ein Punkt von dem wovon sich meine "State-Machine" von einer normalen unterscheidet. Allerdings sollte dies auch mit global.PlayerState = "state_init; funktionieren (NICHT GETESTET)Unser nächstes Script ist SetPlayerState dieses ist auch relativ simpel aber doch minimal komplexer als InitPlayerStateMachine.
global.PlayerState = argument0;
Wie bereits gesagt können die GameMaker Scripts auch Argumente annehmen diese werden durchnummeriert angefangen mit der 0.
Wir wollen später SetPlayerState überall ca. so nutzen können:SetPlayerState(2)
Wir könnten auch einfach global.PlayerState = 2; schreiben allerdings könnte das später wenn wir die Variable umbennen oder ähnliches etwas zu viel Aufwand werden und so ist es organisierter.
So jetzt initialisieren wir die "State-Machine" und können auch schon einen State setzen aber das ganze bringt uns noch nicht viel ohne UpdatePlayerState und zu genau diesem kommen wir jetzt.
Wir erstellen wieder ein neues Script nennen dieses "UpdatePlayerState" oder wie auch immer ihr es nennt.
Dieses Script ist im Prinzip genau wie der Rest nicht sonderlich schwer zu verstehen und auch nicht sehr aufwendig.
Dieses Script ist einfach nur ein Switch der zwischen all unseren States umherschaltet.switch(global.PlayerState) { case 0: { break; } case 1: { PlayerStateMove(); break; } default: break;
So sieht das Script aus und ist relativ leicht erklärt. Wenn PlayerState 0 ist soll nicht passieren.
Wenn PlayerState 1 ist soll "PlayerStateMove" aufgerufen werden. und wenn keines der beiden der Fall ist soll nichts passieren.
Dies kann man jetzt sehr einfach erweitern aber dies folgt erst in späteren Tutorials.Jetzt wo wir das ganze fertig haben gehts weiter mit dem eigentlichen Movement.
Das Movement
Wir wollen unseren namenlosen Helden gerne aus der Top-Down Perspektive steuern können dazu erstellen wir einfach das Skript "PlayerStateMove"
Dieses Script werde ich etwas genauer erklären.
Als erstes wollen wir das unser Spieler in die Richtung von der Maus schaut.
Dies lässt sich relativ leicht realisieren und sieht wie folgt aus:image_angle = (point_direction(x, y, mouse_x, mouse_y))-90; image_speed = 0.1;
point_direction(x, y, mouse_x, mouse_y) gibt uns den Winkel der Maus und wir müssen diesen nochmal -90 rechnen da unser Sprite gedreht ist. image_angle ist die Winkel-Variable die GameMaker für jedes Objekt intern erstellt. image_speed stellt uns die Geschwindigkeit der Animation ein.
Dannach kommt relativ selbst erklärender Code für WASD
if(keyboard_check(ord("W"))) { y -= walkspeed; sprite_index = spr_player_walk; } if(keyboard_check(ord("A"))) { x -= walkspeed; sprite_index = spr_player_walk; } if(keyboard_check(ord("S"))) { y += walkspeed; sprite_index = spr_player_walk; } if(keyboard_check(ord("D"))) { x += walkspeed; sprite_index = spr_player_walk; }
und dann nochmal das selbe sobald die Taste losgelassen wird.
if(keyboard_check_released(ord('W'))) { sprite_index = spr_player_idle; } if(keyboard_check_released(ord('A'))) { sprite_index = spr_player_idle; } if(keyboard_check_released(ord('S'))) { sprite_index = spr_player_idle; } if(keyboard_check_released(ord('D'))) { sprite_index = spr_player_idle; }
Sieht komplizierter aus als es ist. Es werden einfach nur XY-Werte des Objektes in eine bestimmte Richtung geändert und das Sprite wird geändert. Das einzige was noch unklar sein könnte ist was "walkspeed" ist. Dies ist eine Variable in der wir unser "Geh-Tempo" festlegen werden diese Variable werden wir später direkt im Create-Event des Spieler Objektes erstellen. Der State ist damit fertig und es geht zum letzten Teil des Tutorials.
Das Player Objekt
Das Player Objekt fällt dadurch das wir den gesamten Code ausgelagert haben relativ simpel aus und besteht aus folgenden Teilen:
- Create-Event
- Step-Event
fangen wir mit dem Create-Event an. Hier machen wir wieder das selbe wie in AppleClicker also wir machen ein "Execute Code" also den Zettel da. Hier definieren wir eigentlich nur walkspeed.
walkspeed = 2;
Das Step-Event ist ähnlich simpel dort wählen wir einfach "Execute Script" aus und wählen unser UpdatePlayerState Script aus.
Jetzt könnt ihr einen Raum erstellen und das Objekt dort reinsetzen und ihr solltet euch mit WASD und der Maus bewegen können!
Abschluss
Die nächsten Tutorials werden wahrscheinlich nicht mehr so lange dauern und werden dieses oder ein anderes schon zum "herumgehen bereites" Projekt vorraussetzen.
Ich hoffe euch hat das Tutorial gefallen und wünsche euch allen gutes gelingen!
Mit freundlichen Grüßen
Schicho
-
-
Sehr sehr nützliches und ausführliches Tutorial. Alles bebildert und genau beschrieben! Ich nehme mir am Wochenende die Zeit das gesamte Tutorial mal durch-zuarbeiten und poste mein Ergebniss hier. Ich hoffe dass noch viele Leute von Außen dieses Tutorial finden und benutzen.
Vielen Dank -
Nice work Schicho.
Trotzdem finde ich GameMaker doof :P