bei collision anhalten

  • GM 8
  • bei collision anhalten

    Hallo!
    Bei collision anhalten - hört sich ersmal einfach an... ich schaffe es aber nicht und die Suchfunktion hat mir auch nicht geholfen...
    Also zu meinem Problem:
    Ich möchte in meinem top down shooter eine Wand machen, die nicht solid ist. Wenn der Spieler gegen diese Wand läuft, soll er anhalten.
    Also dachte ich mir, dass ich bei einer collision mit der Wand den hspeed (bzw vspeed) = 0 setzt... Das hat aber nur geklappt, wenn ich die Wand solid gemacht habe.
    Wie kann ich also bei einer collision mit einer nicht soliden Wand den Spieler anhalten lassen?

    LG Katze :)

    PS: Die Steuerung des Spielers funktioniert folgendermaßen: Es wird geprüft, ob iene Tastenkombination gedrückt wird und dementsprechend wird der speed und die direction bestimmt. (also z.B. "D" & "S" werden gedrückt ; "A" & "W" werden nicht gedrückt, dann wird der speed =8 gesetzt und die direction=45 gesetzt.
    :action_drawsprite: :event_collision: :action_killposition: = :action_health:

    :action_drawsprite: + :action_drawsprite: + :action_drawlivesimage: = :action_drawsprite: :action_drawsprite: :action_drawsprite:

    :action_drawsprite: + :action_color: = :action_spritecolor:

    :action_drawsprite: + :action_wrap: = :action_exit:
  • Also ich weiß nicht was du machst aber wenn ich ein collisions event mit einer wand erstelle und reinschreibe:

    GML-Quellcode

    1. speed=0;


    Funktioniert das bei mir Fabelhaft :)
    miau
    Ich will wie mein Opa im Schlaf sterben, nicht heulend und schreiend wie sein Beifahrer.





    I am a in the GM Quiz! :heul: :vogel:

    :gmlove:

    xD
  • Fragst du Kollision mit dem Collision-Event ab oder imt Step-Event mit place_free(x,y,obj)?
    Falls du mit place_free(x,y,obj) arbeitest dann wirst du da nicht weit kommen, da sich diese Funktion nur auf solide Objekte bezieht.

    MeinTipp: Arbeite mit collision_rectangle(left,top,right,bottom,obj,precise), damit kannst du dann deine Kollision-Rechtecke ziemlich genau einstellen.

    Albert Einstein schrieb:

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
  • also ich arbeite mit einem collisionsevent.

    MeinTipp: Arbeite mit collision_rectangle(left,top,right,bottom,obj,precise), damit kannst du dann deine Kollision-Rechtecke ziemlich genau einstellen.

    Dann muss ich aber zwangsläufig eine rechteckige Mask haben oder?

    Edit und was müsste ich dann bei precise und notome einsetzen?
    :action_drawsprite: :event_collision: :action_killposition: = :action_health:

    :action_drawsprite: + :action_drawsprite: + :action_drawlivesimage: = :action_drawsprite: :action_drawsprite: :action_drawsprite:

    :action_drawsprite: + :action_color: = :action_spritecolor:

    :action_drawsprite: + :action_wrap: = :action_exit:

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

  • In der Hilfe steht dazu:
    collision_point(x,y,obj,prec,notme) Diese Funktion prüft, ob an Punkt (x,y) eine Kollision mit Instanzen des Objektes obj vorliegt.
    collision_rectangle(x1,y1,x2,y2,obj,prec,notme) Diese Funktion prüft, ob eine Kollision zwischen dem (gefüllten) Rechteck mit den angegebenen gegenüberliegenden Ecken und Instanzen des Objektes obj vorliegt. Beispielsweise kannst du sie verwenden, um zu prüfen, ob ein Gebiet frei von Hindernissen ist.
    collision_circle(xc,yc,radius,obj,prec,notme)Diese Funktion prüft, ob eine Kollision zwischen dem (gefüllten) Kreis mit Kreismittelpunkt an Position (xc,yc) mit gegebenem Radius und Instanzen des Objektes obj vorliegt. Beispielsweise kannst du damit überprüfen, ob ein Objekt dicht an einer bestimmten Stelle liegt.
    collision_ellipse(x1,y1,x2,y2,obj,prec,notme) Diese Funktion prüft, ob eine Kollision zwischen der (gefüllten) Ellipse mit den angegebenen gegenüberliegenden Ecken und Instanzen des Objektes obj besteht.
    collision_line(x1,y1,x2,y2,obj,prec,notme) Diese Funktion prüft, ob eine Kollision zwischen dem Liniensegment von (x1,y1) zu (x2,y2) und Instanzen des Objektes obj vorliegt. Dies ist eine mächtige Funktion. Du kannst sie beispielsweise benutzen, um zu prüfen, ob eine Instanz eine andere Instanz "sehen" kann, indem Du prüfst, ob das Liniensegment zwischen den beiden eine Wand schneidet.
    EDIT: Ohps da steht ja auch nix sorry. Ich schau nochmal

    Ah darüber ist es :
    Wenn Bewegungen geplant werden oder aufgrund bestimmter Aktionen entschieden wird, ist es oftmals wichtig zu wissen, ob Kollisionen mit anderen Objekten an bestimmten Stellen/Positionen bestehen. Folgende Funktionen können dafür verwendet werden. All diese haben drei Argumente gemeinsam:
    Das Argument obj kann ein Objekt sein, das Schlüsselwort all, oder die id einer Instanz.
    Das Argument prec gibt an, die Prüfung präzise sein soll oder nur auf der "bounding-box" der Instanz basiert. Präzise Prüfung wird nur ausgeführt, wenn das sprite der Instanz es aktiviert hat.
    Das Argument notme kann auf wahr (true) gesetzt werden, um anzugeben, dass die aufrufende Instanz nicht geprüft wird.
    Alle diese Funktionen geben entweder die id von einer der beiden kollidierenden Instanzen zurück oder sie melden einen negativen Wert, wenn keine Kollision vorliegt.
    Du könntest also collision_rectangle benutzen und prec auf true setzen um die kollision präzise zu überprüfen.
    Wow ich glaub is heut nichso mein Tag :)
    Ich will wie mein Opa im Schlaf sterben, nicht heulend und schreiend wie sein Beifahrer.





    I am a in the GM Quiz! :heul: :vogel:

    :gmlove:

    xD
  • KATZE schrieb:

    Dann muss ich aber zwangsläufig eine rechteckige Mask haben oder?
    Nein musst du nicht. Es wird einfach ein Rechteck erstellt und geprueft ob es eine Kollision mit dem angegebenen Objekt gibt.

    Am besten du laedst deine Projektdatei hoch, dann kann man dir eher weiterhelfen ;)

    MfG Trixt0r

    Albert Einstein schrieb:

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
  • gute Idee so ists eigentlich am unkompliziertesten.
    Also hab mal alle dafür unwichtigen Objekte rausgenommen, damits übersichtlicher wird.
    Ich habe den gml code mit if collision_rectangle ins end step event gepackt
    Dateien
    :action_drawsprite: :event_collision: :action_killposition: = :action_health:

    :action_drawsprite: + :action_drawsprite: + :action_drawlivesimage: = :action_drawsprite: :action_drawsprite: :action_drawsprite:

    :action_drawsprite: + :action_color: = :action_spritecolor:

    :action_drawsprite: + :action_wrap: = :action_exit:
  • Ok, ich hab erstmal fast das Kotzen bekommen als ich das mit dem Drag&Drop Zeug gesehen hab :cursing: .

    Auf jeden Fall hab ich es abgeändert, alles in GML umgeschrieben und deine ganzen Variablen gelöscht. Sodass einigermaßen so funktioniert wie es soll. Dein problem war aber, dass du speed auf 0 gesetzt hast und nicht movespeed (Tipp: wenn du eigene Variablen für den deklarierst, dann nutz sie auch).

    Hier ist die Datei: example.rar

    Albert Einstein schrieb:

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.