TopDown Collision

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

  • TopDown Collision

    Hallo.

    Folgendes Problem.
    Ich arbeite an einem TopDown Game, bei dem sich u. a. auch der view_angle ändern kann.
    Um immer in die richtige Richtung vom Spieler aus gesehen zu gehen, benutze ich folgenden Code für die Bewegung:

    GML-Quellcode

    1. // Move normal even if view_angle is changed
    2. if (keyboard_check(vk_left)){
    3. x -= lengthdir_x(move, view_angle);
    4. y += lengthdir_x(move, view_angle + 90);
    5. }
    6. if (keyboard_check(vk_right)){
    7. x += lengthdir_x(move, view_angle);
    8. y -= lengthdir_x(move, view_angle + 90);
    9. }
    10. if (keyboard_check(vk_up)){
    11. x += lengthdir_x(move, view_angle - 90);
    12. y -= lengthdir_x(move, view_angle);
    13. }
    14. if (keyboard_check(vk_down)){
    15. x -= lengthdir_x(move, view_angle - 90);
    16. y += lengthdir_x(move, view_angle);
    17. }
    Alles anzeigen


    Jetzt kommt der tricky Part, der schon beim allereinfachstem scheitert.
    Ich möchte über einen collision_circle erstmal nur checken, ob eine Kollision vorliegt:

    GML-Quellcode

    1. /// Collision
    2. if (collision_circle(x, y, 15, obFlatBuilding, true, true)){
    3. image_alpha = 0.5;
    4. } else {
    5. image_alpha = 1;
    6. }


    Das ganze klappt wunderbar, wenn ich bei meinem obFlatBuilding nicht die direction ändere.
    Allerdings hat dieses Gebäude immer eine zuäfllige Direction, und dann wird auch sowas wie auf dem BIld schon als Kollision erkannt.

    Jemand nen Ansatz woran das liegen kann?

    Gruß,
    Shari
    Bilder
    • Bild.jpg

      388,32 kB, 1.366×768, 410 mal angesehen
    Dieser Beitrag wurde bereits 1909 mal editiert, zuletzt von »Sharivari« (Morgen, 19:89)
  • Kann es sein, dass du das Gebäude im DrawGui zeichnest?


    Dieser Beitrag wurde bereits 1909 mal editiert, zuletzt von »Sharivari« (Morgen, 19:89)

    Duu... Signatur stehler :P . Die hatte ich auch mal
    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
  • No, ganz normales Draw Event.
    Verstehs nicht so ganz. Normal unterstützt der GM doch solche Direction Änderungen, oder muss ich das alles manuell berechnen?


    Hm.. das muss aber dann schon laaange her sein :D
    Dieser Beitrag wurde bereits 1909 mal editiert, zuletzt von »Sharivari« (Morgen, 19:89)
  • Hast du den image_angle, an die direction angepasst? Weil eigtl dreht er die collision mask immer mit der direction mit, aber vielleicht ist dein image_angle genau anders rum zB (wenn es um physics geht zB).

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Hab ich auch:

    image_angle = direction

    Dürfte doch dann eigentlich nicht falsch rum sein.
    Ich kann mir echt nicht erklären was ich falsch gemacht hab.
    Dieser Beitrag wurde bereits 1909 mal editiert, zuletzt von »Sharivari« (Morgen, 19:89)
  • Jepp, Origin ist zentriert.

    Habe zu Testzwecken einfach ein Objekt mit dem Haus-Sprite erstellt, im Create Event

    GML-Quellcode

    1. direction = random(360);
    2. image_angle = direction;


    eingefügt, und den Collisions-Code auf das Objekt angewendet.
    Gleiches Problem.
    Dieser Beitrag wurde bereits 1909 mal editiert, zuletzt von »Sharivari« (Morgen, 19:89)
  • Ja genau.
    Aber zusätzlich erkennt er auch die Kollision mit dem gedrehtem Gebäude, denn wenn ich dann unter dem Gebäude lang geh wo bei direction 0 eigentlich nichts ist erkennt er es.

    Ich glaube, er erkennt alles innerhalb dieses Kastens als Kollision.
    Irgendeine Einstellungssache?

    Prec ist auf true gesetzt.


    Edit: Tatsächlich, beim Sprite-Editor war der Haken bei "Precise Collision Checking" nicht gesetzt.
    Danke für eure Hilfe :)

    Jetzt aber zur eigentlichen Frage. Hat jemand vielleicht ein fertiges Script für schöne Collisionen? Dass man praktisch an den Wänden entlanggleitet, wenn man versucht durchzzgehen.

    Hatte das in meinem alten spiel so drin, da hab ich allerdings mit hspeed und vspeed gearbeitet, jetzt nutze ich aber die x und y Koordinate zum ändern der Position.

    Gruß,
    Shari
    Bilder
    • test2.jpg

      404,38 kB, 1.366×768, 273 mal angesehen
    Dieser Beitrag wurde bereits 1909 mal editiert, zuletzt von »Sharivari« (Morgen, 19:89)

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

  • Falls jemand irgendwann das gleiche Problem hat, habe eine zufriedenstellende Kollisionsabwicklung mit folgendem Code realisiert:

    GML-Quellcode

    1. /// Collision
    2. var m = 1;
    3. var n = radius;
    4. // Left Side Collided
    5. while (collision_point(x - lengthdir_x(n, view_angle), y + lengthdir_x(n, view_angle + 90), obSolid, true, true)){
    6. x += lengthdir_x(m, view_angle);
    7. y -= lengthdir_x(m, view_angle + 90);
    8. }
    9. // Right Side Collided
    10. while (collision_point(x + lengthdir_x(n, view_angle), y - lengthdir_x(n, view_angle + 90), obSolid, true, true)){
    11. x -= lengthdir_x(m, view_angle);
    12. y += lengthdir_x(m, view_angle + 90);
    13. }
    14. // Top Side Collided
    15. while (collision_point(x + lengthdir_x(n, view_angle - 90), y - lengthdir_x(n, view_angle), obSolid, true, true)){
    16. x -= lengthdir_x(m, view_angle - 90);
    17. y += lengthdir_x(m, view_angle);
    18. }
    19. // Bottom Side Collided
    20. while (collision_point(x - lengthdir_x(n, view_angle - 90), y + lengthdir_x(n, view_angle), obSolid, true, true)){
    21. x += lengthdir_x(m, view_angle - 90);
    22. y -= lengthdir_x(m, view_angle);
    23. }
    Alles anzeigen
    Dieser Beitrag wurde bereits 1909 mal editiert, zuletzt von »Sharivari« (Morgen, 19:89)
  • Ahja, bei dir dreht sich ja die view mit! Wie hast du den deine 3D Kamera gemacht? Denn dann kann es sein (wie wenn man physics) benutzt, das sich einge Dinge im Uhrzeigersinn statt gegen den Uhrzeigersinn drehen. Wenn das so ist, kannst du nämlich wieder einen einfacheren collisioncode verwenden.

    Dh die Kollsionen würden nur dann richtig funktionieren, wenn du mit den d3d funktionen des GM arbeitest in der Kamera und in den Objects. d3d_transform etc auch wenn du nur 2D sprites zeichnen lässt.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Also, das 3D-Zeug ist alles nur Pseudo 3D. Die Häuser und Kisten haben eine Deckfläche, das ist auch gleichzeitig die BoundingBox. Dann gibt es vier Außenwände, deren 4 Eckpunkte anhand von KameraPosition und ObjektPosition errechnet werden. Dann zeichne ich das Sprite mit draw_sprite_pos eben genau auf diese 4 Punkte verzerrt.
    Mit den d3d Funktionen hab ich mich leider noch nie beschäftigt.

    Eigentlich klappt das auch wunderbar alles, nur ich habe noch ein kleines Problem:

    Alles rot markierte stellt ein solides Objekt, mit dem Kollidiert werden kann dar.
    Nur ist es jetzt ein bisschen blöd, dass die Außenflächen der "3D" Objekte nur gedrawed sind, und ich damit keine Kollisionsabfrage erstellen kann.

    Hast du vielleicht eine Idee? Kann man die 4 Eckpunkte der Bounding-Box eines Objekts selbst festlegen? Dann wärs wieder einfach zu lösen.

    Gruß,
    Shari
    Bilder
    • wandBsp.jpg

      419,43 kB, 1.366×768, 250 mal angesehen
    Dieser Beitrag wurde bereits 1909 mal editiert, zuletzt von »Sharivari« (Morgen, 19:89)
  • Dann dreh die Objekte doch um, momentan kollidierst du mit dem "Dach" anstatt dem Boden, lass das eigentliche sprite nicht drawen, sondern draw nur die Wände nach oben und das Dach und dann ist die Kollision wieder richtig. Momentan zeichnest du die Wände ja tiefentechnisch gesehen in den Bildschirm hinein, statt heraus. :) und solange deine Kollisionsmethode die du jetzt gefunden hast, nicht performance frisst, kannst du auf die echten 3d funktionen verzichten.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Das Problem ist aber, dass ich die Wände doch nur drawe, und mit gezeichneten Sprites kann man doch keine Kollisionsabfrage machen, nur mit Objekten und deren sprite?

    Ich kann die Wände nicht als Objekt erzeugen, da ich kein festes Sprite hab dass einfach nur den image_scale ändert, sondern es wird komplett verzerrt dargestellt.

    Man müsste die BoundingBox einfach über 4 Punkte die miteinander verbunden sind festlegen können, aber soweit ich weiß gibt es sowas in GM:S nicht, oder?
    Dieser Beitrag wurde bereits 1909 mal editiert, zuletzt von »Sharivari« (Morgen, 19:89)
  • Ich arbeite da immer mit

    GML-Quellcode

    1. d3d_set_projection_ortho(0,0,view_wview,view_hview,angle);


    Sowas was du ansprichst hab ich schon geschrieben. Damals hab ich shadowcaster und collision vereint. Die Eckpunkte werden als relatrive Koordinaten in zwei listen gespeichert, dann einmal mit trianglestrip die Schatten gemalt und durch Berechnung der Normalen der nahsten Seite (collisionline) kann man den Spieler entgegengesetzt des Objektmittelpunkts (nach aussen) bewegen
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:

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

  • Rhazul´s Ansatz klingt auch interessant, aber was ich meine ist:
    Du musst die Wände in die andere Richtung zeichnen lassen, du gehst momentan vom Dach aus, mit dem du ja auhc fälschlicherweise kollidierst und zeichnest die Wände nach unten in den Boden. Du muss die Wände andersrum hinaufzeichnen und dann ein versetztes (je nach schräge der Wände) Dach drauf.


    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Ahh jetzt. Ja klar, dann kollidiert er mit der Grundfläche am Boden, klingt nach einer guten Lösung :) Danke.

    Edit:
    So, jetzt wars dann doch weniger als ich gedacht hatte. Hab ja das Object selbst immer als Dachfläche gehabt wie du schon sagtest. Nun lass ich die x und y Koordinate unverändert, sondern nenne die Veränderten nun xx und yy, lass das dann so drawen und das wars schon.

    Vielen Dank nochmal für deine / eure Hilfe :)

    Gruß,
    Shari
    Dieser Beitrag wurde bereits 1909 mal editiert, zuletzt von »Sharivari« (Morgen, 19:89)

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