Kanten greifen und erklimmen

  • GM 8
  • Kanten greifen und erklimmen

    Soooooooooooooo
    hallo erstmal
    ich bin neu hier kenne mich aber mit game maker schon einigermaßen gut aus.
    ich bin gerade dabei ein metroid spiel zu erstellen, ich habe schon diverse powerups, eine gute lauf engine (mit perfect slope climbing :D) und das klassische metroid ziel-system.
    bei karte und room transitions hab ich schon den plan (examples und tutorials ;) )
    aber beim kanten greifen lässt sich einfach nichts finden und ich selber weiß gar nicht wie ich das machen soll ...
    kann mir da ijemand helfen ?
    danke im vorraus
    ach und ich will demnächst mal eine demo bereitstellen
  • Eine Lösung wäre, dass du im Spiel an jede Kante ein Objekt setzt, z.B.: obj_Kante
    Wenn der Player nun mit diesem Objekt kollidiert, ändert sich das Player-objekt in das
    Objekt obj_hochklettern_rechts, wenn die x koordinate von obj_kante größer ist, als die von Player und
    in obj_hochklettern_links, wenn wenn die x koordinate von obj_kante kleiner ist, als die vom Player.
    Die beiden Kletter-objekte spielen die animtion hochklettern ab, wenn die Animation abgelaufen ist,
    ändert das hochklettern-objekt sich wieder in das Player-objekt.
    Eigentlich ganz einfach. :)
  • danke erstmal.
    die idee an sich ist gut , die umsetzung jedoch etwas schwieriger.
    der player soll die kante ja genau nur an einer stelle greifen können.
    also muss festgestellt werden , dass beide auf der gleichen höhe sind , dass will aber nicht ganz funktionieren.

    Das ist in collision mit kante auf der linken seite

    Quellcode

    1. if keyboard_check(vk_right) //wenn man rechts drückt
    2. {
    3. if y-sprite_yoffset = other.y //und auf gleicher höhe ist / kante ergreifen kann
    4. {
    5. instance_destroy(); instance_create(x,y,obj_kante_erklimmen) //erklimmen
    6. }
    7. }


    doch selbst dieser simpele code funkioniert nicht richtig...
  • Könntest du auch beschreiben was genau daran icht funktioniert??
    funktioniert nur die Prüfung der Kollision nicht oder wie?
    T A C --> wurde heute in T S U umbenannt^^

    Innovatives Combo System
    Eastereggs ohne Ende und
    Eine Menge Blut und Körperteile
  • ja so in der art

    hätte ich das
    if y-sprite_yoffset = other.y
    weggelassen, könnte er auch manchmal luft erklimmen, logisch, wenn die untere seite des sprites die kante berüht.
    ach ja die kannte ist übrigens 1 pixel neben dem block, da sonst keine collision stattfinden könnte.

    Quellcode

    1. if keyboard_check(vk_right) //wenn man rechts drückt
    2. {
    3. if y-sprite_yoffset = other.y //und auf gleicher höhe ist / kante ergreifen kann
    4. {
    5. instance_destroy(); instance_create(x,y,obj_kante_erklimmen) //erklimmen
    6. }
    7. }


    und hier passiert gar nichts.
    dass umschreibt es besser :D
  • leider check ich die funktion sprite_yoffset ma absolut gar ni^^
    wenn ichs vertehen würde könnte ich dir sicher helfen^^

    Peace MP5
    T A C --> wurde heute in T S U umbenannt^^

    Innovatives Combo System
    Eastereggs ohne Ende und
    Eine Menge Blut und Körperteile
  • sprite offset ist der abstand zwischen dem center eines sprites (im sprite editor feslegbar)
    und dem rand des sprites.
    ist dein sprite 32x32 pixel groß und der center in der mitte (16,16) beträgt
    sprite_xoffset = 16 und
    sprite_yoffset = 16.
  • Okay danke wieda was gelernt^^
    ich prob ma den code teil von dir aus-- ich denke das ich dir morgen ne Lösung liefern kann sofern es
    bis dahin kein anderer getan hat^^

    Peace MP5
    T A C --> wurde heute in T S U umbenannt^^

    Innovatives Combo System
    Eastereggs ohne Ende und
    Eine Menge Blut und Körperteile
  • Wie wärs damit?

    Wie wäre es wenn du es so machst, das Hochklettern nur funktioniert, wenn die y-koordinate
    vom player kleiner ist, als die von der kante, aber größer als kante.y + 16 zum Beispiel, ich habe es so
    in einem meiner Spiele gemacht.

    GML code:

    GML-Quellcode

    1. if sprite_yoffset < kante.y && sprite_yoffset > other.y+16
    2. {
    3. instance_change(hochklettern)
    4. }

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Mr. Diesel ()

  • So kann das auch nicht funzen glaub ich.
    Nimm mal anstatt sprite_yoffset einfach y und fertig. Denn sprite_yoffset ist der vertikale Versatz im Sprite und nicht im Room ;).

    MfG.

    Albert Einstein schrieb:

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
  • Ich hab das damals für ein Projekt folgendermaßen gelöst: Auch ich habe den Ansatz verfolgt, das es kleine Objekte gibt, welche als Position für eine Kante dienen. Doch ich habe nicht überprüft ob der Spieler an der Kante hängt, sondern ob ein zusätzliches Objekt, welches den Spieler verfolgt die Kante berührt.



    Das Climb Objekt hat sich, abhängig davon, in welche Richtung sich das Player Objekt bewegt, vor oder hinter besagtes Objekt gestellt.



    Wenn das Climb Objekt das Kanten Objekt berührt (die Logik dafür liegt im Climb Objekt selber), so kann es das Player Objekt richtig Positionieren (so das man Pixelgenau auf der Kante liegt, indem sich das Climb Objekt zuerst die Koordinaten des Kanten Objekts aneignet), und dann dem Player Objekt sagen, das es in einer Status gehen soll in dem es nicht mehr runter fliegt (z.b. das Ändern in ein anderes Spieler Objekt).



    Wichtig ist für diese Losung nur, das das Climb und Kanten Objekt größer als die maximale Gravitation ist, sonst kann es leicht passieren, das der Spieler an einer Kante vorbei fliegt, was leicht zu Frustration führen kann. Diese wiederum führt zu Wut welche zu Hass führt. Und Hass führt zu unsäglichem Leid (so genug Jedi Geschwafel für heute :3 ).
    ...
  • Sry das ich nix meher gepostet hab... hatt seit Gestern abend kein i-net mehr
    aber die idee von Shoba is ja mal richtig gut :thumbup:

    Ich glaub einen besseren Lösungsvorschlag hätt ich nicht bringen könnnen^^

    Peace MP5
    T A C --> wurde heute in T S U umbenannt^^

    Innovatives Combo System
    Eastereggs ohne Ende und
    Eine Menge Blut und Körperteile