Cirkel und Viereck mit textur-rand

  • GM 7
  • Cirkel und Viereck mit textur-rand

    vielleicht hat schon mal jemand von euch das problem gehabt,

    die draw cirkle funktionen in gm sind so gut wie für nichts zu gebrauchen wenn du nur den rand haben willst, weil der nur 1 px breit ist.

    Man kann natürlich folgendes machen:

    GML-Quellcode

    1. draw_circle(drawstartx,drawstarty,radius,true)
    2. draw_circle(drawstartx,drawstarty,radius+1,true)
    3. draw_circle(drawstartx,drawstarty,radius-1,true)
    4. draw_circle(drawstartx,drawstarty,radius+2,true)
    5. draw_circle(drawstartx,drawstarty,radius-2,true)

    Aber das sieht nicht schön aus, weil der kreis immer noch nicht "dicht" ist, der hat ein einigen stellen "löcher".

    Hat jemand eine alternative?

    Wenn wir hier noch einen super nerd unter uns haben kann der vielleicht mir noch erklären wie man das ganze dann auch noch mit einer strukturirten linie macht.

    Nehmen wir einfach mal an das der rand 5 px dick sein soll.

    Ich hoffe ich habe keine forgefertigte funktion von GM dafür übersehen! :D

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von SDX ()

  • Das Problem lässt sich mit nem Script lösen, dass ich in der GMC gefunden hab.

    GML-Quellcode

    1. var w, r, xx, yy, i;
    2. xx = argument0; yy = argument1;
    3. r = argument2; w = argument3/2;
    4. draw_primitive_begin(pr_trianglestrip);
    5. for (i = 0; i <= 360; i += 15) {
    6. draw_vertex(xx + lengthdir_x(r-w, i), yy + lengthdir_y(r-w, i));
    7. draw_vertex(xx + lengthdir_x(r+w, i), yy + lengthdir_y(r+w, i));
    8. }
    9. draw_primitive_end();


    argument0 gibt den x wert an, argument1 den y wert, argument2 den radius und argument3 die Linienbreite.
    Das ganze einfach als Script anlegen und beispielsweise draw_circle_width nennen.

    Hoffe du kannst damit was anfangen ^-^.
  • Super, danke, habe es gleich mal modifiziert, so das man auch eine textur als rand benutzen kann/sollte, denn es funkt net ganz (wird einfach nur ein pixel der gesamten textur benuzt.)

    GML-Quellcode

    1. var w, r, xx, yy, i, tex;
    2. xx = argument0; yy = argument1;
    3. r = argument2; w = argument3/2;
    4. tex=background_get_texture(argument4)
    5. draw_primitive_begin_texture(pr_trianglestrip,tex);
    6. for (i = 0; i <= 360; i += 15) {
    7. draw_vertex_texture(xx + lengthdir_x(r-w, i), yy + lengthdir_y(r-w, i),1,1);
    8. draw_vertex_texture(xx + lengthdir_x(r+w, i), yy + lengthdir_y(r+w, i),1,1);
    9. }
    10. draw_primitive_end();

    argument0 gibt den x wert an, argument1 den y wert, argument2 den radius, argument3 die dicke und argument4 den background.

    Kann mir mal jemand helfen! :P
  • Ich hab mal ein script für sowas geschrieben:

    script "draw_ring":

    GML-Quellcode

    1. // argument0 = x Mittelpunkt
    2. // argument1 = y Mittelpunkt
    3. // argument2 = innerer Radius
    4. // argeumnt3 = äußerer Radius
    5. // argument4 = Genauigkeit
    6. // argument5 = Textur ID (-1 für keine Textur)
    7. // argument6 = x Texturkoordinate rechts am Ring
    8. // argument7 = x Texturkoordinate rechts am Ring nach einer Umdrehung gegen den Uhrzeigersinn
    9. // argument8 = y Texturkoordinate an der Innenkante des Rings
    10. // argument9 = y Texturkoordinate an der Außenkante des Rings
    11. // argument10 = Blendfarbe an der Innenkante
    12. // argument11 = Blendfarbe an der Außenkante
    13. // argument12 = Alpha an der Innenkante
    14. // argument13 = Alpha an der Außenkante
    15. var i, a, dx, d, tx, vx, vy;
    16. dx = argument7-argument6;
    17. draw_primitive_begin_texture(pr_trianglestrip,argument5);
    18. for (i = 0; i <= argument4; i += 1) {
    19. d = i/argument4;
    20. a = d*2*pi;
    21. tx = argument6+d*dx;
    22. vx = cos(a);
    23. vy = -sin(a);
    24. draw_vertex_texture_color(argument0+argument2*vx,argument1+argument2*vy,tx,argument8,argument10,argument12);
    25. draw_vertex_texture_color(argument0+argument3*vx,argument1+argument3*vy,tx,argument9,argument11,argument13);
    26. }
    27. draw_primitive_end();
    Alles anzeigen


    Beispielaufruf:

    GML-Quellcode

    1. draw_ring(320,240,120,200,24,sprite_get_texture(spr_test,0),0,12,0,1,c_white,c_white,1,1);


    Ist recht flexibel und sollte das können was du willst.
  • bevor ich jetzt einen neues thema aufmache aktiviere ich dieses mal wieder und stelle eine ähnliche frage!

    Das mit den kreis hat mich wirklich umgehauen, und der funkt auch einwandfrei. Danke Bl@ksp@rk

    Aber nun zu neuen problem, das das selbe natürlich auch als 4 ek geht ist logisch, doch wie sollte man es machen dass der sich dann auch noch drehen kann, und das sich die textur mitdreht? Wenn man bei blacksparks script bei genauichkeit eine 4 angibt hat man schon einmal ein viereck, doch das kann man nicht drehen, auserdem ist es kvadrat (alle seiten gleich lang).
    Ich brauche allerdings auch kein code mit dem ich ein trapetz oder ein parallogramm machen kann :D
  • Schreib doch mal bitte genau was du willst. Ich lese bei dir raus, dass es zwar allgemeiner sein soll als nur ein Quadrat, aber wiederum nicht so allgemein, dass man damit ein Trapez oder Parallelogramm zeichnen könnte. Da fällt mir spontan nur das Rechteck ein, aber warum schreibst du das nicht gleich hin sondern schließt alle anderen viereckigen Formen aus? Also sag mal bitte ob du nun ein Script suchst, mit dem sich ein Rechteck gedreht zeichnen lässt oder beschreibe was du nun genau willst ;)
    (oder willst du ein Script ganz allgemein für ein beliebiges Viereck?)
  • Schuldigung, das war wohl ein bischen verwirend, aber ich ich versuch es noch mal:

    Ich suche einen script, der folgende argumente inhält:Textur, Breite, Höhe, Dicke des Randes, Rotation, X und Y position.
    Was soll er können? Ein algemeines Viereck zeichnen, mit texturriertem rand.

    Ich denke mal dass das weiter hilft und besser ist als die vorherrige beschreibung! :D
  • Sorry, aber jetzt muss ich nochmal nachhacken, da du dir selber widersprichst. Wie willst du denn bitte mit den Angaben

    ...Textur, Breite, Höhe, Dicke des Randes, Rotation, X und Y position...

    ein

    ...algemeines Viereck...

    beschreiben? Das ist nicht möglich. Also entweder meinst du Rechteck, statt allgemeines Viereck, oder aber du brauchst andere Angaben um ein allgemeines Viereck zu zeichnen, nämlich die Koordinaten der vier Eckpunkte. Bitte mal für eins entscheiden ;)