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:
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
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.
Create-Event
Spoiler anzeigen
Alles anzeigen
Und hier noch das Step Event.
Step-Event
Spoiler anzeigen
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.
P.S.: Das ist mein erstes Tutorial, also seit nicht so hart zu mir
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)
- ts_gras
- 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.

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

GML-Quellcode
- // Falls der Spieler sich bewegen darf.
- if(can_move) {
- //In diesem IF wird überprüft, ob die Linke oder Rechte Taste gedrückst ist, ABER nicht beide gleichzeitig.
- if(((keyboard_check(key_left) || keyboard_check(key_right)) && !(keyboard_check(key_left) && keyboard_check(key_right)))) {
- move = true; //Falls ja, dann wird move auf wahr gesetzt. Nun versucht sich der Spieler zu bewegen. Die Kollisionsüberprüfung erfolgt später.
- if(keyboard_check(key_left)) {
- move_direction = -1;
- }
- if(keyboard_check(key_right)) {
- move_direction = +1;
- }
- } else {
- move = false; //Spieler will sich nicht bewegen.
- }
- //Falls der Spieler sich bewegen will, kommt er in diese IF
- if(move) {
- /*
- 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.
- Dannach wird die Wand wieder verlassen.
- */
- if(place_free(x+2*move_direction,y)) {
- x += 2*move_direction; //Platz ist frei -> Bewege nach move_direction um MOVE_SPEED
- } else {
- if(move_direction == +1) {
- move_contact_solid(0, 2);
- x = round(x);
- move_outside_solid(180, 2);
- } else if(move_direction == -1) {
- move_contact_solid(180, 2);
- x = round(x);
- move_outside_solid(0, 2);
- }
- }
- }
- }
- if(can_jump) {
- /*
- Falls die Springen Taste gedrückt wird und jump_number != 2 ist, wird gesprungen.
- Hier muss beachtet werden, dass die derzeitige Sprunggeschwindigkeit jump_speed auf 0 gesetzt wird. Die Sprungzeit
- muss ebenfalls auf 0 gesetzt werden. Dadurch das ein Sprung den Fall wieder "deaktivert" muss die Fallgeschwindigkeit auch auf 0 gesetzt werden.
- */
- if(keyboard_check_pressed(key_up) && (jump_number != 2)) {
- jump = true;
- jump_number += 1;
- jump_speed = 0;
- jump_time = 0;
- fall_speed = 0;
- }
- if(jump) {
- jump_time = min(jump_time+1, 18); //Die Sprungzeit wird um eines erhöht, ABER maximal bis 18.
- jump_speed = min(jump_speed+0.75, 3); //Die Geschwindigkeit des Sprunges wird um 0.75 erhöht, ABER maximal bis 3.
- /*
- Im ersten IF:
- Hier wird überprüft, ob nicht mehr gesprungen werden will, oder ob die maximale Sprungzeit (18) erreicht wurde.
- Falls ja => Nicht mehr springen
- Im zweiten IF:
- Ebenfalls wie beim Bewegen, wird überprüft, ob nach oben Platz frei ist. Falls ja => Weiter nach oben.
- Im dritten IF:
- Falls kein Platz frei ist, soll trotzdem noch, bis zum Ansprung bewegt werden.
- Dies ist das gleiche wie bei einer Links/Rechts-Bewegung
- */
- if((keyboard_check_released(key_up) || jump_time == 18)) {
- jump = false;
- } else if(place_free(x,y-jump_speed)) {
- y -= jump_speed;
- } else {
- move_contact_solid(90, fall_speed);
- y = round(y);
- move_outside_solid(270, fall_speed);
- jump = false;
- }
- }
- }
- //Es kann nur gefallen werden, wenn gefallen werden darf UND nicht gesprungen wird.
- if(can_fall && !jump) {
- /*
- Falls nach unten Frei wäre, dann würde man fallen. Falls nicht (also man steht auf einem fixen Kollisionsobjekt)
- dann fällt man nicht.
- */
- if(place_free(x,y+1)) {
- fall = true;
- } else {
- fall = false;
- fall_speed = 0;
- jump_number = 0;
- }
- if(fall) {
- fall_speed = min(fall_speed+0.15, 12); //Die Fallgeschwindigkeit wird um 0.15 erhöht, ABER wieder maximal bis 12.
- /*
- 1. IF:
- Wenn nach unten Frei ist, dann falle.
- 2. IF:
- Falls nicht, dann bewege dich wieder maximal bis zum Anstand.
- */
- if(place_free(x,y+fall_speed)) {
- y += fall_speed;
- } else {
- move_contact_solid(270, fall_speed);
- y = round(y);
- move_outside_solid(90, fall_speed);
- }
- }
- }
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

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.
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 ()