Plattform Tutorial - Basics

    • GM 8

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Plattform Tutorial - Basics

      Hallo Leute.

      Wie in diesem Thread schon besprochen, hab ich mir überlegt ein einfaches Platform Tutorial zu programmieren. Und dada: hier ist es. In diesem ersten Tutorial geht es aber wirklich nur um die Basics eines Platform-Spieles.

      Es wird behandelt:
      • Bewegung (Links/Rechts)
      • Springen
      • Fallen

      Also fangen wir mal an. Hier noch ein Screenshot, was wir erreichen wollen:


      Prinzipiell brauchen wir 3 Sprites, 1 Tileset, 2 Objekte und 1 Raum. (Alle Sprites/Tilesets werden unten angehängt)
      Sprites
      • spr_player (Ein Player-Sprite)
      • spr_player_mask (Diese ist SEHR wichtig, falls ein Player rund ist, aber auch immer empfehlenswert)
      • spr_solid (Ein Sprite, mit dem der Player später kollidieren wird)
      Tilest
      • ts_gras
      Objekte
      • obj_player
      • obj_solid

      Nach erfolgreichen Erstellen und der Zuordnung der Sprites, sollte es wie folgt aussehn. Beachte bitte, dass beim obj_player "Mask" auf "spr_player_mask" gesetzt ist. Außerdem muss die Checkbox "solid" im Objekt obj_solid auf wahr und die Checkbox "visible" auf falsch gesetzt sein (Notwendig für eine Kollision).


      Nun geht es los mit dem Programmieren. Beginnen wir mit dem Create Event des obj_player`s. Um die Engine flexibel zu gestalten, werden folgende variablen Deklarationen benötigt. Die Beschreibung erfolgt im Code.
      :event_create: Create-Event
      Spoiler anzeigen

      GML-Quellcode

      1. /*
      2. Diese Variablen werden für die Bewegung benötigt.
      3. */
      4. key_left = ord("A");
      5. key_right = ord("D");
      6. key_up = ord("W");
      7. /*
      8. Diese Variablen definieren, ob ein Spieler sich bewegen, springen oder fallen kann. Diese könnten später für
      9. diverse Erweiterungen dienen. Falls zum Beispiel can_jump auf falsch gesetzt wird, kann der Spieler nicht mehr springen.
      10. */
      11. can_move = true;
      12. can_jump = true;
      13. can_fall = true;
      14. //---Ab hier sind Variablen, die etwas über den Status des Players berichten
      15. move = false; //Ob der Spieler sich gerade nach rechts oder links bewegt, bzw sich bewegen will.
      16. move_direction = 0; //Wenn der Spieler sich nach rechts bewegt, ist der Wert +1. Bei einer Links Bewegung -1.
      17. jump = false; //Ob der Spieler gerade nach oben springt. Dieser Wert ist nur solange wahr, bis der Spieler wieder fallen anfängt.
      18. jump_speed = 0; //Die derzeite Sprunggeschwindigkeit. Dieser Wert wird im Step-Event erhöht.
      19. jump_time = 0; //Wie lange der Spieler schon springt. Dies wird benötigt um einen Abbruch des Sprunges zu erreichen
      20. jump_number = 0; //Wie oft ein Spieler gesprungen ist (Für Doppelsprung wichtig). Genauere Details erfolgen im Step
      21. fall = false; //Ob ein Spieler fällt.
      22. fall_speed = 0; //Die derzeitige Fallgeschwindigkeit.
      Alles anzeigen


      Und hier noch das Step Event.
      :event_step: Step-Event
      Spoiler anzeigen

      GML-Quellcode

      1. // Falls der Spieler sich bewegen darf.
      2. if(can_move) {
      3. //In diesem IF wird überprüft, ob die Linke oder Rechte Taste gedrückst ist, ABER nicht beide gleichzeitig.
      4. if(((keyboard_check(key_left) || keyboard_check(key_right)) && !(keyboard_check(key_left) && keyboard_check(key_right)))) {
      5. move = true; //Falls ja, dann wird move auf wahr gesetzt. Nun versucht sich der Spieler zu bewegen. Die Kollisionsüberprüfung erfolgt später.
      6. if(keyboard_check(key_left)) {
      7. move_direction = -1;
      8. }
      9. if(keyboard_check(key_right)) {
      10. move_direction = +1;
      11. }
      12. } else {
      13. move = false; //Spieler will sich nicht bewegen.
      14. }
      15. //Falls der Spieler sich bewegen will, kommt er in diese IF
      16. if(move) {
      17. /*
      18. Nun wird überprüft ob 2 px in die move_direction frei sind. Falls nicht, wird soweit in die Wand gegangen, bis eine Kollision eintrift.
      19. Dannach wird die Wand wieder verlassen.
      20. */
      21. if(place_free(x+2*move_direction,y)) {
      22. x += 2*move_direction; //Platz ist frei -> Bewege nach move_direction um MOVE_SPEED
      23. } else {
      24. if(move_direction == +1) {
      25. move_contact_solid(0, 2);
      26. x = round(x);
      27. move_outside_solid(180, 2);
      28. } else if(move_direction == -1) {
      29. move_contact_solid(180, 2);
      30. x = round(x);
      31. move_outside_solid(0, 2);
      32. }
      33. }
      34. }
      35. }
      36. if(can_jump) {
      37. /*
      38. Falls die Springen Taste gedrückt wird und jump_number != 2 ist, wird gesprungen.
      39. Hier muss beachtet werden, dass die derzeitige Sprunggeschwindigkeit jump_speed auf 0 gesetzt wird. Die Sprungzeit
      40. muss ebenfalls auf 0 gesetzt werden. Dadurch das ein Sprung den Fall wieder "deaktivert" muss die Fallgeschwindigkeit auch auf 0 gesetzt werden.
      41. */
      42. if(keyboard_check_pressed(key_up) && (jump_number != 2)) {
      43. jump = true;
      44. jump_number += 1;
      45. jump_speed = 0;
      46. jump_time = 0;
      47. fall_speed = 0;
      48. }
      49. if(jump) {
      50. jump_time = min(jump_time+1, 18); //Die Sprungzeit wird um eines erhöht, ABER maximal bis 18.
      51. jump_speed = min(jump_speed+0.75, 3); //Die Geschwindigkeit des Sprunges wird um 0.75 erhöht, ABER maximal bis 3.
      52. /*
      53. Im ersten IF:
      54. Hier wird überprüft, ob nicht mehr gesprungen werden will, oder ob die maximale Sprungzeit (18) erreicht wurde.
      55. Falls ja => Nicht mehr springen
      56. Im zweiten IF:
      57. Ebenfalls wie beim Bewegen, wird überprüft, ob nach oben Platz frei ist. Falls ja => Weiter nach oben.
      58. Im dritten IF:
      59. Falls kein Platz frei ist, soll trotzdem noch, bis zum Ansprung bewegt werden.
      60. Dies ist das gleiche wie bei einer Links/Rechts-Bewegung
      61. */
      62. if((keyboard_check_released(key_up) || jump_time == 18)) {
      63. jump = false;
      64. } else if(place_free(x,y-jump_speed)) {
      65. y -= jump_speed;
      66. } else {
      67. move_contact_solid(90, fall_speed);
      68. y = round(y);
      69. move_outside_solid(270, fall_speed);
      70. jump = false;
      71. }
      72. }
      73. }
      74. //Es kann nur gefallen werden, wenn gefallen werden darf UND nicht gesprungen wird.
      75. if(can_fall && !jump) {
      76. /*
      77. Falls nach unten Frei wäre, dann würde man fallen. Falls nicht (also man steht auf einem fixen Kollisionsobjekt)
      78. dann fällt man nicht.
      79. */
      80. if(place_free(x,y+1)) {
      81. fall = true;
      82. } else {
      83. fall = false;
      84. fall_speed = 0;
      85. jump_number = 0;
      86. }
      87. if(fall) {
      88. fall_speed = min(fall_speed+0.15, 12); //Die Fallgeschwindigkeit wird um 0.15 erhöht, ABER wieder maximal bis 12.
      89. /*
      90. 1. IF:
      91. Wenn nach unten Frei ist, dann falle.
      92. 2. IF:
      93. Falls nicht, dann bewege dich wieder maximal bis zum Anstand.
      94. */
      95. if(place_free(x,y+fall_speed)) {
      96. y += fall_speed;
      97. } else {
      98. move_contact_solid(270, fall_speed);
      99. y = round(y);
      100. move_outside_solid(90, fall_speed);
      101. }
      102. }
      103. }
      Alles anzeigen

      Natürlich kann man die gesamten "Konstanten" durch Variablen ersetzen. Jedoch hab ich diese weggelassen um das Create-Event nicht zu überfüllen. Die *.gml-Datei ladt ich jetzt mal nicht hoch, damit die leute ein wenig selbst probieren. Falls dies aber explizit erwünscht wird, wird diese auch nachgereicht.

      So nun geht es zum Raum. Ich würde euch raten, dass ihr zuerst das Tilesets auf die Karte aufträgt und dann die Ränder mit dem obj_solid ausfüllt. Außerdem sollte die FPS auf 60 gestellt werden, damit meine Konstanten dazu passen (sonst wird alles langsamer). Das ganze sollte dann ca. so aussehen:
      (Das Sprite für den obj_solid wurde transparent gesetzt, damit man die Tilesets darunter noch erkennen kann.)


      Falls erwünscht, kann das Tutorial mit folgenden Bereichen erweitert werden.
      • Bewegungsanimation
      • Bewegende PlatformObjekte
      • diverse Wünsche von euch


      P.S.: Das ist mein erstes Tutorial, also seit nicht so hart zu mir :D
      Bilder
      • spr_solid.png

        82 Byte, 16×16, 910 mal angesehen
      • ts_gras.png

        332 Byte, 57×57, 924 mal angesehen
      • spr_player_mask.png

        81 Byte, 16×16, 918 mal angesehen
      • spr_player.png

        124 Byte, 16×16, 915 mal angesehen
      Je mehr Käse, desto mehr Löcher.
      Je mehr Löcher, desto weniger Käse.
      Ergo: Je mehr Käse, desto weniger Käse.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Rodrog ()

    • Hallo

      Erstmal danke für dein Tut, ist super kommentiert und funktioniert einwandfrei. :)
      Genau soetwas habe ich lange gesucht.

      Was mich ein wenig stört ist, das ich quasi einen Doppelsprung machen kann. Besser währe den Doppelsprung einfach mit einer Variable im Create Event auf false oder true zu setzen, also wenn man einen will bzw. ein Powerup einsammelt oder so in der Art, das man damit den Doppelsprung auf true setzen kann. Wenn du verstehst was ich meine.

      Super währen auch:

      Moveable Platforms
      Jumpthrough Platforms (Spurng durch solid platforms)
      Fallthrough Platforms (Nach unten drücken fällt der Player durch das solid, ist ideal für leitern)
      Charakter Animationen (links laufen, rechts laufen, sprung anim, fall anim, leitern klettern)
      Friction also das wenn zb. winterlandschaft ist das der Player rutscht auf dem solid
      Schrägen laufen also das der Player auch auf schrägen solids laufen kann.

      So das wärs erst mal. :D

      Evtl. hast du Zeit und lust meine Vorschläge in dein Tutorial zu packen. Währe absolut cool. :thumbup:

      Danke im voraus
      lg Vectorhead
    • Vectorhead schrieb:

      Erstmal danke für dein Tut, ist super kommentiert und funktioniert einwandfrei.
      Genau soetwas habe ich lange gesucht.

      Kein Problem. War alles verständlich, oder hab ich zuviel vorrausgesetzt? (Dachte schon, dass das keiner kapiert, weil keiner eine Antwort schreibt ^^)

      Vectorhead schrieb:

      Was mich ein wenig stört ist, das ich quasi einen Doppelsprung machen kann. Besser währe den Doppelsprung einfach mit einer Variable im Create Event auf false oder true zu setzen, also wenn man einen will bzw. ein Powerup einsammelt oder so in der Art, das man damit den Doppelsprung auf true setzen kann. Wenn du verstehst was ich meine.

      Ich habe versucht, die gesamten "Konstanten" ins Step-Event zu setzen. Damit das Create-Event nicht überfüllt wird. In der originalen Version, gibt es 20 Variablen zum Einstellen.

      Vectorhead schrieb:

      Moveable Platforms
      Jumpthrough Platforms (Spurng durch solid platforms)
      Fallthrough Platforms (Nach unten drücken fällt der Player durch das solid, ist ideal für leitern)
      Charakter Animationen (links laufen, rechts laufen, sprung anim, fall anim, leitern klettern)
      Friction also das wenn zb. winterlandschaft ist das der Player rutscht auf dem solid
      Schrägen laufen also das der Player auch auf schrägen solids laufen kann.

      Bis auf die unterschiedlichen Friction, hab ich den Code eigentlich schon. Müsste diesen nur mehr dokumentieren. Mal schauen, ob ich in den nächsten Tagen dazu komme. Mal gucken wie ich die Friction einbauen werde.

      MfG
      Rodrog
      Je mehr Käse, desto mehr Löcher.
      Je mehr Löcher, desto weniger Käse.
      Ergo: Je mehr Käse, desto weniger Käse.
    • Hallo
      Kein Problem. War alles verständlich, oder hab ich zuviel vorrausgesetzt? (Dachte schon, dass das keiner kapiert, weil keiner eine Antwort schreibt ^^)

      Ich finde du hast alles super erklärt, so versteht sogar ein Anfänger wie ich den Code viel besser. Meiner Meinung nach Super gemacht.

      Ich habe versucht, die gesamten "Konstanten" ins Step-Event zu setzen. Damit das Create-Event nicht überfüllt wird. In der originalen Version, gibt es 20 Variablen zum Einstellen.

      Ich denke, wenn du die Variablen so kommentierst wie den rest des Codes, ist es ok und bleibt übersichtlich und nachvollziehbar.

      Bis auf die unterschiedlichen Friction, hab ich den Code eigentlich schon. Müsste diesen nur mehr dokumentieren. Mal schauen, ob ich in den nächsten Tagen dazu komme. Mal gucken wie ich die Friction einbauen werde.


      Das hört sich super an, freu mich drauf, dann kann ich mit meinem Jump´n Run Spiel beginnen. :thumbsup:

      Ps.: Einen hab ich noch, wie währs mit Rops, also schwingende Seile an denen man schwingen und hochklettern kann. :D

      Danke im voraus
      lg Vectorhead
    • Hallo

      Sorry für den doppelpost.

      Bis auf die unterschiedlichen Friction, hab ich den Code eigentlich schon. Müsste diesen nur mehr dokumentieren.

      Machst du noch weiter mit diesem TUT?
      Währe schade wenn du nicht weitermachst, ich glaub ich bin nicht der einzige der das gut gebrauchen könnte.

      Ich währe auch über einen undokumentierten Code schon froh.
      lg Vectorhead
    • Ich schließe mich Vectorhead mal an!

      Tolle Engine, gut kommentiert und funktioniert Super! Vielleicht bei Lust und Laune etwas erweitern :)

      Habe schon viele Jump & Run Tuts gesehen aber sehr viele nur auf Englisch. Gute Deutsche findet man kaum und wenn ja sind sie nicht sonderlich gut oder noch unvollständiger.

      Also auch von mir die Bitte: Weitermachen :D
    • Ach. Das so vielen mein Tutorial interessiert wusste ich gar nicht. Ich hab den heutigen Abend damit verbracht, mir die Engine mit 3-4 Features zu erweitern. Leider ist der Code nicht dokumentiert und auch nicht 100% kontrolliert. Ich lad mal die gmk hoch. Falls jemand was mit code anfängt, der nicht sehr dokumentiert ist, dann viel spaß. Die restlichen müssen leider noch warten.

      Neue Features:
      Bewegliche Plattformen (horizontal + vertikal)
      Raufspring Plattformen (Man kann durch springen, und durch drücken der "S"-Taste fällt man nach unten
      Wasser
      Schiefe Plattformen

      Mal schauen was ihr davon hält. Die Engine gefällt mir schon so gut, dass ich fast wieder mein Spiel weiter machen würde, aber ich glaub das lass ich lieber :P
      Bilder
      • plattform2.png

        9,14 kB, 656×359, 123 mal angesehen
      Dateien
      • Platform02.gmk

        (20,59 kB, 142 mal heruntergeladen, zuletzt: )
      Je mehr Käse, desto mehr Löcher.
      Je mehr Löcher, desto weniger Käse.
      Ergo: Je mehr Käse, desto weniger Käse.
    • Scheisse ich durfte die aktuellte Engine von Rodrog testen und .... meine Fresse ist die geil.

      Es gibt einfach alles, von Water über verschiedenen Frictions , double jump..... einfach alles was eine Platformer Engine braucht. Natürlich alles xtra super in Deutsch erklärt.
      Aber mehr will ich nicht verraten, (sorry Rodrog, musste ich ankündigen), alles andere kommt denke ich demnächst. :thumbsup: :thumbsup:
      lg Vectorhead
    • Mensch, Mensch, Mensch.. Wenn ich nicht immer alles vergessen würde, was ich so verspreche ^^ Natürlich wird meine Engine noch nachgereicht. Derzeit versuche ich die Kollision über die Tiles hinzukriegen. Damit ich nicht für alle "Objekte" einzelne Masken erstellen muss. Keine Ahnung ob das mit dem GM8 funktioniert. Außerdem will ich mein System auf neuesten Stand bringen (GM-Studio). Leider habe ich keine dafür keine Lizenz und ich möchte diese auch derzeit nicht erwerben. Werde mir aber die Free-Version laden und mal schauen was da alles machbar ist.

      -
      Rodrog
      Je mehr Käse, desto mehr Löcher.
      Je mehr Löcher, desto weniger Käse.
      Ergo: Je mehr Käse, desto weniger Käse.