Vertikale Platform

  • GM 6

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

  • Vertikale Platform

    Hallo Leute ich habe ein Problem ich wollte in meinem Spiel eine Vertikale Platform machen also die sich Hoch und Runter bewegt.

    Dazu wollte ich das Platform tutu von Copyboy verwenden aber da blicke ich nicht durch.

    Wie mache ich das mit Drag and Drop oder gibt es eine leichtere art mit GML ?
  • In mein the 2d game habe ich diesen Code benutzt (ich weiß der ist nicht optimal, aber die Lösung funkt eigentlich ganz gut ;) )

    GML-Quellcode

    1. {
    2. if (collision_rectangle(x,y-3,x+32,y,obj_player,true,false))
    3. {
    4. with(collision_rectangle(x,y-3,x+32,y,obj_player,true,true))
    5. {
    6. if (place_free(x,y-3) || place_meeting(x,y-3,obj_spikes_rev))
    7. {
    8. y -=3;
    9. obj_block_move.y -= 3;
    10. }
    11. }
    12. }
    13. else
    14. {
    15. if (place_free(x,y+2))
    16. y += 2;
    17. else if (place_meeting(x,y+2,obj_spikes))
    18. instance_destroy();
    19. }
    20. }
    Alles anzeigen


    Musst du nur noch auf dein Spiel optimieren... sollte kein Problem sein oder? (weil bist ja GML Anfänger.. und der Code ist ja eigentlich noch ganz leicht...)
  • GML-Quellcode

    1. if other.y>y && !place_free(x,y+vspeed){
    2. move_contact_solid(270,8);
    3. vspeed=0;
    4. gravity=0;}
    5. if other.y<y && !place_free(x,y+vspeed){
    6. move_contact_solid(90,8);
    7. vspeed=0;}


    Ins collisions event mit der Platform.

    Edit: Kannst du dir ja aussuchen ;)
  • Ähm da habe ichn Problem
    Ich springe auf die Platform, die Platform bewegt sich nicht ich springe wieder lande iner Luft und hänge dort fest wodran liegt das?


    EDIT:So der Code von Prustel kreig ich net hin und der von Metallknight kann ich nicht nachvollziehen :heul:

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

  • Metalknight schrieb:

    In mein the 2d game habe ich diesen Code benutzt (ich weiß der ist nicht optimal, aber die Lösung funkt eigentlich ganz gut ;) )

    GML-Quellcode

    1. {
    2. if (collision_rectangle(x,y-3,x+32,y,obj_player,true,false))
    3. {
    4. with(collision_rectangle(x,y-3,x+32,y,obj_player,true,true))
    5. {
    6. if (place_free(x,y-3) || place_meeting(x,y-3,obj_spikes_rev))
    7. {
    8. y -=3;
    9. obj_block_move.y -= 3;
    10. }
    11. }
    12. }
    13. else
    14. {
    15. if (place_free(x,y+2))
    16. y += 2;
    17. else if (place_meeting(x,y+2,obj_spikes))
    18. instance_destroy();
    19. }
    20. }
    Alles anzeigen


    Musst du nur noch auf dein Spiel optimieren... sollte kein Problem sein oder? (weil bist ja GML Anfänger.. und der Code ist ja eigentlich noch ganz leicht...)
    Zeile 2: if (collision_rectangle(x,y-3,x+32,y,obj_player,true,false))
    if .. klah ?! -> collision_rectangle = Es wird in einem Rechteckigen bereich (x,y-3,x+32,y) geprüft, ob eine Kollision mit dem Objekt (obj_player) stattfindet. Der erste boolische Wert (true) bedeutet, ob es Präzise sein soll, und der zweite (false) ob es nicht mit den Objekt sein soll, das diesen Code ausführt (also die Platform selber).

    Zeile 4: with(collision_rectangle(x,y-3,x+32,y,obj_player,true,true))
    with = Mit den Objekt in der Klammer, wird von { bis } dies ausgeführt.
    In der withschleife, ist das gleiche wie oben, nur das der zweite Boolische Wert true ist, also das Platform objekt selber nicht gemeint ist. Nun wird wie schon gesagt, wenn der Player in der 3 Pixel höhen und 32 Pixel langen Rechteck ist, der code von { bis } gemacht.

    Zeile 6: if (place_free(x,y-3) || place_meeting(x,y-3,obj_spikes_rev))
    Falls über den SPIELER OBJEKT (wegen den With!) der Platz frei ist, so wird der nächste Code ausgeführt (das zweite mit place_meeting kannste rausnehmen, dass ist nicht wichtig)

    Zeile 8-9:
    y -=3;
    obj_block_move.y -= 3;
    Der Spieler Y-Achsen-Wert wird um 3 erhöht (also spieler geht 3 pixeln nach oben), und das gleiche mit der Platform (in diesem Beispiel obj_block_move)

    Zeile 2-13: In Zeile 13 ist ein "else" also sozusagen "oder tue dies", das else bezieht sich auf Zeile 2, falls der Spieler also nicht über der Platform ist.

    Zeile 15 + 16:
    if (place_free(x,y+2))
    y += 2;
    Falls also unter der Platform (da die with } zuende ist), 2 Pixel frei sind, so wird die Platform 2 Pixel herunter "gelassen".
    (Ich habe beim runtergehen 2 genommen, damit die Platform langsamer runter als hoch geht... 1 pixel hat auch schon eine sehbare wirkung!)

    Den rest des Codes, also die else if schleife danach, ist auch auf mein Spiel spezialisiert, und brauchst du nicht.

    Hoffe das war ausreichen erklärt, ansonsten kann ich dir net mehr helfen ^^

    Mfg.,
    Metalknight
  • obj_spikes, und obj_spikes_rev sind objekte die nicht wichtig sind. Diese habe ich nur in mein gegeben, falls der player oder die Platform die spikes berührt, der player oder die platform zerstört werden, sind aber für den hauptskript ehr relativ
    ...

    GML-Quellcode

    1. {
    2. if (collision_rectangle(x,y-3,x+32,y,obj_player,true,false))
    3. {
    4. with(collision_rectangle(x,y-3,x+32,y,obj_player,true,true))
    5. {
    6. if (place_free(x,y-3))
    7. {
    8. y -=3;
    9. obj_block_move.y -= 3;
    10. }
    11. }
    12. }
    13. else
    14. {
    15. if (place_free(x,y+2))
    16. y += 2;
    17. }
    18. }
    Alles anzeigen


    Das da oben ist der code den du brauchst, im step der Platform, und obj_player einfach gegen deine Hauptfigur eintauschen, und obj_block_move einfach gegen die Platform tauschen ... die erklärung findest yah oben ^^

    Mfg.,
    Metalknight
  • Jo wo ihr gerade von Platformen sprecht, hier ist auch mal mein Code den ich vorhin zusammen geworfen habe. Funktioniert zwar recht gut, aber irgendwie gefällt mir das Ganze nicht...
    Vielleicht findet jemand Fehler oder kann mir eine bessere Lösung geben, aber für meine Bewegungsroutinen usw. ist das die effektivste Lösung die ich finden konnte.

    Naja der Code gehört in den Step-Event der Platform.

    GML-Quellcode

    1. if (collision_rectangle(x+2,y,x+14,y-1,obj_player,true,false)){
    2. global.on_platform = true;
    3. global.is_jumping = false;
    4. }else{
    5. global.on_platform = false;
    6. }
    7. if (global.on_platform){ //Player is standing ON the platform
    8. if ((xmove_dir = 1) || (ymove_dir = 1)){ //platform moves to the right/down
    9. if (place_free(x+xmove_dir,y+ymove_dir)){ //collision relative to the platform position
    10. obj_player.y += ymove_dir;
    11. obj_player.x += xmove_dir;
    12. y += ymove_dir;
    13. x += xmove_dir;;
    14. }else{
    15. xmove_dir *= -1;
    16. ymove_dir *= -1;
    17. }
    18. }else if ((xmove_dir = -1) || (ymove_dir = -1)){ //platform moves to the left/up
    19. with (collision_rectangle(x+2,y,x+14,y-1,obj_player,true,false)){ //collision relative to the player
    20. if (place_free(x+other.xmove_dir,y+other.ymove_dir)){ //other is a refernece to the platform object!
    21. //move the player
    22. obj_player.y += other.ymove_dir;
    23. obj_player.x += other.xmove_dir;
    24. //move the platform
    25. other.y += other.ymove_dir;
    26. other.x += other.xmove_dir;
    27. }else{
    28. //reverse the moving direction of the platform
    29. other.xmove_dir *= -1;
    30. other.ymove_dir *= -1;
    31. }
    32. }
    33. }
    34. }else if (place_free(other.x+xmove_dir,y+ymove_dir)){
    35. //normal platform movement, only used if theres no obj_player standing on top
    36. y += ymove_dir;
    37. x += xmove_dir;
    38. }else{
    39. //reverse the moving direction of the platform
    40. xmove_dir *= -1;
    41. ymove_dir *= -1;
    42. y += ymove_dir;
    43. x += xmove_dir;
    44. }
    Alles anzeigen


    Also kurze Erklärung:
    - Innerhalb des Codes findest du die Werte 2 und 14. Die musst du entsprechend an deine Tilegröße anpassen. Meine Tiles z.B. sind 16x16 Pixel groß. Wenn du 32px große Tiles verwendest musst du statt 14 einfach 30 einsetzen. Bei 8px großen Tiles analog dazu 6. Sprich immer 2 weniger.
    Das hat den Effekt, dass dein Spieler nicht seitlich irgendwie hängen bleibt. Ausprobieren hilft da.

    - obj_player ist eine Instanz der Playerklasse, obj_player hat einen Collision-Event mit der Platform und setzt den vspeed auf 0, aber das kommt auf deine Gravitylösung an, musst du individuell anpassen

    - Der erste If-Block prüft ob ein Playerobjekt auf "der" Platform steht

    - global.on_platform gibt an ob der Player auf "irgendeiner" Platform steht. Ich merke gerade, dass man das in die konkrete Instanz-ID umaendern sollte da sonst alle anderen Platformen komisch rumfahren, global.on_platform = self; sollte besser funktionieren... werde ich nachher mal tesen.
    Die Variable brauche ich für meine Gravitationslösung, kommt aber auf den Rest deines Codes an.

    - xmove_dir und ymove_dir geben die Bewegungsrichtung der Platform an.
    Wenn du eine vertikale Platform willst musst du einfach den Creation-Code setzten. NICHT der Create-Event. Ich meine im Room-Editor STRG+Rechtsklick auf die Instanz und dann Creation-Code auswählen.
    xmove_dir = 0 bedeutet keine Bewegung in der Horizontalen.
    ymove_dir = 0 bedeutet keine Bewegung in der Vertikalen.

    Für 1 natürlich analog eine Bewegung in die entsprechende Richtung. Setzt du beides auf 1 bewegt sich die Platform diagonal im 45° Winkel.

    Einmal habe ich es geschafft eine horiz. und eine vert. Platform irgendwie in einander zu verkeilen. Bis jetzt konnte ich das aber nicht mehr reproduzieren, weshalb ich den Fehler nicht analysieren konnte :(
    Wer das auch schafft kann mir ja sagen wieso das so ist.

    Achja, die Platformen bewegen sich nur zwischen zwei soliden Objekten z.B. Wänden hin und her. Eine Bewegung über eine bestimmte Distanz werde ich auch noch einbauen wenn ich Zeit habe.

    Ich hoffe mal du kannst damit was anfangen, ist leider nicht der einfachste Code, aber ich konnte wie gesagt keine simplere Lösung finden.
    Ich hab aber auch alle wichtigen Stellen kommentiert. :>

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