Place meeting Abfrage

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

  • Place meeting Abfrage

    Habe eine kleiner Frage zu place meeting oder ev. sogar zu den x,y Koordinaten.
    Ich mache folgende Abfrage:
    if place_meeting(x,y,obj_solid) // x,y ist hierbei der Spieler

    Soweit so gut, aber wenn ich die Abfrage etwas früher habe möchte z.B. if place_meeting(x,y-20,obj_solid), verschiebt es mir den Spieler einfach um den Wert (20) auf seiner Y Achse. Ich kann mir denken das es etwas damit zu tun hat das die x und y Variablen von GMS vorgegeben sind aber verstehe nicht ganz warum es bei einer if Abfrage den Wert verändert? Ich möchte doch lediglich abfragen ob der Spieler das Objekt berührt mit etwas Luft nach oben.
  • War mir da lange auch sehr unsicher. Die Hilfe schafft Abhilfe:

    Die Funktion checkt, ob das Sprite der Instanz an der Position x,y das Objekt obj berührt. Ganz egal, an welcher Position die Instanz eigentlich ist.
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Soweit wäre es mir auch noch logisch. Im Beispiel wird ja auch x-5 verwendet. Nun verwende ich aber einfach nur die abfrage ohne = für meine Animationen. Nun passiert es wenn ich den Wert Y auf z.B. Y+20 stelle, mein Spieler im Boden versinkt. Ich kann mir schon vorstellen dass das Sprite einfach tiefer gedrawt wird, aber wieso?

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

  • Hallo Jomnitech,

    du must irgend etwas falsch machen.

    Bei einer if-Abfrage wird niemals die Variable bei einem Vergleich verändert.

    Diese Abfrage: if place_meeting(x,y-20,obj_solid){...} verschiebt niemals die Position.
    Deine Aussage ist für mich in keinem Event reproduzierbar.

    Für einen Vergleich muss man bei einer if-Abfrage das Doppel-Gleich (==) schreiben, den ein einfaches Gleichheitszeichen (=) bedeutet eine Zuweisung.

    Ich vermute deinen Fehler an einer ganz anderen Stelle, aber "place_meeting" sollte dir in keiner Weise deine Koordinate/Variable verändern.


    In welchem Event und unter welchen Voraussetzungen verwendest du den diese if-Abfrage ?

    Ein bisschen mehr Code wäre hilfreich.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Weihnachtswichtel ()

  • @Weihnachtswichtel
    Danke für deine Antwort. Ist eben das was ich mir auch denke und deswegen verwirrt bin.
    Code ist wie folgt:

    Animation Update:
    Spoiler anzeigen

    GML-Quellcode

    1. ///Animation Movement
    2. //----------------------------- Walk -----------------------\\
    3. if place_meeting(x,y,obj_solid)
    4. {
    5. midair = "false"
    6. if hspd > 1
    7. {
    8. if x <= obj_crosshair_p1_circle.x
    9. {
    10. if skeleton_animation_get() != "Walk"
    11. {
    12. skeleton_animation_set("Walk")
    13. }
    14. }
    15. else
    16. {
    17. if skeleton_animation_get() != "Walk_backward"
    18. {
    19. skeleton_animation_set("Walk_backward")
    20. }
    21. }
    22. }
    23. if hspd < -1
    24. {
    25. if x <= obj_crosshair_p1_circle.x
    26. {
    27. if skeleton_animation_get() != "Walk_backward"
    28. {
    29. skeleton_animation_set("Walk_backward")
    30. }
    31. }
    32. else
    33. {
    34. if skeleton_animation_get() != "Walk"
    35. {
    36. skeleton_animation_set("Walk")
    37. }
    38. }
    39. }
    40. if abs(hspd) <= 2
    41. {
    42. if skeleton_animation_get() != "Idle"
    43. {
    44. skeleton_animation_set("Idle")
    45. }
    46. }
    47. }
    48. //--------------------------- Jump ---------------------------\\
    49. if (jkey)
    50. {
    51. skeleton_animation_set("Jump")
    52. }
    Alles anzeigen


    Wenn ich jetzt bei der if place_meeting(x,y,obj_solid) Abfrage den Wert y auf y-20 setze, schwebt der Char über dem Boden, wenn ich den Wert auf y+20 setze, steht er im Boden (steckt aber nicht fest oder so).
  • OK!!!

    Teste jetzt mal folgendes:

    Dein Code wird im Event "Animation Update" ausgeführt ? (Dieses Event ist ja "Skeleton"-vorbehalten.)

    So: Entferne mal den Code innerhalb der Klammern (der if-Bedingung ). Teste jetzt mal ob bei "if place_meeting(x,y-20,obj_solid){...} " immer noch eine Verschiebung stattfindet.

    Wenn ja, dann haben wir wahrscheinlich einen Bug entdeckt. Sollte nichts passieren wird wohl hier die if-Bedingung ausgeführt und deren Inhalt nimmt Einfluss auf die Darstellung.
  • So jetzt steht da nur noch folgendes im Animation Update Event:

    GML-Quellcode

    1. if place_meeting(x,y+20,obj_solid)
    2. {}


    Effekt ist der gleiche, Männchen versinkt im Boden, also ein Bug? Yay, als ob ich mir nicht schon schwer genug tun würde X/ .
    Also falls das nicht so sein soll, werde ich mal meldung machen, danke für deine Hilfe.
  • Ok !

    Das ist tatsächlich ein unschöner Bug von Gamemaker.

    ​Ich denke hierbei tritt irgendwo intern ein Float vs Integer - Problem bei Gamemaker auf.

    Den ich habe mir nochmal die Hilfe zur "place_meeting" - Funktion von Gamemaker genauer durchgelesen.

    Da steht ja tatsächlich unter der Abbildung:

    ​Note that the given x/y coordinates will be floored to the nearest integer before the check is performed.


    Beachten Sie, dass die angegebenen X / y-Koordinaten auf die nächste Ganzzahl gerundet werden, bevor die Überprüfung durchgeführt wird.
  • Schreib doch einfach zum Beispiel:

    if (obj_solid.x == x and obj_solid.y == y+20) //Das ist aber nicht ganz Äquivalent der place_meeting - Funktion

    -> place_meeting scheint hier fehlerhaft zu sein.

    Anbei ist das vielleicht doch kein richtiger Bug, den ich habe nochmal die Hilfe genau durchgelesen.

    Da steht ja auch noch:
    When you use this you are effectively asking GameMaker: Studio to move the instance to the new position, check for a collision, move back and tell you if a collision was found or not.


    Das könnte eine Erklärung sein, da das Animation-Update-Event wohl mit der place_meeting Funktion in Konflikt tritt.
    (Hier ist der Bug wohl das "über-triggern" der move_back Prozedur.)

    Zitat von Husi012:
    Die Funktion checkt, ob das Sprite der Instanz an der Position x,y das Objekt obj berührt. Ganz egal, an welcher Position die Instanz eigentlich ist.


    Die Funktion verschiebt die Koordinaten zur angegebenen Position und Überprüft ob dort eine Kollision vorhanden ist.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von Weihnachtswichtel ()