Navigation

    • Login
    • Search
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • TeamSpeak

    GameMaker: Studio Tutorial | Top-Down Movement

    Media-Tutorials
    3
    3
    2225
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Schicho7
      Schicho7 last edited by Schicho7

      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:

      Description

      (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?

      Description

      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.

      Description

      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"

      Description

      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

      1 Reply Last reply Reply Quote 1
      • Vinlow
        Vinlow last edited by

        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

        “Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live”

        1 Reply Last reply Reply Quote 0
        • Freaky
          Freaky last edited by

          Nice work Schicho.
          Trotzdem finde ich GameMaker doof :P

          1 Reply Last reply Reply Quote 0
          • First post
            Last post