Draw_line_width, wenn die Zielkoordinaten nicht bekannt sind?

  • GM 8

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

  • Draw_line_width, wenn die Zielkoordinaten nicht bekannt sind?

    Hallo, mein Problem ist folgendes:

    in meinem Spiel düst ein Laserstrahl über das Spielfeld und räumt alles weg, was ihm in Weg ist. Der Laserstrahl wird erzeugt mit "draw_line_width". Bei diesem Befehl müssen die Anfangs- und die Zielkoordinaten eingegeben werden. Mein Problem ist, dass ich nicht weiß, wie ich das bei diagonalen Linien machen soll.

    Wenn der Schuss z.B. nach oben, unten, rechts oder links geht, kann ich den Spielfeldrand als Zielkoordinaten eingeben. Was aber, wenn der Schuss diagonal geht? Leider kann ich bei draw_line ja keine direction verwenden, diese wäre bekannt, aber das nutzt mit ja nichts. Da die Laserkanone auch noch ständig ihren Platz wechselt, habe ich jetzt das Problem, dass ich bei Schüssen der direction 45 oder 225 oder ähnliches nicht sagen kann, wie die Linie verlaufen soll, weil die Zielkoordinaten nicht bekannt sind...
    Wie kann ich das ermitteln? Spontan fällt mir erst mal der Satz des Pythagoras dazu ein, aber jetzt weiß ich nicht wirklich, wie man den hierbei anwenden könnte. Oder habe ich jetzt irgendwas übersehen??

    Kann mir bitte jemand dabei helfen? Zur Info: das Spielfeld (nicht das Fenster!) ist 600 x 500 Pixel breit/hoch, die einzelnen Elemente sind jeweils 40 Pixel.

    Danke schon mal im voraus für evtl. Antworten,
    Archie
    Signatur? Ich überlege mir noch eine. Die besten sind ja schon alle vergeben... :para:
  • Das meine ich aber nicht. Mein Problem ist es nicht, eine Linie erst aufhören zu lassen, wenn sie auf ein Objekt trifft, sondern DIE RICHTUNG, in der die Linie laufen muss, da kein "direction" verwendet werden kann!

    Archie
    Signatur? Ich überlege mir noch eine. Die besten sind ja schon alle vergeben... :para:
  • Hatte nicht genau ich dir diese Funktionen schon einmal beigebracht? :D
    Was du brauchst sind lengthdir_x und lengthdir_y. Das sieht dann in etwa so aus:

    GML-Quellcode

    1. draw_line(start_x, start_y, start_x+lengthdir_x(1000,direction), start_y+lengthdir_y(1000,direction));

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

    ehrlich gesagt: nein, ich habe von "lengthdir_x" noch nie was gehört. Auch nicht in meinen Unterlagen gefunden.
    Aber wie auch immer: es funzt! Danke schön!! :-)))

    Könntest Du mir evtl. auch noch sagen, woher Du die "1000" genommen hast? Das ist mir irgendwie nicht klar. Jedenfalls klasse, dass es funzt, hätte ich eher gefragt, hätte ich mir 2 Tage Kopfzerbrechen schenken können... ;)

    Gruß Archie
    Signatur? Ich überlege mir noch eine. Die besten sind ja schon alle vergeben... :para:
  • dazu gibts lenghtdir ....
    Um lästiges Rechnen zu sparen.....

    Und die 1000 gibt an, wie weit in die angegebene richtung in deinem Fall gezeichnet werden soll.
    Kopiere dies in deine Signatur, um es in deiner Signatur zu haben.
    Achtung: Dieser Beitrag läuft ende des Monats ab, bitte lese ihn noch vor dem Monatswechsel...
    Nach langer zeit wieder im Forum aktiv :D
  • Oh, dann habe ich mich geirrt. Diese Funktion ist wichtig.
    Man kann damit eine Vektor-Komponente berechnen indem man eine Richtung und eine Länge angibt.
    Damit kann man von einem Punkt zu einem anderen in einer bestimmten Richtung und Entfernung springen. Also genau das was du brauchst. [//EDIT: Rechtschreibung korrigiert >_> )

    Larsi hat auch Recht.
    Die 1000 habe ich einfach aus der Luft gegriffen. Du musst wissen wie lang der Strahl werden soll...
    Wenn du sichergehen willst dass er immer mindestens den Raum durchqueren kann, solltest du ihn sqrt(sqr(room_height)+sqr(room_wdith)) lang machen (Pythagoras um die Diagonale zu berechnen)

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

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

  • Larsi schrieb:

    Wozu Pythagoras ?

    GML-Quellcode

    1. point_distance(0,0,room_width,room_height)

    bewirkt das selbe...

    Liegt daran, dass es das selbe ist.

    GML-Quellcode

    1. dist = sqrt(sqr(x1-x2) + sqr(y1-y2)); // Reihenfolge von x1 und x2 bzw y1 und y2 ist wegen dem sqr egal.
    2. // Die Formel richtet sich übrigens nach der Gleichung: A² + B² = C² -> Satz des Pythagoras

    DragonGamer hat die Formel nur vereinfacht.

    - Joex3
  • Also erst mal allen hier recht herzlichen Dank für die ausführlichen Antworten! Es geht jetzt tatsächlich, dass auch diagonal geschossen werden kann. Jedoch ergibt sich nun ein anderes Problem daraus: Während die waagerechten und senkrechten Laserstrahlen an der Wand angehalten werden, geht das bei den Diagonalen nicht. Denn die Abfrage mit "collision_line" geht bei diesen auf "noone", wenn keine Objekte mehr im Weg sind. Bei "lengthdir" muss ich aber die Länge angeben - und genau das weiß ich vorher ja nicht, da der Laser stets woanders stehen kann.
    Hier nutzt mir auch der Satz des Pythagoras nichts, denn ich weiß ja nicht, wo der Strahl das Spielfeld verlässt. Zudem ist das Spielfeld nicht identisch mit der Größe des Raumes. Aber vielleicht kann mir hier auch noch jemand helfen?

    Zum Verständnis hänge ich mal ein Beispiel von dem Spielfeld dran (das ist nicht die Fenstergröße!). Vielleicht versteht man dann besser, was ich meine.
    Wie kann ich diesem Laserstrahl jetzt, der nicht mehr auf "collision_line" reagiert, weil die Länge direkt angegeben werden muss, sagen, wie lang er sein muss, um an der Wand abzuprallen? Wie gesagt, der Standort des Lasers ist jedesmal zufällig ausgewählt...

    Herzlichen Dank schon mal im voraus und ich finde es ganz toll, dass es so ein Forum hier gibt!
    Archie

    Hier noch das Spielfeld:
    Bilder
    • spielfeld.JPG

      87,43 kB, 680×492, 138 mal angesehen
    Signatur? Ich überlege mir noch eine. Die besten sind ja schon alle vergeben... :para:
  • Wieso reagiert es nicht mehr auf Collision line?
    Du kannst die Sache mit Lengthdir genau so in diese Funktion einsetzen.

    Wenn du bis heut abend warten kannst, lad ich dir ein Skript hoch welches ich für diesen Performance Contest geschrieben habe. Es macht genau das. Eine Linie bis zu einem Hindernis zu zeichnen. Egal wo der Start oder Zielpunkt ist.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Da warte ich sehr gerne, kein Problem! :-))

    Das geht bei mir deswegen nicht, weil ich bei Collision_line 2 Variablen verwende, hziel und vziel, die die horizontalen und vertikalen Koordinaten angeben, also x und y des Zielpunktes. Und da die Länge vorgegeben ist bei lengthdir_x, zeigt collision_line zwar auch "noon" an, wenn es das Spielfeld verlässt, aber das interessiert lengthdir natürlich nicht...

    Warte ganz gespannt auf die Antwort. Wäre schon toll, wenn die Linie auf auf collision_line reagieren könnte, denn da kommen ja noch etliche Objekte hinzu, die dann erkannt werden müssen...

    Schönen Tag noch,
    Gruß Archie
    Signatur? Ich überlege mir noch eine. Die besten sind ja schon alle vergeben... :para:
  • Auch hier leite ich dich wieder auf diesen Treaht:
    GM 8 Wie mache ich eine Linie die erst aufhört wenn sie auf ein Objekt trifft?
    da hatte ich das alles schon mal....
    Kopiere dies in deine Signatur, um es in deiner Signatur zu haben.
    Achtung: Dieser Beitrag läuft ende des Monats ab, bitte lese ihn noch vor dem Monatswechsel...
    Nach langer zeit wieder im Forum aktiv :D
  • So, hier mein auf Geschwindigkeit getrimmtes Skript:

    GML-Quellcode

    1. /*
    2. Scriptaufbau:
    3. draw_line_collision(x1, y1, x2, y2, obj)
    4. x1 .... Start-X
    5. y1 .... Start-Y
    6. x2 .... Ziel-X
    7. x3 .... Ziel-Y
    8. obj ... Kollisionsobjekt
    9. Gibt true zurück, wenn eine Kollision auftritt*/
    10. if collision_line(argument0,argument1,argument2,argument3,argument4,1,1)
    11. {
    12. var vx, vy, len, dir, mx, my, lh;
    13. len = point_distance(argument0,argument1,argument2,argument3)/2;
    14. dir = point_direction(argument0,argument1,argument2,argument3);
    15. vx = lengthdir_x(len,dir);
    16. vy = lengthdir_y(len,dir);
    17. mx = argument0;
    18. my = argument1;
    19. while(point_distance(0,0,vx,vy))
    20. {
    21. lh = collision_line(mx,my,mx+vx,my+vy,argument4,1,1)
    22. if lh
    23. {
    24. hit_instance = lh;
    25. vx *= 0.5;
    26. vy *= 0.5;
    27. }
    28. else
    29. {
    30. mx += vx;
    31. my += vy;
    32. vx *= 0.5;
    33. vy *= 0.5;
    34. }
    35. }
    36. draw_line(argument0,argument1,mx+vx,my+vy);
    37. return(1);
    38. }
    39. else draw_line(argument0,argument1,argument2,argument3);
    40. return(0);
    Alles anzeigen


    Es gibt zurück ob ein Objekt getroffen wurde. Wenn das der Fall ist, enthält die Variable hit_instance die ID desjenigen Objekts.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • @ Larsi:
    point_distance(0,0,room_width,room_height)


    bitte, was soll das jetzt bringen?? Wie groß das Fenster ist, weiß ich auch so, zudem hab ich jetzt 3 mal geschrieben, dass das Fenster NICHT identisch ist mit dem Spielfeld und selbst wenn es so wäre, würde das niemals die Lösung bringen, da der Strahl jedesmal woanders rausgeht, aber ganz sicher nie an der Ecke des Spielfeldes...


    @DargonGamer:
    whow, das ist ja eine Menge! Danke erst mal! Ich grapsche mir Dein Script jetzt erst mal und schaue, wie weit ich damit komme. Eine ausführlichere Antwort kommt etwas später, ja?

    Sorry, gestern kam ich nach 19.00 Uhr nicht mehr an meinen Rechner... ;)

    Gruß Archie

    Edit:

    so, da bin ich wieder. Ja, was soll ich sagen - es funzt!!! Hey, klasse, danke - wenn wir dich nicht hätten, Dragon.... :D
    Ich hab - deine Erlaubnis vorausgesetzt - das Script etwas abgeändert, da der draw_line-Befehl zu früh kommt, ich habe bereits ein Script, das auf sämtliche Collisionen prüft, deshalb lasse ich mir von Deinem Script jetzt nur die Koordinaten zurückgeben, wo der Strahl auf die Wand trifft und übergeben die dann meinem Script. Aber es geht, toll!!
    Nochmals ein herzliches Dankeschön und nun können wir auch ein "gelöst" hier markieren.
    Gruss Archie
    Signatur? Ich überlege mir noch eine. Die besten sind ja schon alle vergeben... :para:

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