Du bist nicht angemeldet.

Windapple

Rußverdichter

  • »Windapple« ist der Autor dieses Themas

Beiträge: 3 035

Danksagungen: 17

  • Private Nachricht senden

1

Sonntag, 8. Mai 2005, 13:07

Bewegliche Platformen

Original: Moving Platforms Tutorial
Autor: Simon Donkers
Homepage: http://gamemaker.simondonkers.com/

übersetzt von Windapple mit Genehmigung von Simon Donkers


Dieses Tutorial beschreibt das erstellen beweglicher Plattformen, wie z.B. Aufzüge. Zuerst werden horizontale Bewegungen besprochen, danach vertikale. Dieses Tutorial setzt vorraus, das du schon ein Plattformspiel machen kannst. Ein Tutorial darüber befindet sich auf der Game Maker Website.

Horizontale Plattformen
Der Trick bei horizontal bewegten Plattformen liegt darin, die Geschwindigkeit der Plattform zu prüfen und die Spielergeschwindigkeit daran anzupassen. Erst musst du prüfen, ob du auf dem Boden stehst:

GML

1
2
3
4
5
if !place_free(x,y+1) then
{
gravity:=0;
vspeed:=0;
}


Dann musst du überprüfen, ob du auf einer beweglichen Plattform stehst:

GML

1
2
3
4
5
if position_meeting(x-sprite_xoffset+sprite_width/2,y-sprite_yoffset+
sprite_height,object_moving_platform)
{
// irgendein Code
}




Wie du siehst benutze ich für die X Koordinate: x-sprite_xoffset+sprite_width/2. x-sprite_xoffset bedeutet, das von der linken Seite berechnet wird, auch wenn der Ursprung an eine andere Stelle gesetzt wird. Das sprite_width/2 führt dazu, dass die Position auf die halbe Breite des Sprites gelegt wird. Die X Koordinate ist also mitten im Sprite. Als Y Koordinate siehst du y-sprite_yoffset welche die Oberkannte des Sprites angibt. Wenn wir sprite_height hinzuaddieren sind wir an der Unterkannte. Der Code prüft also letztendlich, ob mittig unter dem Spieler eine Plattform ist.



Nun muss noch die Bewegunge kommen. Dazu kannst du den hspeed des Spielers auf den des Blockes stellen:

GML

1
2
3
4
5
6
7
8
9
10
11
if position_meeting(x-sprite_xoffset+sprite_width/2,y-sprite_yoffset+
sprite_height,object_moving_platform)
{
objID = instance_position(x-sprite_xoffset+sprite_width/2,y-sprite_yoffset+
sprite_height,object_moving_platform)
hspeed = objID.hspeed;
}
else
{
hspeed:=0;
}


Dies prüft auf eine bewegliche Plattform, nimmt ihre ID und setzt hspeed des Spielers auf den hspeed der Plattform.

Dies erzeugt eine sich horizontal bewegende Plattform.

Einige Hinweise:

* Oben muss du object_moving_platform ausfüllen, das muss mit dem Namen der beweglichen Plattform ersetzt werden. Solltest du mehrere mit unterschiedlichen Eigenschaften haben, arbeite mit Parents. Damit kann man das auf alle Plattformen ausweiten.
* Denke daran die Plattformen solid zu machen!!!
* Ein wichtiges Details ist es, es unmöglich zu machen zwischen Plattform und Boden zu stecken. Also lass die Plattform bei einer Kollision mit dem Spieler und bei höherer Höhe als dieser sich umkehren:

GML

1
2
3
4
if y-sprite_yoffset+sprite_height>other.y-other.sprite_yoffset then
      {
      other.hspeed:=-other.hspeed;
      }

Dieser Code muss in den Kollisionsevent des Spielers mit der Plattform.
* Es gibt ein Beispiel mit horizontal und vertikal beweglichen Plattformen, hols dir hier.


Vertikale Plattformen
Vertikale Plattformen sind viel schwieriger als horizontale weil es immer das Risiko gibt, in ihnen stecken zu bleiben. Das positive ist, das du dich immer herunterbewegst, das liegt an der Gravitation.

