Problem mit room height und room width Kollision

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

  • Problem mit room height und room width Kollision

    Hallo zusammen ich brauche noch mal eure tolle Hilfe.

    Und zwar arbeite ich gerade an einer Kollision abfrage für den Spieler das er den Raum nicht überschreitet kann.
    Bis jetzt klappt leider nur das der Spiel nicht nach unten und nach Recht über die Raum Größe gehen kann.
    Nach Links und oben geht er jedoch über die Raum Größe hinaus noch.

    GML-Quellcode

    1. if x > room_width
    2. { x = room_width
    3. }else if y > room_height
    4. {
    5. y = room_height
    6. }


    Zwar weiß ich jetzt was ich coden soll wenn ich sage was er tun soll wen x größer als Raum ist aber nicht ,was wenn Raum unterhalb der Raum Größe liegt also in den Minus Koordinaten
    X -0 und y -0 Koordinaten

    Hab schon das ein und andere getestet z.b x < 0 zu ersetzten und dann zu sagen x = 0 zum Beispiel.
    Das Ergebnis ist eher miss als recht auch wenn ich dadurch was anderes gelernt habe nur leider nicht das was ich gerne wollte.

    Hat da jemand vielleicht eine Lösung der dies mit mir teilen könnte.
    Dank voraus
  • Hallo! :)

    Pack in dein Step-Event noch folgenden Code, das wäre am einfachsten.

    GML-Quellcode

    1. x = clamp(x, 0, room_width - sprite_width);
    2. y = clamp(y, 0, room_height - sprite_height);


    Clamp() ist eine funktion mit der du einen Wert limitieren kannst. Die Funktion nimmt als ersten Parameter eine Variable an, die man limitieren möchte. Das ist im ersten Fall die Variable "x". Dann kann man einen Mindestwert als zweiten Parameter angeben. Das ist im ersten Fall die 0, da man unter die Nullgrenze nicht kommen soll als Player, weil man den Raum ja dann verlassen würde. Als dritten Parameter gibt man dann noch den Maximalwert ein. Das ist im ersten Fall die Variable "room_width", denn über diese soll man ja nicht kommen. Ich ziehe im gezeigten Code von der "room_width" noch die "sprite_width" ab, damit man das Objekt auch zu jeder Zeit noch sehen kann im Raum. Das kommt halt ganz drauf an, wie du den Origin bei deinem Sprite gesetzt hast. Den "geclampten" Wert der von der Funktion zurückgegeben wird schreibe ich dann in die Variable "x" wieder rein.

    Wie funktioniert das also grundlegend? Man gibt der "clamp()-Funktion" einen Wert der geprüft werden soll. Dann schreibt man einen Min- und einen Max-Wert rein. Wenn der zu prüfende Wert über dem Max-Wert liegt, wird er auf den Max-Wert gesetzt, wenn er unter dem Min-Wert liegt wird er auf den Min-Wert gesetzt. Wenn er zwischen diesen beiden Werten liegt, dann bleibt der Wert unverändert.

    Gruß
    Sorm
  • Und weil es wie im Leben, immer mehrere Wege gibt, um ans Ziel zu kommen,
    sieh Dir noch die folgenden Befehle an:

    Quellcode

    1. x = max(x, 0); / Geht nicht Links raus
    2. x = min(x, room_width); / Geht nicht Rechts raus
    Min nimmt immer den kleinsten Wert, der übergebenen Variablen und
    Max nimmt immer den größten Wert, der übergebenen Variablen.

    Und so weit ich weiß, gibt es da auch kein Limit an Werten, die Funktion wird einfach
    nur immer langsamer.


    Miradur
  • Xumma schrieb:

    Hab schon das ein und andere getestet z.b x < 0 zu ersetzten und dann zu sagen x = 0 zum Beispiel.
    Das Ergebnis ist eher miss als recht auch wenn ich dadurch was anderes gelernt habe nur leider nicht das was ich gerne wollte.
    ich nehme an, dass dein origin vom sprite nicht in der Mitte ist?
    die x und y koordinate ist ja standardmäßig in der linken oberen Ecke deines Sprites. Wenn du jetzt nur innerhalb 0 und room_width checkst, dann bleibt dein sprite einmal an der kante und einmal außerhalb des rooms stehen.
    Wenn du im sprite editor den origin auf center stellst, dann sollte das Sprite immer zur Hälfte über den Rand kommen und danach stoppen.

    Wenn dein sprite 32x32 px groß ist und der origin gecentered ist, dann musst du mit 16px rand rechnen.

    GML-Quellcode

    1. if x-16 < 0 {
    2. x = 16
    3. }
    4. if x+16 > room_width{
    5. x = room_width-16
    6. }
    7. //oder
    8. x = clamp(x, 16, room_width-16);
    9. //bzw
    10. x = max(16, min(x, room_width-16));
    Alles anzeigen

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Es gibt auch noch eine andere Möglichkeit;-)
    Man könnte auch "Platzhalter" integrieren. Also unsichtbare objecte die als "solid" deklariert werden sollten.
    Bei Berührung mit "deren" wird die "Figur" umgekehrt / prallt ab usw. (Collision Event).
    Dabei gibt es viel weniger zu coden;-) (Für den Anfang)
    Was ich auch wichtig finde, ist der der Tipp von Aku_Ryou (oben)...
  • @Xumma, nette Idee, mir eine Email zu schreiben, aber wenn Du Deine Probleme hier
    ansprichst, wird Dir erstens schneller und zweitens, wesentlich professioneller geholfen :)

    Außerdem sollen ja viele Menschen davon profitieren, wenn man Probleme anspricht und
    mitunter sogar gemeinsam löst.

    Hier also mein Lösungsansatz, als kleines Programm, damit es für Dich verständlicher wird,
    vielleicht sind ja die Anderen ebenfalls so freundlich, und vermitteln Dir ihre Lösungen, als
    kleinen, ausführbaren, Codeblock.

    Quellcode

    1. /// @description Init Variablen
    2. // Create-Event
    3. player_speed = 4



    Quellcode

    1. /// @description Player Movement
    2. // Step-Event
    3. if (keyboard_check(vk_left)) {
    4. x -= player_speed
    5. x = max(x, 0)
    6. }
    7. if (keyboard_check(vk_right)) {
    8. x += player_speed
    9. x = min(x, room_width - sprite_width)
    10. }
    11. if (keyboard_check(vk_up)) {
    12. y -= player_speed
    13. y = max(y, 0)
    14. }
    15. if (keyboard_check(vk_down)) {
    16. y += player_speed
    17. y = min(y, room_height - sprite_height)
    18. }
    Alles anzeigen

    Erstelle Dir ein Sprite 32x32 und setze den Hotspot auf Links/Oben. Erstelle ein Objekt, mit diesem Sprite
    und ziehe dieses Objekt in den Standard-Raum, der die Abmessungen 800x600 hat(wobei die Größe ziemlich
    egal ist, da wir mit room_width und room_height arbeiten).
    Wenn Du das Programm nun startest, dann kannst Du den "Player", mit den Pfeiltasten, in alle Richtungen
    bewegen, den Raum verlassen, kannst Du allerdings nicht.


    Miradur