GLBasic forum

Codesnippets => 2D-snippets => Topic started by: Schranz0r on 2007-Jul-06

Title: Große Tilemaps ohne Frameverlust !
Post by: Schranz0r on 2007-Jul-06
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
Title: Große Tilemaps ohne Frameverlust !
Post by: Quentin on 2007-Jul-06
Goil!

Grundgerüst für das nächste Labyrinth-Spiel ist damit gelegt.
Klasse.
Gefällt mir.
Title: Große Tilemaps ohne Frameverlust !
Post by: Schranz0r on 2007-Jul-10
JA, da kannst große Labyrinthe mit  machen ;)
Title: Re: Große Tilemaps ohne Frameverlust !
Post by: WPShadow on 2011-Dec-31
Ich packe mal deinen alten Code aus und bastle etwas dran herum, wenn's ok für dich ist! ^^

LG

W.
Title: Re: Große Tilemaps ohne Frameverlust !
Post by: Schranz0r on 2011-Dec-31
Mach das :D
Title: Re: Große Tilemaps ohne Frameverlust !
Post by: Schranz0r on 2011-Dec-31
geht schnell :D

habs mit Polyvector in typearrays gemacht! Rennt wie sau!
Title: Re: Große Tilemaps ohne Frameverlust !
Post by: Schranz0r on 2011-Dec-31
Tilemap 1200x1200 Tiles
Tilegröße 10x10 pixel
Auflösung 800x600


was meinst du mit nachhalten?
Title: Re: Große Tilemaps ohne Frameverlust !
Post by: Schranz0r on 2011-Dec-31
für ne Landkarte?