[Gelöst] Kreis (draw_circle) begrenzen, Überstehendes wegschneiden

  • GM 8

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

  • [Gelöst] Kreis (draw_circle) begrenzen, Überstehendes wegschneiden

    :)

    Ich hab bei meinem Weltraumspiel grad einen Radar eingebaut, damit man auf der Minimap nicht immer den gesamten Sektor sieht, sondern nur entsprechend der Radarreichweite, die man erhöhen kann.

    Leider ragt der Kreis, der die Reichweite darstellt, über die Minimap hinaus, da ich ihn einfach mit draw_circle_color zeichne.




    Jemand eine Idee, wie ich das Überstehende wegschneiden kann? Der Kreis soll nur auf der Fläche der Minimap zu sehen sein.

    Wenn hierfür der Code meiner Minimap wichtig ist, reiche ich ihn nach. Ich geh aber mal davon aus, dass es hierfür eine codeunabhängige Möglichkeit gibt - wenn überhaupt. Die Minimap ist jedenfalls ohne Views realisiert. Kurz: Der gesamte Raum wird auf 130x130 runtergebrochen und alles darin dementsprechend auf der Minimap gedrawt.

    GML-Quellcode

    1. if ! (freedom) { instance_destroy(gamemaker); instance_create(x, y, html5); }

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von Bonsaiheld ()

  • Eine Surface wird wohl die einzige Lösung sein...
    Aber sie ist auch nicht so schwierig umzusetzen. Im Grunde musst du nur die Minimap schlicht genau so wie du sie auf den Bildschirm drawst, auf die Surface zeichnen. Dadurch wird quasi automatisch alles was hinaus ragt abgeschnitten.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Ja, Surfaces sind wohl die einzige Lösung. :thumbsup:
    Das haben zwar schon zwei drei Leute geschrieben, ich muss das aber nochmal untermauern, damit mein Spam äh Postcount ansteigt ähm ich meine, ich dir natürlich helfe!

    - Drago Joex3

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

  • Das geht prima ohne Surfaces.
    Nicht getesteter Code:

    GML-Quellcode

    1. draw_primitive_begin(pr_trianglefan);
    2. draw_vertex(x,y); // Mittelpunkt des Kreises
    3. for (i = 0; i < anzahl_der_eckpunkte; i+=1) { // je mehr Punkte, desto runder der Kreis
    4. ix = x + lengthdir_x(radius,i * 360 / anzahl_der_eckpunkte);
    5. iy = y + lengthdir_y(radius,i * 360 / anzahl_der_eckpunkte);
    6. // hier wird der Kreis am Rand abgeschnitten, so dass er nicht über das Rechteck hinaus geht, dass zwischen min_x, max_x, min_y und max_y liegt
    7. if (ix > max_x) ix = max_x;
    8. if (ix < min_x) ix = min_x;
    9. if (iy > max_y) iy = max_y;
    10. if (iy < min_y) iy = min_y;
    11. draw_vertex(ix,iy);
    12. }
    13. draw_primitive_end();
    Alles anzeigen

    Sollte auch wunderbar schnell gehen und mit genügend Ecken auch wie ein Kreis aussehen (intern wird der GameMaker Kreise ganz ähnlich zeichnen. In Studio kann man sogar die Anzahl der Ecken einstellen, die ein Kreis haben soll...
    Wenn du mehr Kontrolle über die Farben haben willst (zum Beispiel ein Farb- oder Transparenzverlauf von der Mitte nach außen), kannst du statt draw_vertex auch draw_vertex_color verwenden...
    Einige meiner Spiele:
  • interceptor schrieb:

    GML-Quellcode

    1. draw_primitive_begin(pr_trianglefan);
    2. draw_vertex(x,y); // Mittelpunkt des Kreises
    3. for (i = 0; i < anzahl_der_eckpunkte; i+=1) { // je mehr Punkte, desto runder der Kreis
    4. ix = x + lengthdir_x(radius,i * 360 / anzahl_der_eckpunkte);
    5. iy = y + lengthdir_y(radius,i * 360 / anzahl_der_eckpunkte);
    6. // hier wird der Kreis am Rand abgeschnitten, so dass er nicht über das Rechteck hinaus geht, dass zwischen min_x, max_x, min_y und max_y liegt
    7. if (ix > max_x) ix = max_x;
    8. if (ix < min_x) ix = min_x;
    9. if (iy > max_y) iy = max_y;
    10. if (iy < min_y) iy = min_y;
    11. draw_vertex(ix,iy);
    12. }
    13. draw_primitive_end();
    Alles anzeigen
    Toll! Es funktioniert perfekt. Danke! :)



    Ich musste allerdings eine Sache ändern und zwar muss anzahl_der_eckpunkte bei ix und iy um 1 kleiner sein als bei anzahl_der_eckpunkte in der for-Schleife, sonst fehlt im Kreis ein Kuchenstück. Werd mal ein bisschen mit dem Code rumprobieren, denn ich versteh ihn nicht wirklich. Hab noch nie mit diesen Funktionen gearbeitet. :huh:

    GML-Quellcode

    1. if ! (freedom) { instance_destroy(gamemaker); instance_create(x, y, html5); }

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

  • Werd mal ein bisschen mit dem Code rumprobieren, denn ich versteh ihn
    nicht wirklich. Hab noch nie mit diesen Funktionen gearbeitet. :huh:
    Letzendlich zeichnet die Funktionen einen Kreis, genau so wie die internen Funktionen. Da 2D eigentlich nur intern über 3D funktioniert können wir Polygone zeichnen (z.B. Linien und Dreiecke, in diesem Fall eine Trianglefan). (Sprites sind z.B. ein Rechteck das wiederum aus 2 Dreiecken besteht)

    Gutes Bild dazu:


    draw_vertex sagt nur wo der Punkt ist (wir können auch eine Farbe oder Texturecoordinaten übergeben).

    Im Grund wird hier ein regelmässiges n-Eck gezeichnet, nur eben mit so vielen Ecken das man meint es sei ein Kreis. (z.B. 257-Eck )

    lengthdir_x/y sorgt nur dafür das alle Punkte auf einem Kreis liegen.
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%