Benötige Hilfe mit place_meeting() funktion

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

  • Benötige Hilfe mit place_meeting() funktion

    Hey hier Gamemakermenschen ^^
    ich bin nicht der profi in Gamemaker und verzweifel grade an einer wohl sehr einfachen funktion:
    Für mein Vorhaben habe ich 3 Objekte:
    obj_spieler
    obj_flasche
    obj_boden (solide)

    Die Flasche soll runter fallen (y+=1), sobald sie den boden berührt UND auf der höhe des spielers ist (sprich obj_spieler.y = obj_flasche.y) sol sie nicht mehr weiterfallen (obj_flasche.y += 0). Diese "Physik" wollte ich mit diesem stück code realisieren:

    if place_meeting(x,obj_spieler.y,obj_boden) //wenn obj_flasche.x und auf der höhe von obj_spieler.x den boden berührt... oder?
    {
    y += 0 //dann nicht mehr fallen
    }
    else //oder
    {
    y += 2 //fallen
    }

    Verstehe ich diese place_meeting funktion nicht richtig oder kann ich es einfacher lösen..? entweder die flasche bleibt zu früh stehen oder sie fällt durch mein obj_boden (solid) hinduuuuruch :F
    Wäre cool wenn jemand einen tipp hätte wie ich jez vorgehen könnte oder ob ich eine andere funktion benutzen soll!
    Vielen Dank schonmal vom Gamemakeranfänger Kittixon! :)
    ps: warscheinlich is die lösung so einfach aber ich überseh das total
  • Herzlich Willkommen!!!

    Ich denke du machst vielleicht einen Denkfehler.

    Ich nehme mal an du benutzt diesen Code im Step-Event des "obj_flasche", oder?

    place_meeting liefert jetzt "true" zurück, wenn an der angegebenen Position eine Kollision sein würde (nicht ist).
    place_meeting prüft quasi in die Zukunft. Dein Objekt-Sprite befindet sich aber in der Gegenwart.



    Hier siehst du ein "obj_flasche" was fallen sollte, es aber nicht tut.

    Warum?

    Ganz einfach! Weil an genau dieser angegeben Position eine Kollision ist.

    Auch: place_meeting(x-80,objPlayer.y+40,objSolid) würde bei diesem Beispiel "true" sein.
    Dort wäre eine Instance von "obj_boden" unter dem Spieler. (Prüfung in die Zukunft!)

    ​Noch einfacher gesagt:
    Du prüfst mit : place_meeting(x,obj_spieler.y,obj_boden)​ nur ob an dieser Position eine Instance von "obj_boden" ist.
    ​(Unabhängig davon wo sich dein "obj_flasche" befindet.)

    Verwende also hier lieber die place_free() - Funktion.

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

  • Hallo!
    Danke für die schnellen 2 Antworten :F
    An der Origin des spielers liegt es nicht. die ist zwar in der mitte des spielers habe aber mit obj_spieler.y+10 das ganze ausbalanciert.
    Weihnachtswichtel du hast natürlich völlig recht da habe ich einfach falsch gedacht und die funktion total missverstanden ^^
    Ich guck jetzt das ich eine andere Lösung finde, wenn nicht würde ich mich dann nochmal melden vielleichtwisst ihr ja einen besseren lösungsweg: werde mich aber erstmal morgen ausgiebig mit place_free() beschäftigen
    Also vielen Dank für die Antworten haben mir sehr geholfen :D
    LG Kittixon
  • Hallo, willkommen im Forum :)

    place_free würde gegen place_meeting kaum etwas ausmachen.
    Du solltest ein and bzw. ein && dafür benutzen. In meiner Signatur findest dazu ein Tutorial vom mir.

    GML-Quellcode

    1. if (y == obj_spieler.y
    2. && !place_free(x, y+2)) //wenn der Platz unter mir nicht frei ist
    3. //mach was

    Dieser Code funktioniert aber nicht so gut, da es sein kann, dass bspw. die Spieler-Koordinate ungerade und die der Flasche gerade ist und bei dem Speed von 2 y nie gleich SpielerY sein kann.
    Besser ist es die Differenz von zwei Werten zu nutzen:

    GML-Quellcode

    1. if (abs(y - obj_spieler.y) < 2 //wenn die Differenz zwischen y und spieler.y kleiner als 2 ist
    2. && !place_free(x, y+2)) //wenn der Platz unter mir nicht frei ist
    3. //mach was

    Die Funktion abs(x) macht nur negative Werte positiv. Ich benutze das, da bei der Differenz sonst auch ein negativer Wert herauskommen könnte.
    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
  • heyhoo husi012
    Vielen Dank es läuft perfekt so wie ich es wollte ! Sobald ich den Spieler bewege und seine y- koordinaten geändert werden fällt die flasche zwar weiter durch den boden, habe dieses problem aber sogar selber gelöst (sehr stolz auf mich btw.) :D
    Vielen Dank, wäre nichtmal ansatzweise auf die idee gekommen so eine differenz einzubauen, die obere funktion mit dem && habe ich tatsächlich schon vor dem post hier ausprobiert gehabt, doch wie du hervorgesagt hast hat diese dann nicht funktioniert!
    LG von Kittxon der jetzt freudig seine flasche auf den boden werfen kann ^^