Für vertikale Plattformen kann man den Code mit einigen Anpassungen verwenden

GML

1
2
3
4
5
6
7
if position_meeting(x-sprite_xoffset+sprite_width/2,y-sprite_yoffset+
sprite_height,object_moving_platform)
{
objID = instance_position(x-sprite_xoffset+sprite_width/2,y-sprite_yoffset+
sprite_height,object_moving_platform)
vspeed = objID.vspeed;
}


Wenn du aber nicht genau über der Plattform stehst wirst du drin stecken bleiben. Wir modifizieren den Code also:

GML

1
2
3
4
5
6
7
8
if position_meeting(x-sprite_xoffset+sprite_width/2,y-sprite_yoffset+
sprite_height,object_moving_platform)
{
objID = instance_position(x-sprite_xoffset+sprite_width/2,y-sprite_yoffset+
sprite_height,object_moving_platform)
vspeed = objID.vspeed;
move_outside_solid(90,sprite_height);
}


Einige Hinweise:

* Stelle sicher, das die Plattform nie so nahe an die Decke oder an den Boden kommt, um deine Figur festzufahren.
* Du musst hier keine genauen Kollisionsprüfungen machen, da der Spieler immer auf dem Plattform stehen bleibt, da die Plattform sich nach unten bewegt und der Spieler sich nach oben.
* Denke daran die Plattformen solid zu machen!!!
* Beachte, das der Spieler von der Plattform nicht nach oben springen kann. Um das zu erreichen, muss noch ein bisschen modifiziert werden:

GML

1
2
3
4
5
6
7
8
9
10
11
12
if position_meeting(x-sprite_xoffset+sprite_width/2,y-sprite_yoffset+
      sprite_height,object_moving_platform)
      {
      objID = instance_position(x-sprite_xoffset+sprite_width/2,y-sprite_yoffset+
      sprite_height,object_moving_platform)
      vspeed = objID.vspeed;
      move_outside_solid(90,sprite_height);
      if keyboard_check(vk_up) then
      {
      vspeed:=-10; //change 10 to the jump speed
      }
      }

* Es gibt ein Beispiel mit horizontal und vertikal beweglichen Plattformen, hols dir hier.


Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.
"Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
- Joseph Weizenbaum

-jc-

Kleiner Cäsar

Beiträge: 60

  • Private Nachricht senden

2

Sonntag, 8. Mai 2005, 14:55

2 Möglichkeiten, das Ganze etwas lesbarer zu gestalten:

a) griffige Objektnamen
. . z.B. "Teller" statt "object_moving_platform" <-- darauf weist du ja schon hin

b) lokale Definitionen

Quellcode

1
2
xx = x - sprite_xoffset + sprite_width/2
yy = y - sprite_yoffset + sprite_height 

Sharivari

Pfund-Münze

Beiträge: 332

Selbsteinschätzung: GML Fortgeschrittener

Aktuelles Projekt: Operation Assault

  • Private Nachricht senden

3

Sonntag, 8. Mai 2005, 16:25

ok.. ich hab das mal für vertikal gemacht.. aber folgendes problem. meine spielfigur springt jetzt viel zu hoch... wie stell ich das um?


Windapple

Rußverdichter

  • »Windapple« ist der Autor dieses Themas

Beiträge: 3 035

Danksagungen: 17

  • Private Nachricht senden

4

Sonntag, 8. Mai 2005, 18:37

Da ist doch ne Zeile mit dem Kommentar "//change 10 to the jump speed" wo vspeed 10 zugewiesen wird.
Da musst du einfach die gewünschte Sprunggeschwindigkeit angeben.
"Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
- Joseph Weizenbaum

vereiser

Fünfmarkstück

Beiträge: 5

  • Private Nachricht senden

5

Sonntag, 30. April 2006, 18:47

RE: Bewegliche Platformen

Zitat

Original von Windapple

GML

