Rectangle mit Winkel, Linie mit Dicke

    • Skript

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

    • Rectangle mit Winkel, Linie mit Dicke

      Moin,
      da es diese "Primitiven" draw-Funktionen nicht gibt habe ich mich mal dran gesetzt und sie selber geschrieben. Hoffe das kann jemand gebrauchen.
      Beachtet das der Script scr_draw_line von der funktion scr_draw_rectangle abhängt.

      GML-Quellcode

      1. //------------------------------------------//
      2. // Script um ein Viereck zu zeichnen //
      3. // Parameter sind mittlere Position, //
      4. // Abmessungen, Winkel und einem true //
      5. // oder false für ausgemalt oder nicht //
      6. // Beispiel: //
      7. // scr_draw_rectangle(x,y,128,32,25,false); //
      8. // zeichnet ein Viereck an der Stelle x,y //
      9. // mit den Abmessungen 128 pixel breit und //
      10. // 32 pixel hoch unter einem winkel von 25° //
      11. // durch das false wird es ausgefüllt //
      12. // by Nobody-86 //
      13. //------------------------------------------//
      14. var v_xx, v_yy, v_a, v_b, v_phi, v_outline;
      15. v_xx =argument0;
      16. v_yy =argument1;
      17. v_a =argument2;
      18. v_b =argument3;
      19. v_phi =argument4;
      20. v_outline =argument5;
      21. v_a/=2;
      22. v_b/=2;
      23. if(v_outline){
      24. //linie links
      25. draw_line( v_xx-v_a*cos(v_phi*pi/180)-v_b*sin(v_phi*pi/180),
      26. v_yy+v_a*sin(v_phi*pi/180)-v_b*cos(v_phi*pi/180),
      27. v_xx-v_a*cos(v_phi*pi/180)+v_b*sin(v_phi*pi/180),
      28. v_yy+v_a*sin(v_phi*pi/180)+v_b*cos(v_phi*pi/180),
      29. );
      30. //linie unten
      31. draw_line( v_xx-v_a*cos(v_phi*pi/180)+v_b*sin(v_phi*pi/180),
      32. v_yy+v_a*sin(v_phi*pi/180)+v_b*cos(v_phi*pi/180),
      33. v_xx+v_a*cos(v_phi*pi/180)+v_b*sin(v_phi*pi/180),
      34. v_yy-v_a*sin(v_phi*pi/180)+v_b*cos(v_phi*pi/180),
      35. );
      36. //linie rechts
      37. draw_line( v_xx+v_a*cos(v_phi*pi/180)+v_b*sin(v_phi*pi/180),
      38. v_yy-v_a*sin(v_phi*pi/180)+v_b*cos(v_phi*pi/180),
      39. v_xx+v_a*cos(v_phi*pi/180)-v_b*sin(v_phi*pi/180),
      40. v_yy-v_a*sin(v_phi*pi/180)-v_b*cos(v_phi*pi/180),
      41. );
      42. //linie oben
      43. draw_line( v_xx+v_a*cos(v_phi*pi/180)-v_b*sin(v_phi*pi/180),
      44. v_yy-v_a*sin(v_phi*pi/180)-v_b*cos(v_phi*pi/180),
      45. v_xx-v_a*cos(v_phi*pi/180)-v_b*sin(v_phi*pi/180),
      46. v_yy+v_a*sin(v_phi*pi/180)-v_b*cos(v_phi*pi/180),
      47. );
      48. } else {
      49. draw_primitive_begin(pr_trianglefan);
      50. //oben links
      51. draw_vertex(v_xx-v_a*cos(v_phi*pi/180)-v_b*sin(v_phi*pi/180),
      52. v_yy+v_a*sin(v_phi*pi/180)-v_b*cos(v_phi*pi/180)
      53. );
      54. //unten links
      55. draw_vertex(v_xx-v_a*cos(v_phi*pi/180)+v_b*sin(v_phi*pi/180),
      56. v_yy+v_a*sin(v_phi*pi/180)+v_b*cos(v_phi*pi/180)
      57. );
      58. //unten rechts
      59. draw_vertex(v_xx+v_a*cos(v_phi*pi/180)+v_b*sin(v_phi*pi/180),
      60. v_yy-v_a*sin(v_phi*pi/180)+v_b*cos(v_phi*pi/180)
      61. );
      62. //oben rechts
      63. draw_vertex(v_xx+v_a*cos(v_phi*pi/180)-v_b*sin(v_phi*pi/180),
      64. v_yy-v_a*sin(v_phi*pi/180)-v_b*cos(v_phi*pi/180)
      65. );
      66. draw_primitive_end();
      67. }
      Alles anzeigen

      GML-Quellcode

      1. //------------------------------------------//
      2. // Script um eine Linie mit einer angebenen //
      3. // Dicke zu zeichnen. Parameter sind //
      4. // Position von, Position bis, Dicke und //
      5. // einem true der false ob die Enden //
      6. // abgerundet dargestellt werden sollen //
      7. // BENÖTIGT DEN SCRIPT //
      8. // scr_draw_rectangle() //
      9. // Beispiel: //
      10. // scr_draw_line(x,y,mouse_x,mouse_y,32,true);
      11. // zeichnet eine Linie von Position x,y zur //
      12. // Position mouse_x,mouse_y geht. //
      13. // Die liniendicke beträgt 32 Pixel und die //
      14. // Enden werden rund gezeichnet. //
      15. // by Nobody-86 //
      16. //------------------------------------------//
      17. var v_x1, v_y1, v_x2, v_y2, v_d, v_r;
      18. v_x1 = argument0;
      19. v_y1 = argument1;
      20. v_x2 = argument2;
      21. v_y2 = argument3;
      22. v_d = argument4;
      23. v_r = argument5;
      24. v_xx = v_x1+(v_x2-v_x1)/2;
      25. v_yy = v_y1+(v_y2-v_y1)/2;
      26. scr_draw_rectangle(v_xx,v_yy,point_distance(v_x1,v_y1,v_x2,v_y2),v_d,point_direction(v_x1,v_y1,v_x2,v_y2),false);
      27. if(v_r){
      28. draw_circle(v_x1,v_y1,v_d/2,false);
      29. draw_circle(v_x2,v_y2,v_d/2,false);
      30. }
      Alles anzeigen
      :) Nobody is perfect (-:

      "Dummköpfe sind Denkerköpfen weit überlegen. Zahlenmäßig." Ernst Ferstl
    • Find ich sehr gut, dass du dir die Mühe gemacht hast. Der GM 7 enthält übrigens bereits einen Befehl für Linien mit einer bestimmten Stärke.
      █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
      █████ ███████ ███ your █████ ████ government.
    • Abgerundete Ecken sind meines Wissens nach nicht Möglich mit dem "draw_line_thickness" oder wie es heisst. Also gibt es schon eine Innovation in deinem Script ;)
      So far, Schattenphoenix~
      _____________________________________________________________________________
      "Who needs a stairway to heaven...
      If there is an elevator to hell... ?
      "
      - Vergessen
      "Auch ein perfektes Chaos ist etwas vollkommenes."
      - Jean Genet
    • Schattenphoenix schrieb:

      Abgerundete Ecken sind meines Wissens nach nicht Möglich mit dem "draw_line_thickness" oder wie es heisst. Also gibt es schon eine Innovation in deinem Script ;)

      Naja, ich denke, dass die GM7 Zeichenfunktion für dicke Linien zusammen mit Kreisen an den Enden etwas schneller sind. Dennoch sind deine Scripts alles andere als umsonst. Ein gedrehtes Rechteck gibt es schließlich nicht und GM6 User können hiermit auch dicke Linien erstellen.
      █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
      █████ ███████ ███ your █████ ████ government.
    • Das erste Skript enthält 48 Aufrufe (wenn ich mich nicht verzählt habe) von sin und cos, von den Grundrechenfunktionen mal abgesehen. Das kann schnell auf die Perfomance gehen. Man sollte den Code aufteilen, so daß die Rechnerei nur bei Bedarf stattfindet und dann alle Punkte in einer Liste gespeichert werden.
      Im Draw-Event muß man dann nur die Liste abarbeiten, das dürfte deutlich schneller gehen.
    • Wenn ich das richtig sehe berechnest du ja nur sin(v_phi*pi/180) und cos(v_phi*pi/180). Da würde es schon reichen wenn du diesen beiden Werte einmal am Anfang des Scripts berechnest und dann in temporäre Variablen speicherst, mit denen du dann weiterrechnest.
      “Computers are good at following instructions, but not at reading your mind.” (Donald Knuth)

      Ich schreibe mit Neo.