Hallo Community,
Ich habe ein Problem und zwar habe ich eine Gigantische Map durch ein ds_grid erstellt. Durch einen selbst programmierten Screen verzichte ich auf eine größere Größe des Raumes und bleibe bei 800x600 pixel.
Ich habe Tiles in der Größe von 32 die mit der Variable map_size multipliziert werden und das dann nochmal im Quadrat so das ein Spielfeld ensteht.
Das Problem liegt jedoch nicht beim erstellen des grids, sondern beim Zeichnen. Ich bekomme schon ab einer map_size von 20 Frameseinbrüche (Das entspricht: 20*20 = 400 Tiles in einer Rastergröße von 640*640 pixel. Allerdings möchte ich die map_size bis zu 400 haben also 400*400 Tiles, was ja eine Menge ist. Ich hatte schon versucht durch eine Abfrage die Tiles nur im Sichtbereich des Raumes zu setzen, was allerdings überhaupt nichts gebracht hatte. In dem Beispiel habe ich es mit Surfaces versucht, davor normal mit Tiles und ganz davor mit einfachen draw methoden. Es kam immer das selbe raus. Ich glaube es liegt an den for Schleifen, allerdings fällt mir grad nicht ein wie ich dieses Problem anders und besser lösen könnte. Ich will nicht auf große Maps verzichten, die muss groß bleiben.
Hier ein Bild wo ich eine Größe von map_size = 50 habe mit stolzer 1FPS:
Create Event:
Spoiler anzeigen
Alles anzeigen
Step Event:
Spoiler anzeigen
Alles anzeigen
Vielen dank schon mal im Voraus! Wenn was nicht verständlich war, bitte nachfragen!
Ich habe ein Problem und zwar habe ich eine Gigantische Map durch ein ds_grid erstellt. Durch einen selbst programmierten Screen verzichte ich auf eine größere Größe des Raumes und bleibe bei 800x600 pixel.
Ich habe Tiles in der Größe von 32 die mit der Variable map_size multipliziert werden und das dann nochmal im Quadrat so das ein Spielfeld ensteht.
Das Problem liegt jedoch nicht beim erstellen des grids, sondern beim Zeichnen. Ich bekomme schon ab einer map_size von 20 Frameseinbrüche (Das entspricht: 20*20 = 400 Tiles in einer Rastergröße von 640*640 pixel. Allerdings möchte ich die map_size bis zu 400 haben also 400*400 Tiles, was ja eine Menge ist. Ich hatte schon versucht durch eine Abfrage die Tiles nur im Sichtbereich des Raumes zu setzen, was allerdings überhaupt nichts gebracht hatte. In dem Beispiel habe ich es mit Surfaces versucht, davor normal mit Tiles und ganz davor mit einfachen draw methoden. Es kam immer das selbe raus. Ich glaube es liegt an den for Schleifen, allerdings fällt mir grad nicht ein wie ich dieses Problem anders und besser lösen könnte. Ich will nicht auf große Maps verzichten, die muss groß bleiben.
Hier ein Bild wo ich eine Größe von map_size = 50 habe mit stolzer 1FPS:
Create Event:
GML-Quellcode
- screen_x = 32; // X-Position des Screens
- screen_y = 32; // Y-Position des Screens
- screen_speed = 8; // Scrollgeschwindigkeit des Screens
- map_size = 50; // Größe der Map (map_size² = Anzahl der Tiles) (Länge oder Breite = map_size*32)
- grid = ds_grid_create(map_size,map_size); // erstellt das Grid
- for(a=0;a<map_size;a+=1) { for(b=0;b<map_size;b+=1) { // erstellt die einzelnen Felder
- ds_grid_add(grid,a,b,1);
- } }
- sf = surface_create(room_width,room_height); // erstellt ein Surface
- surface_set_target(sf);
- draw_clear_alpha(0,0);
- surface_reset_target();
Step Event:
GML-Quellcode
- if(keyboard_check(vk_up)) { screen_y -= screen_speed; }
- if(keyboard_check(vk_down)) { screen_y += screen_speed; }
- if(keyboard_check(vk_left)) { screen_x -= screen_speed; }
- if(keyboard_check(vk_right)){ screen_x += screen_speed; }
- surface_set_target(sf);
- draw_clear_alpha(0,0);
- for (a=0;a<map_size;a+=1) { for (b=0;b<map_size;b+=1)
- {
- if ds_grid_get(grid,a,b) == 1 // falls an a,b die Value 1 ist, dann...
- {
- tile_layer_delete_at(1000,screen_x+a*32,screen_y+b*32); // löscht das tile
- tile_layer_delete_at(1000,screen_x+a*32+screen_speed+2,screen_y+b*32+screen_speed+2); // behebt einen Bug
- tile_add(bg_map,0,0,32,32,screen_x+a*32,screen_y+b*32,1000); // erstellt das tile an der angegebenen Stelle
- }
- } }
- draw_text(0,0,fps); // zeichnet die FPS am Rand
- draw_set_blend_mode(bm_normal);
- surface_reset_target();
Vielen dank schon mal im Voraus! Wenn was nicht verständlich war, bitte nachfragen!