1
2
3
4
5
if !place_free(x,y+1) then
{
gravity:=0;
vspeed:=0;
}



Anstatt

GML

1
place_free(x,y+1)

ist es besser

GML

1
place_free(x,y+1+vspeed)

zu verwenden, um zu verhindern, daß die Spielfigur im Boden stecken bleibt.

oder noch besser

GML

1
2
3
4
5
6
7
8
9
10
11
12
13
if (vspeed == 0)
{
     yy = y + 1;
}
else
{
    yy = y + vspeed;
}

if (!place_free(x, yy))
{
   code
}
Bevor ich nicht ganz sicher bin, sage ich lieber gar nichts. ?(

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »vereiser« (30. April 2006, 18:59)


EddyZ

Verblendeter Grafiker

Beiträge: 132

Game Maker Version: 8 Pro

Aktuelles Projekt: Fruge, Mechferno

  • Private Nachricht senden

6

Samstag, 6. Januar 2007, 20:15

Find ich genial !!
das habe ich die ganze zeit für mein J'n'R gesucht und
endlich mal gefunden ...
bloß verstehe ich nicht was du mit dem Kommentar meinst:

// irgendein Code

was ist gemeint ?
Man prüft ja , ob man auf einer plattform steht
aber was würde man da für nen Code reinmachen statt dem Kommentar ?

Edit : sorry , hab wohl das untere überscrollt , habs gefunden

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »EddyZ« (6. Januar 2007, 20:18)


Yeah3

Starker Euro

Beiträge: 321

Game Maker Version: 6 registriert

Selbsteinschätzung: GML Anfänger

  • Private Nachricht senden

7

Samstag, 6. Januar 2007, 20:53

Edit: hatte eben ein problem aber jetzt habe ich es gelöst

Danke an euch beiden (simon fürs bereit stellen und dir für übersetzten) sowas hatte ich gesucht.

Cooles Skript :top:

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Yeah3« (6. Januar 2007, 22:09)


woku

Waldschrat

Beiträge: 186

Game Maker Version: 7 Pro

Selbsteinschätzung: GML Fortgeschrittener

  • Private Nachricht senden

8

Montag, 26. März 2007, 20:54

Ich habe noch eine Frage zu dem Skript. Hat Mark (Overmars) nicht einmal gesagt, dass es der größte(oder häufigste) Performance-Fehler überhaupt wäre, sich bewegende, solide Objekte zu machen?
woku

Siegfried

Kaugummi

Beiträge: 99

Game Maker Version: 6 registriert

  • Private Nachricht senden

9

Dienstag, 27. März 2007, 14:04

Nein. Den Player machst du nur Solid ,wenn du nicht willst das Player und PC Durch sich durch laufen können.

woku

Waldschrat

Beiträge: 186

Game Maker Version: 7 Pro

Selbsteinschätzung: GML Fortgeschrittener

  • Private Nachricht senden

10

Dienstag, 27. März 2007, 19:14

:?:
Verstehe nicht, was du meinst. Mit dem sich bewegenden "solid"-Objekt ist natürliche die Bewegliche Plattform gemeint.

ToWe

Dollar-Note

Beiträge: 310

Game Maker Version: 7 Pro

Selbsteinschätzung: GML Anfänger

Aktuelles Projekt: Blacksmith - Escape to Efral

  • Private Nachricht senden

11

Samstag, 8. März 2008, 08:44

Jatzt klappt nix mehr, ich kann net mehr springen.

Wo muss ich denn was einfügen? Kannst du das mal in einen Code machen, WA?



Robinx

Starker Euro

Beiträge: 321

Game Maker Version: 8.1 Standard

Selbsteinschätzung: GML Fortgeschrittener

Aktuelles Projekt: Andere Programmiersprachen

Danksagungen: 8

  • Private Nachricht senden

12

Sonntag, 29. August 2010, 15:03

Bei der Horizontalen Platform ist alles klar, nur bei der Vertikalen kann die Spielfigur nicht springen!
Skype: My.Robinx
Steam: MyRobinx