Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Administrator
Übergib der Render Methode deine Window View oder wie das in SFML heißt. Dann kannst du dir leicht ausrechnen ob das aktuelle Tile innerhalb deines Sichtbereichs liegt. Ist dies der Fall -> ab in den VBO damit, wenn nicht -> ignorieren.
Da empfiehlt es sich natürlich, die Tiles auch in einem 2D-Array anzuordnen.
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
int Map[map_hoehe][map_breite]= { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; // |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
for(unsigned int i = 0; i < map_hoehe; i++) { for(unsigned int j = 0; j < map_breite; j++) { //Tile mit new erstellen und Werte setzen // Tile *tile; tile = new Tile(0); tile ->SetPosition(i*tile_hoehe,j*tile_breite); if(Map[i][j] == 0) { tile ->SetImage(TileImg1); } if(Map[i][j] == 1) { tile ->SetImage(TileImg2); } TileList.push_back(*tile); } } |
Übergib der Render Methode deine Window View oder wie das in SFML heißt. Dann kannst du dir leicht ausrechnen ob das aktuelle Tile innerhalb deines Sichtbereichs liegt. Ist dies der Fall -> ab in den VBO damit, wenn nicht -> ignorieren.
Immer noch ein schlechter Ansatz, weil du dann immer noch jedes Tile einmal überprüfen musst!
Stell dir mal vor, deine Map ist 10000x1000 Tiles groß, dann müsstest du 10 Millionen Tiles in jedem Frame überprüfen, nur um dann am Ende einen kleinen Bruchteil davon zu zeichnen.
Zitat
Dabei geht es doch ganz einfach:
Anhand der Kameraposition und der Bildschirmgröße bestimmst du X und Y des Tiles, das die Kamera links oben in der Bildschirmecke sieht.
Dann das gleiche für rechts unten.
Nun hast du den kleinsten und größten sichtbaren X- und Y-Wert, und alle Tiles dazwischen sind sichtbar.
Da empfiehlt es sich natürlich, die Tiles auch in einem 2D-Array anzuordnen.
Administrator
Übergib der Render Methode deine Window View oder wie das in SFML heißt. Dann kannst du dir leicht ausrechnen ob das aktuelle Tile innerhalb deines Sichtbereichs liegt. Ist dies der Fall -> ab in den VBO damit, wenn nicht -> ignorieren.
Immer noch ein schlechter Ansatz, weil du dann immer noch jedes Tile einmal überprüfen musst!
Stell dir mal vor, deine Map ist 10000x1000 Tiles groß, dann müsstest du 10 Millionen Tiles in jedem Frame überprüfen, nur um dann am Ende einen kleinen Bruchteil davon zu zeichnen.
Öh nein, nur ein einziges mal, danach liegen die ja statisch im Buffer.
Was wär denn die Alternative?
Werbeanzeige