Auf der unteren Plattform bleiben (Neues Spiel)

  • GM 8
  • Auf der unteren Plattform bleiben (Neues Spiel)

    Hallo Leute,

    hab mal in GML einen kleinen Plattformer gebaut. Besteht nur aus Spieler und Plattform.



    Das Problem: Wenn der Spieler mit dem "Kopf" (also oben) die obere Plattform berührt, bewegt er sich nach oben bis er auf der oberen plattform draufsteht.
    Das soll er aber nicht, er soll die obere Plattform ignorieren und auf der unteren weiterlaufen.

    Habe das hier versucht. Steht im Kollisionsevent mit der Plattform:

    if (collision_rectangle(x-3,y-2,x+3,y+2,obj_rund_plattform,true,true)>0)
    {
    y+=-2
    move_contact_all(270,-1)
    }

    Das soll bewirken dass der Spieler nur nach y+=-2 geht wenn der Spieler mit den "Füßen" die Plattform berührt. (Nullpunkt liegt bei den Füßen)

    Kann mir jemand sagen woran´s liegt und wie ich das problem lösen kann?


    Hier ist das Spiel:

    jump n run GML.gm81.zip



    Vielen Dank im Voraus!

    Gruß,
    Pascal

    PS:Ich benutze übrigens nur die light Version von Game Maker 8 falls das wichtig ist.
  • Da ich gerade im zug bin kann ich keinen code bier schreiben aber du kannst ja so machen das wenn deine kugel einen höheren z wert als die plattform aufweißt, die platform unsolid machen.

    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.
  • Pascal2851981 schrieb:

    Hallo Rodrog,

    Danke für Deine Antwort!

    Rodrog schrieb:

    Da ich gerade im zug bin kann ich keinen code bier schreiben aber du kannst ja so machen das wenn deine kugel einen höheren z wert als die plattform aufweißt, die platform unsolid machen.
    Was ist ein z Wert?


    Gruß,
    Pascal
    Damit meint er Y-Wert.
    Den Z-Wert gibt's nur im Dreidimensionalem Raume.
    Er meint, dass wenn die Kugel einen höheren Y-Wert als die Plattform hat(sprich unter ihr ist), dass die Plattform dann unsolide wird.
    Sprich: Die Plattform ist durchgehbar.
  • Lizard771 schrieb:

    Pascal2851981 schrieb:

    Hallo Rodrog,

    Danke für Deine Antwort!

    Rodrog schrieb:

    Da ich gerade im zug bin kann ich keinen code bier schreiben aber du kannst ja so machen das wenn deine kugel einen höheren z wert als die plattform aufweißt, die platform unsolid machen.
    Was ist ein z Wert?


    Gruß,
    Pascal
    Damit meint er Y-Wert.
    Den Z-Wert gibt's nur im Dreidimensionalem Raume.
    Er meint, dass wenn die Kugel einen höheren Y-Wert als die Plattform hat(sprich unter ihr ist), dass die Plattform dann unsolide wird.
    Sprich: Die Plattform ist durchgehbar.

    Ach hoppala ^^ Dadurch das an meinem Handy die Tasten y und z vertauscht sind, passiert mir das manchmal. Hofe das ist keine großes Problem. Am handy kann man nicht sehr besonders gut schreiben.

    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.
  • Hi Pascal

    Hier habe ich einen Ansatz auf den man Aufbauen kann.

    im Create

    Quellcode

    1. // Player in zustand versetzen
    2. global.player_zustand=1
    3. id_Plattform = 0;
    4. id_collision = 0;


    im Begin Step

    Quellcode

    1. // Untersuche auf welcher Platfrom du dich befindest
    2. id_Plattform = collision_rectangle(x-3,y-2,x+3,y+2,obj_rund_plattform,true,true);
    3. // In zustand luft wenn kein boden unter den füßen ist
    4. // Gravitation und Reibung ändern, je nachdem ob in der Luft oder auf dem Boden





    im Collisions - Event - obj_rund_plattform

    Quellcode

    1. // Wenn man auf dem Boden ist dass man nach oben laufen kann, aber nur wenn obj_rund_plattform die rectangle berührt
    2. if (global.player_zustand=2)
    3. {
    4. id_collision = collision_rectangle(x-3,y-2,x+3,y+2,obj_rund_plattform,true,true)
    5. if (id_collision == id_Plattform) && (collision_rectangle(x-3,y-2,x+3,y+2,obj_rund_plattform,true,true)>0)
    6. {
    7. y+=-2;
    8. move_contact_all(270,-1);
    9. }
    10. else
    11. {
    12. //y += 2;
    13. exit;
    14. }
    15. }
    Alles anzeigen


    Du kannst das ganz gut verfolgen im Debug-Modus. Gib mal folgendes ein in "Add an expression to watch"
    obj_player.id_collision und obj_player.id_Plattform

    Wenn der Player auf der Plattform ist, bekommst du die ID_Nummer der Instanz.
    Kommst du zum Ende der Plattform geht er kurz hoch und bekommt einen Wert von -4. Das bleibt so lange bis die Kugel wieder vollständig auf der Plattform ist.
    Man könnte jetzt am Ende einfach einen Stopper setzen, so das die Kugel nicht weiter kommt.

    So, hoffe du kommst damit weiter.

    Gruss Drachen :)
  • Ach das ist zwar ein Problem aber nicht unmöglich. Eine Idee dir mir noch so spontan einviel.
    Du überprüfst ob ober deinen Ball eine Kollision entsteht (das checkste während des springen). Wenn diese besteht setzt du eine variable auf true und lässt sie solange auf true bis unter dir eine Kollision entsteht. und wenn diese eine Variable auf true steht kann man durch alle "Bahnen" durch. Ich hoffe du verstehst meine Idee, falls nicht würde ich es nochmal versuchen zu erklären.

    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.
  • Drachen schrieb:

    Du kannst das ganz gut verfolgen im Debug-Modus. Gib mal folgendes ein in "Add an expression to watch"
    obj_player.id_collision und obj_player.id_Plattform

    Wenn der Player auf der Plattform ist, bekommst du die ID_Nummer der Instanz.
    Kommst du zum Ende der Plattform geht er kurz hoch und bekommt einen Wert von -4. Das bleibt so lange bis die Kugel wieder vollständig auf der Plattform ist.
    Man könnte jetzt am Ende einfach einen Stopper setzen, so das die Kugel nicht weiter kommt.

    So, hoffe du kommst damit weiter.

    Gruss Drachen
    Wenn ich das richtig verstanden hab möchtest Du unterscheiden auf welcher Plattform ich mich befinde mit der id. Aber alle Plattformen sind in EINEM Objekt und haben damit dieselbe id, daher funktioniert keine Unterscheidung. Oder hab ich Dich falsch verstanden?

    Rodrog schrieb:

    Ach das ist zwar ein Problem aber nicht unmöglich. Eine Idee dir mir noch so spontan einviel.
    Du überprüfst ob ober deinen Ball eine Kollision entsteht (das checkste während des springen). Wenn diese besteht setzt du eine variable auf true und lässt sie solange auf true bis unter dir eine Kollision entsteht. und wenn diese eine Variable auf true steht kann man durch alle "Bahnen" durch. Ich hoffe du verstehst meine Idee, falls nicht würde ich es nochmal versuchen zu erklären.
    Ich bin mir nicht sicher das Du mein Problem richtig verstanden hast. Mit dem springen hab ich kein Problem.

    Wenn ich mit der Kugel über den Boden "laufe" und dann eine darüberliegende plattform berühre bewegt er sich nach oben. Das soll er aber nicht, er soll die obere Plattform komplett ignorieren und auf der unteren "weiterlaufen"
  • Hi Pascal

    Hast du den Code den schon mal getestet ?
    Ich sorge ja nur dafür das deine Kugel nicht nach oben läuft. Denn wenn deine Kugel zu hoch über der Plattform ist liefert dein collision_rectangle einen nagativen Wert. Und darauf reagiere ich

    Ich Versuche dir zu erklären was die If - Anweisung macht.

    Ich habe ja in dein Step-Event ja ein collision_rectangle eingsetzt damit ich die ID-Nummer bekomme von deiner Instanz.
    Das ist schon einmal Nummer 1. Dann habe ich das auch noch in dein Collision-Event von der Runden Plattform gemacht. Hier erhalte ich die 2. ID-Nummer von der Instanz.

    In der If-Anweissung vergleiche ich Beide ob sie identisch sind und ob die collision_rectangle auch noch grösser 0 ist. Ist im Grunde genommen ein Doppel Vergleich. Aber ich wollte halt auf Nummer sicher gehen. Und nur dann soll er die Anweisung ausführen.
    Und alles was kleiner Null ist soll er sofort den Collisions-Event verlassen mit else - exit.

    So ich hoffe das ich mich verständlich ausgedrückt habe

    Gruss Drachen :)

    Nachtrag:
    Mir kommt da noch eine Idee. Die kann ich aber jetzt nicht Testen im Büro. Das muss warten bis heute Mittag

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

  • Drachen schrieb:

    Hast du den Code den schon mal getestet ?
    Ich sorge ja nur dafür das deine Kugel nicht nach oben läuft. Denn wenn deine Kugel zu hoch über der Plattform ist liefert dein collision_rectangle einen nagativen Wert. Und darauf reagiere ich

    Ich Versuche dir zu erklären was die If - Anweisung macht.

    Ich habe ja in dein Step-Event ja ein collision_rectangle eingsetzt damit ich die ID-Nummer bekomme von deiner Instanz.
    Das ist schon einmal Nummer 1. Dann habe ich das auch noch in dein Collision-Event von der Runden Plattform gemacht. Hier erhalte ich die 2. ID-Nummer von der Instanz.

    In der If-Anweissung vergleiche ich Beide ob sie identisch sind und ob die collision_rectangle auch noch grösser 0 ist. Ist im Grunde genommen ein Doppel Vergleich. Aber ich wollte halt auf Nummer sicher gehen. Und nur dann soll er die Anweisung ausführen.
    Und alles was kleiner Null ist soll er sofort den Collisions-Event verlassen mit else - exit.
    Hab den Code getestet, das funktioniert leider nicht...

    Ich hab aber nun den Grund dafür ausgemacht, dass er sich in Richtung obere Plattform bewegt bei einer Collision mit der oberen Plattform: Es liegt an move_to_contact! Wenn ich das weglasse dann ignoriert er die obere Plattform. Ist ja schonmal was...

    Dazu hab ich zwei Fragen:

    1. Ich habe doch bei move_to_contact als direction "270" angegeben, also nach unten. Wieso bewegt er sich denn dann nach oben?

    2. Welche Alternative gibt es zu "move_to_contact"? Denn wenn ich die Funktion nicht einsetze dann "hoppelt" er immer so unschön über die Plattform
  • Hi Pascal

    Das ist ziemlich einfach erklärt.

    Du hast ja die Variabel global.player_zustand=2 gesetzt und das Collision-Event von obj_rund_plattform reagiert auf dein obj_player und da du den Zustands ja nicht änderst addiert er dir deine y-Wert immer dazu.
    Und somit wanders du immer nach oben.
    Bin schon den ganzen Nachmittag dabei dieses Problem in den Griff zu bekommen. Habe es auch schon geschafft, nur funzt jetzt nicht der Sprung nach oben.
    Bin jetzt immer noch am tüffteln für dieses Problem. Näher mich mit kleinen Schritt auf das Ende dieses Problems.

    Gruss Drachen
  • Drachen schrieb:

    Hi Pascal

    Das ist ziemlich einfach erklärt.

    Du hast ja die Variabel global.player_zustand=2 gesetzt und das Collision-Event von obj_rund_plattform reagiert auf dein obj_player und da du den Zustands ja nicht änderst addiert er dir deine y-Wert immer dazu.
    Und somit wanders du immer nach oben.
    Bin schon den ganzen Nachmittag dabei dieses Problem in den Griff zu bekommen. Habe es auch schon geschafft, nur funzt jetzt nicht der Sprung nach oben.
    Bin jetzt immer noch am tüffteln für dieses Problem. Näher mich mit kleinen Schritt auf das Ende dieses Problems.

    Gruss Drachen
    Danke Drachen, schick mir doch mal bitte die Datei (per PN)!


    Habe aber ein neues Problem ;)
    Hab Dir dazu schon eine PN geschickt, wäre toll wenn Du Dir das auch mal angucken könntest!

    Gruß,
    Pascal