Isometrie nur sichtbare Felder zeichnen

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

    • Isometrie nur sichtbare Felder zeichnen

      Hallo,

      Erst die Gegebenheiten: Ich habe ein isometrisches Spielfeld, dessen gitter um 45 Grad gedreht ist.
      Dabei geht die erste Koordinate nach unten links und die zweite koordinate nach unten rechts.
      Ein solches auf die Spitze gedrehtes Feld(Quadrat), ist 16 Pixel breit und hoch.
      Das Spielfeld kann verschoben werden.
      Ich kenne die Koordinaten(also hier sind jetzt die normalen nicht gedrehten gemeint) des feldes ganz oben in der Mitte und die des Ausschnitts den man gerade sieht.

      Meine Frage ist jetzt: Wie kann ich jeweils die minimale und maximale Koordinate berechnen, damit alle auf dem Bildschirm sichtbaren Felder gezichnet werden, aber alle anderen nicht.

      edit: Hier eine Skizze, die das Problem hoffentlich besser erklähren kann:


      FG
      andre111

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

    • Meines Wissens nach werden tiles im GM ausserhalb des sichbaren Bereichs ( = ausserhalb der Views) automatisch nicht gezeichnet!
      Also wenn du dies allein wegen der Performance machen willst, ist es unnötig :)

      Willst du auf diese Drachen und -eier klicken?
      Sie werden sich freuen ;)
    • Es sind keine Tiles sondern es wird alles von einem Objekt aus gezeichnet aber allein die for schleifen(128*128) brauchen zuviel leistung, ich zeichne die Sprites schon nicht, wenn sie ausserhalb sind, aber ich suche nach einer möglichkeit, die for schleifen zu verkleinern.

      Also ich mache etwa so(eher pseudo code):

      GML-Quellcode

      1. for (x=0; x<128; x+=1) {
      2. for (y=0; y<128; y+=1) {
      3. //berechnung der position des Feldes
      4. //wenn innerhalb des sichtbaren bereichs...
      5. //hier zeichnen
      6. }
      7. }

      aber allein die zwei for schleifen sind zuviel.
    • Mit dem folgenden Script (nicht getestet) kannst du bestimmen, in welcher Zelle deines Spielfelds sich ein gegebener Punkt befindet. Das kannst du beispielsweise auf alle vier Ecken des Sichtfensters anwenden und kannst so die minimalen und maximalen Koordinaten ermitteln. Wenn du dann innerhalb dieser Grenzen die Felder in der doppelten for-Schleife durchläufst, sind zwar immer noch einige Zellen darunter, die nicht sichtbar sind, aber das sollte akzeptabel sein. Zumindest habe ich aus deiner Frage herausgehört, dass du es so in der Art machen willst, da du nach minimalen und maximalen Koordinaten gefragt hast. Wenn man sich etwas mehr anstrengt, könnte man es sicher auch schaffen, dass wirklich nur die sichtbaren Zellen durchlaufen werden, allerdings dann nicht mehr so einfach in einer doppelten for-Schleife, wie du sie gerne hättest.

      GML-Quellcode

      1. // Vektor zwischen oberer Ecke des Spielfelds und einem beliebigen Punkt.
      2. dx = punkt_x-spielfeld_x;
      3. dy = punkt_y-spielfeld_y;
      4. // Vektor zeigt in die Richtung der ersten Koordinate des Spielfelds.
      5. n1x = lengthdir_x(1,225);
      6. n1y = lengthdir_y(1,225);
      7. // Vektor zeigt in die Richtung der zweiten Koordinate des Spielfelds.
      8. n2x = lengthdir_x(1,-45);
      9. n2y = lengthdir_y(1,-45);
      10. // Höhe und Breite einer einzelnen Zelle (entlang der Koordinaten des Spielfelds).
      11. size = 16/sqrt(2);
      12. // Koordinaten der Zelle, in der sich der gegebene Punkt befindet.
      13. tile_x = floor((dx*n1x+dy*n1y)/size);
      14. tile_y = floor((dx*n2x+dy*n2y)/size);
      Alles anzeigen