Große Tilemaps ohne Frameverlust !

Previous topic - Next topic

Schranz0r

Hi

Hier mal ein Beispiel, wie ihr eine Tilemap macht, die keinen übermässigen Speicher frisst.
auch nicht bei einer Tilemap von 1000 x 1000 ( 1.000.000 Tiles !!!!! ), Ohne Lag und ohne Frameverlust !

Hier der Code :


Code (glbasic) Select
// --------------------------------- //
// Project: Tilemap
// Start: Thursday, July 05, 2007
// IDE Version: 4.237

SETSCREEN 640,480,0   // Setze Grafikmodus
GETSCREENSIZE GraphX, GraphY  // Beziehe Fenster breite und höhe


// -------Erstelle Sprite----------------
FILLRECT 0,0,32,32, RGB(0x00, 0xff, 0x80)
FILLRECT 2,2,28,28, RGB(0x00, 0x80, 0xff)
GRABSPRITE 0,0,0,32,32
BLACKSCREEN


// Globale setzen---
GLOBAL MaxTX = 50 // Maximale Tiles im Dim X.(testet mal 1000)
GLOBAL MaxTY = 50 // Maximale Tiles im Dim Y.(testet mal 1000)
GLOBAL TS = 32   // Tilesize 32 x 32 also 1x 32 reicht ja.
GLOBAL cam_speed = 2// Scrollingspeed
//------------------

// Mache ein Array----------
DIM level [MaxTX][MaxTY]


// Setze Random Felder, 0 = Sprite, 1 = kein Sprite
FOR x = 0 TO MaxTX-1
FOR y = 0 TO MaxTY-1

level[x][y] = RND(1)  // zufällig setzen

NEXT
NEXT



//########################################################
// HAUPTSCHLEIFE
//########################################################

WHILE TRUE

cam_x_div = INTEGER(cam_x / TS) // Anfang der ersten gezeigten DIMs errechnen X
cam_y_div = INTEGER(cam_y / TS) // Anfang der ersten gezeigten DIMs errechnen Y


    // Zeichen der Map, es werden nur Sprites gezeichnet, die auch auf dem
    // Screen zu sehen sind !
    FOR x = cam_x_div   TO cam_x_div + (GraphX/TS)
        FOR y = cam_y_div TO cam_y_div + (GraphY/TS)

SPRITE level[x][y], x*TS-cam_x, y*TS-cam_y // SPRITE Zeichen

NEXT
NEXT


//-------------Scrolling--------------
IF KEY(203) THEN DEC cam_x , cam_speed  // Links
IF KEY(205) THEN INC cam_x , cam_speed  // Rechts
IF KEY(200) THEN DEC cam_y , cam_speed  // Hoch
IF KEY(208) THEN INC cam_y , cam_speed  // Runter

// Bregengungen setzen----------------
IF cam_x < 0 THEN cam_x = 0
IF cam_y < 0 THEN cam_y = 0

// -(GraphX+1) " + 1 " damit der ausgleich von 0 to .. ausgeglichen wird, sonnst Array out of Bounds !
IF cam_x > (MaxTX*TS)-(GraphX+1) THEN cam_x = (MaxTX*TS)-(GraphX+1)
// -(GraphY+1) " + 1 " damit der ausgleich von 0 to .. ausgeglichen wird, sonnst Array out of Bounds !
IF cam_y > (MaxTY*TS)-(GraphY+1) THEN cam_y = (MaxTY*TS)-(GraphY+1)

// Kleine Debug anzeige
PRINT "X: "+cam_x, 10, 10
PRINT "Y: "+cam_y, 10, 20

SHOWSCREEN
WEND
END
EDIT:

Habs grade mit  4 Millionen Tiles laufen lassen, und es Funzt noch Astrein, brauch aber 5 Sec zum laden :D


EDIT 2 :

4000 x 4000 (16 millionen Tiles)

Schranz0r =  knapp 20 Sec
BumbleBee = 1 min 12 sec


Scrolling wie immer gut :D
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Quentin

Goil!

Grundgerüst für das nächste Labyrinth-Spiel ist damit gelegt.
Klasse.
Gefällt mir.

Schranz0r

JA, da kannst große Labyrinthe mit  machen ;)
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

WPShadow

Ich packe mal deinen alten Code aus und bastle etwas dran herum, wenn's ok für dich ist! ^^

LG

W.
AMD X2 4600, 2 GB Ram, ATI X1950 XTX, XP PRO SP2: GLB Premium 10.beta_dingsi, <(´.´<) Kirby Dance (>`.`)>
http://lostrevenant.blogspot.com
alea iacta est

Schranz0r

I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Schranz0r

geht schnell :D

habs mit Polyvector in typearrays gemacht! Rennt wie sau!
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Schranz0r

Tilemap 1200x1200 Tiles
Tilegröße 10x10 pixel
Auflösung 800x600


was meinst du mit nachhalten?
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Schranz0r

I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard