Entlang einer Seite laufen

  • GM 8

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

  • Entlang einer Seite laufen

    Hallo Leute!
    Wiedereinmal ein kleines Problem dessen Lösunsansatz mir fehlt.
    Ich habe ein bjekt dass sich mit einer geschwindichkeit (speed) in eine gewisse richtung (direction) bewegt. (bewegung erfolgt mit "motion_add(), ist aber unwichtig".
    Nun, ich habe da ein Problem, wie sich der Spieler verhalten soll wenn er gegen die "Wand" fährt.
    Wenn ein Spieler gegen die Seite eines Rechtecks läuft, soll er sich in die jeweilige richtung der Seite entlang weiterbewegen.



    Ich habe das bis dato eher unelegnant gelöst, indem ich den Spieler im Falle solch einer Kolission immer aus der wand rausschob. Funktioniert zwar auch, führt aber in anderen Bereichen zu kleineren Bugs...

    Kann man irgendwie berechnen inwieweit sich die geschwindichkeit auf der x und y Achse verändert wenn der Spieler gegen die wand "läuft"?
    im Rechten bild sieht man das insbesonders gut. Der Spieler bewegt sich auf der X-achse nach linksauf das Objekt. Jedoch beim Aufprall, ändert sich die bewegung der x-achse nach rechts. (und das noch in einem anderen Winkel.)

    Wie genau kann man diese veränderung berechnen? Es geht mir nicht um einen vorgegaukelten Script, sondern um einen einfachen Ansatz zum mitdenken. ^^
  • Da es dieses Thema schon einige Male gab, will ich erstmal einfach auf ein paar andere Threads verweisen. Vielleicht reicht dir das ja schon.
    (Diese findet man übrigens auch unter dem Suchbegriff "entlanggleiten".)
  • Sorry dass ich so lange nicht geantwortet habe. X.X

    @ Bl@ckSp@rk:
    Die ganzen Topics sind ja schön udn gut, aber das Problem ist dass dort der Spieler einfach aus der "Wand" rausgeschoben wird.
    Was ich habe ist eine "direction" und eine geschwindichkeit (speed) mit der sich der Spieler fortbewegt.
    Was ich nun möchte, ist dass sich die richtung (Direction) bzw der Vektor, an die jeweilige Wand anpasst (wie im ersten Post an dem Bild zu sehen ist)
    Sprich: Die direction ändert sich so, dass der Spieler nun an der Wand entlangläuft.


    @luky300:
    Die funktionen sind mir ducrchaus bekannt. Die Frage hier ist eher, wie ich den neuen Vektor berechnen kann der je nach einfallswinkel des Spielers die jeweilige Route entlang des Blocks wählt.

    Ich bin leider kein guter Mathematiker. X(
  • Was ich nicht so ganz verstehe ist wie du diese rotierten Blöcke realisiert hast. Sind das einfach instanzen die durch image_angle bzw. direction gedreht wurden?
    Wieso nimmst du dann nicht einafch diese variablen?
    Denn bei einem Rechteck haben die Seiten ja den selben Winkel wie die "richtung" des Rechtecks. Die anderen beiden Seiten sind dann entsprechend um 90° versetzt.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Die objekte haben schon eine drehung, mitsamt einem Sprite das auf länge udn breite hinskaliert wurde. Theorethis könnte ich die Richtung von dem Objekt abfragen.
    Das Problem ist blos, dass ic hwissen muss:
    A. von welcher Seite der Spieler auf das jeweilige Objekt "zugeht" und
    B. was der einfallwinkel des Spielers ist.

    Je nach einfallwinkel kann nähmlich der Vektor auch in die entgegengesetzte richtung schauen.
  • Achso..
    Dafür ist dann schon etwas Mathematik gefragt. Zuallererst kannst du ja die Richtung in der der Spieler auf die Wand zu fliegt durch point_direction bestimmt. Ohne example kann ich mir im Moment leider nicht ausdenken wie man dann den Einfalls-Winkel auf die Fläche berechnen kann...
    Wäre aber hilfreich wenn du ein kurzes example hochladen könntest wo man das austesten kann.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)

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

  • Mathematisch gesehen ist dies eigentlich ziemlich simpel zu lösen:

    Zuerst bestimmst jene Linie der Kandidaten AB, BC, CD und DA auf welcher der Punkt (also der Player) kollidiert.
    Folgendes Skript sollte dir dabei helfen:

    GML-Quellcode

    1. // point_line_collision(x1, y1, x2, y2, x3, y3)
    2. return (x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1);


    Es gibt einen negativen Wert zurück, falls der Punkt (x3|y3) links von einer Geraden liegt, einen positiven wenn er rechts davon liegt und 0, wenn er direkt auf ihr liegt.
    Nun einfach durch die Differenz der Rotation des Spielers und die der zutreffenden Linie den nächsten "Ausweichpunkt" berechnen.
  • Ich hab dir mal was gebastelt. Die Kollision wird im Wesentlichen in zwei Schritten behandelt. Das Script scr_collision_rectangle prüft, ob zwischen Spieler und Rechteck eine Kollision besteht und berechnet gegebenenfalls den kürzesten Vektor, mit dem sich der Spieler aus dem Rechteck herausbewegen lässt. Dieser Vektor wird dann im zweiten Script scr_collision_resolve verwendet, um den Spieler aus der Kollision zu bewegen und anschließend seine Geschwindigkeit anzupassen. Wie ich dich verstanden habe, ist Letzteres das was dich interessiert. Vom Prinzip her wird dazu einfach ein Teil des von scr_collision_rectangle berechneten Vektors zum Geschwindigkeitsvektor vom Spieler addiert.
    Dateien
    • example.rar

      (11,18 kB, 204 mal heruntergeladen, zuletzt: )
  • Bl@ckSp@rk schrieb:

    Ich hab dir mal was gebastelt. Die Kollision wird im Wesentlichen in zwei Schritten behandelt. Das Script scr_collision_rectangle prüft, ob zwischen Spieler und Rechteck eine Kollision besteht und berechnet gegebenenfalls den kürzesten Vektor, mit dem sich der Spieler aus dem Rechteck herausbewegen lässt. Dieser Vektor wird dann im zweiten Script scr_collision_resolve verwendet, um den Spieler aus der Kollision zu bewegen und anschließend seine Geschwindigkeit anzupassen. Wie ich dich verstanden habe, ist Letzteres das was dich interessiert. Vom Prinzip her wird dazu einfach ein Teil des von scr_collision_rectangle berechneten Vektors zum Geschwindigkeitsvektor vom Spieler addiert.

    Wirklich beindruckend! Du solltest das vieleicht in Form eine kleines Tutorials posten denn das ist wirklich nützlich. Mit wenigen Änderungen könnte man daraus auch eine ziemlich gute Platform Engine machen wenn ich das richtig sehe.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Benutzer online 1

    1 Besucher