Tilemap mit 3 Layern..... Spieler auf Layer 2 Laufen lassen ?!

Previous topic - Next topic

Schranz0r

Hi Leute

Ich hab einen Editor gemacht, und mit diesen dann eine Map gebastelt.

die Map hat 3 Layer und ist wie folgt gezeichnet:
(Map ist 100x100 Tiles groß, ein Tile ist 32x32, Auflösung 800x600)

Code (glbasic) Select
FakeX = ScrollX / TS
FakeY = ScrollY / TS

FOR X = FakeX TO FakeX + (GraphX / TS)-1
FOR Y = FakeY TO  FakeY + (GraphY / TS)
FOR Z = 0 TO 2

SPRITE Level[X][Y][Z], X*TS-ScrollX, Y*TS-ScrollY

        NEXT
    NEXT
NEXT
Im Spiel soll sich der Player im " Level[X][Y][1] " (Layer 2) bewegen können.

Zur erklärung:

Level[X][Y][0] = Boden
Level[X][Y][1] = Collision
Level[X][Y][2] = Über den Spieler

Wie stell ich das am geschicktesten an den Player im Layer 2 zum positionieren?
Weil jedes Layer einzeln zeichen lassen zieht ja mächtig an den resourcen, das würde  gehn.... aber dann hab ich  FPS < 50 !

Grüße
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

Kitty Hello

Schau, welcher Bereich (xmin, xmax und ymin bis ymax sichtbar ist, dann zeichne nur die, die darin sind.

Schranz0r

Hi Gernot

Ich hab doch schon eine einschränkung drinne, das nur das Gezeichnet wird, was auch wirklich sichbar ist .

Die frage für mich ist nur, wie bekomme ich den Player in den Layer2 das Layer 3 noch über den Spieler verläuft !
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

Kitty Hello

Mach die layer ancheinander und zeichne dazwischen alle Spieler. <50FPS kann bei 100x100 mit 32x32 gar nicht sein. Das ist ja nicht viel Zeugs.

D2O

Hi,hier mal ein beispiel.
Ist nur schnell zusammen geschustert:
Achtun die map erstellung dauert ein bisschen,
sie ist 2000 x 2000 gross und hat 5 Layer, kannste selber etwas kleiner machen :)

Einfache Mapscrolling ist drin, Pfeiltasten.
Player ist das weise kästchen.
Läuft bei mir bei 1024*768 um die 170 frames
bei 800*600 über 200 frames.
Ich hoffe der code ist nicht zu unübersichtlich ;)

Code (glbasic) Select
// --------------------------------- //
// Project: Bugtest
// Start: Thursday, March 15, 2007
// IDE Version: 4.126









// Auflösung mauell erstellen
// Finde ich Fexibler als von der IDE aus
@Grafik_var:
GLOBAL winx = 1024
GLOBAL winy = 768
GLOBAL winmode = 1

SETSCREEN winx,winy,winmode

// Bildwiedholfrequenz einstellen
// -1 = Vsync off
GLOBAL vsync = -1
LIMITFPS vsync


@scrolling_var:
// Variablen für das Scrolling erstellen
GLOBAL posx = 0
GLOBAL posy = 0



// Bild als Tile in der Grösse 64x64 erstellen, nur für Demozwecke
// Das zeite Fillrect wird für die Tranparenz erzeugt, so das man nur
// noch die Randlinien sieht



// Dreidimensionales Array erstellen, Dass Array solte man such wie ein
// Schachbrett oder eine Exeltabele vorstellen.
// Die Dritte Dimension steht für die Layer
// Das feld hier ist also 2000 lang und 2000 hoch

@MapArray:
GLOBAL mapx = 2000
GLOBAL mapy = 2000
GLOBAL maplayer = 5

DIM level[mapx][mapy][maplayer]
// Variablen um 1 zurücksetzen da von 0/NULL angefangen wird zu zählen
DEC mapx,1
DEC mapy,1
DEC maplayer,1

GLOBAL tile = 32





// Map zufällig erstellen
FOR iz = 0 TO maplayer
FOR iy = 0 TO mapy
FOR  ix = 0 TO mapx
level[ix][iy][iz] = RND(20)
NEXT
NEXT
NEXT




@Grund_var:
GLOBAL posx = 0
GLOBAL posy = 0

GLOBAL move_posx
GLOBAL move_posy
// Variable für gettimer()

GLOBAL time
GLOBAL multip = 0.07  //Multiplikator für scrolling/bewegung

@GFX_Laden:

FILLRECT 0,0,32,32,RGB(200,100,20) //Map
GRABSPRITE 0,0,0,32,32
FILLRECT 0,0,32,32,RGB(100,200,20) //Map
GRABSPRITE 1,0,0,32,32
FILLRECT 0,0,32,32,RGB(200,200,200) //Map
GRABSPRITE 2,0,0,32,32
FILLRECT 0,0,32,32,RGB(255,5,255)
GRABSPRITE 3,0,0,32,32
FILLRECT 0,0,32,32,RGB(150,20,20) //Map
GRABSPRITE 4,0,0,32,32

FILLRECT 0,0,32,32,RGB(255,255,255)// Player
GRABSPRITE 5,0,0,32,32


BLACKSCREEN

GLOBAL playercount = 0  // Damit der player in der for schleife nur 1x gezeichnet wird

//--------------------------------------------------------------------------------------------
//############################################################################################
//--------------------------------------------------------------------------------------------







////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//*********************************         Hauptschleife      ***********************************************//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////

GLOBAL starty,startx,maxy,maxx
main:
WHILE TRUE
time  = GETTIMER()
move_posx = time*multip
move_posy = time*multip



updatefor()


// Tasten für scrolling abfragen und Posx/x verschieben
fmove()


FOR iz = 0 TO 1 // Maplayer 1 und 2
FOR iy = starty TO maxy
FOR ix = startx TO maxx

IF level[ix][iy][0] = 1 THEN SPRITE 0,posx+tile*ix,posy+tile*iy
IF level[ix][iy][1] = 1 THEN SPRITE 1,posx+tile*ix,posy+tile*iy

NEXT
NEXT
NEXT



//FOR iz = 3 TO maplayer // maplayer 3 /Collisions ebene
FOR iy = starty TO maxy
FOR ix = startx TO maxx


IF level[ix][iy][2] = 1 THEN SPRITE 2,posx+tile*ix,posy+tile*iy


NEXT
NEXT
//NEXT

SPRITE 5,100,100 // Player zeichnen



FOR iz = 3 TO 4 // maplayer 4 und 5
FOR iy = starty TO maxy
FOR ix = startx TO maxx


IF level[ix][iy][3] = 1 THEN SPRITE 3,posx+tile*ix,posy+tile*iy
IF level[ix][iy][4] = 1 THEN SPRITE 4,posx+tile*ix,posy+tile*iy

NEXT
NEXT
NEXT





PRINT getfps()+" Frames",10,10
PRINT startx,10,30
PRINT starty,10,50
PRINT maxx,10,70
PRINT maxy,10,90
PRINT mapx,10,110
PRINT mapy,10,120


SHOWSCREEN
WEND
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//*****************************          ENDE        *********************************************************//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////

@functionen:

FUNCTION fmove:
IF KEY(205) THEN  posx = posx-move_posx
IF KEY(203) THEN  posx = posx + move_posx
IF KEY(208) THEN  posy = posy-move_posy
IF KEY(200) THEN  posy = posy + move_posy

IF posx > 0 THEN posx = 0
IF posy > 0 THEN posy = 0

IF posx < INTEGER((0-(tile*mapx))) + winx THEN posx = INTEGER((0-(tile*mapx)) + winx)
IF posy < INTEGER((0-(tile*mapy))) + winy THEN posy = INTEGER((0-(tile*mapy)) + winy)
ENDFUNCTION



GLOBAL startx,starty,maxx,maxy
FUNCTION updatefor:
startx = INTEGER(ABS(posx/tile))
starty = INTEGER(ABS(posy/tile))

maxx =  INTEGER(startx + (winx/tile + tile))
IF maxx > mapx THEN maxx = mapx
maxy =  INTEGER(starty + (winy/tile + tile))
IF maxy > mapy THEN maxy = mapy


ENDFUNCTION













FUNCTION updatefps:
STATIC fps_time,fps_counter,fps,fps_temp
fps_time = GETTIMERALL()
fps_counter = fps_counter + 1
IF (fps_time-fps_temp)>1000
fps_temp = fps_time
fps = fps_counter
fps_counter = 0
ENDIF

ENDFUNCTION


FUNCTION getfps:

STATIC fps_time,fps_counter,fps,fps_temp
fps_time = GETTIMERALL()
fps_counter = fps_counter + 1
IF (fps_time-fps_temp)>1000
fps_temp = fps_time
fps = fps_counter
fps_counter = 0
ENDIF

RETURN fps
ENDFUNCTION


FUNCTION KeyHitUpdate:
GLOBAL gKeyDown[], gKeyState[]
LOCAL  k
LOCAL i
    // First Time call/ zum ersten Mal hier
    IF BOUNDS(gKeyDown[],0)=0
        DIM gKeyDown[256]
        DIM gKeyState[256]
    ENDIF

    // For each key / für jede Taste
    FOR i=0 TO 255
        k = KEY(i)
        // Key is pressed / Taste ist gedrückt
        IF k
            IF gKeyDown[i]
                gKeyState[i]=1
            ELSE
                gKeyDown[i]=1
                gKeyState[i]=2
            ENDIF
        ELSE
            // Key is not pressed / Taste nicht gedrückt

            // Has key been pressed before?
            // War die Taste gedrückt?
            IF gKeyDown[i]
                gKeyDown[i] = 0
                gKeyState[i] = -1
            ELSE
                gKeyState[i]=0
            ENDIF
        ENDIF
    NEXT
ENDFUNCTION





//  0 = not pressed / nicht gedrückt
//  2 = just pressed / gerade runtergedrückt
//  1 = pressed / gedrückt (gehalten)
// -1 = release event / wieder losgelassen
FUNCTION KeyHit: nkey
    RETURN gKeyState[nkey]
ENDFUNCTION
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Schranz0r

hmm dann hab ich wohl nen scheiss gemacht?!?!?
 
Bei 2000x2000 Tiles 170 FPS o.O WOW

Naja schauts euch doch mal selber an ....

http://www.styleattax.de/game/?download=THCEditor004b.rar

Hat auch nen tollen Namen für nen Shooter ^^

EDIT:

Map Laden mit "L" und "map1" eingeben !
Debuger mit "D" aktivieren/deaktivieren
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

KidPaddle

Habe mal das Beispiel von Slayer auf eine MAP - Größe von 200x200 reduziert und für dem GP2X kompiliert. Dort werden durchschnittlich ca. 36 FPS erreicht, bei ca. 650-700 angezeigten 32x32 - Tiles.

Leider werden auf dem GP2X im oberen fünftel des Bildschirm fehlerhafte Sprites angezeigt. Die Grafiken erscheinen bunt, also mit mehreren Farben in einem Tile. In einem anderen, für den GP2X entwickelten Spiel (Beta!!), http://www.seban.de/download/x1945.zip , tauchen die selben Fehler am oberen Bildschirmrand auf. Achtung, der erste Level kann nur durch ausschalten des Gerätes beendet werden, ist noch in der Entwicklung. In der PC - Version funktioniert alles.

Gruß
Thomas
Intel CoreDuo 6300, GT 7950 512MB, 2 GB Ram, XP SP2
GP2X MK1, Firmware 2.0.0

Kitty Hello


KidPaddle

Intel CoreDuo 6300, GT 7950 512MB, 2 GB Ram, XP SP2
GP2X MK1, Firmware 2.0.0

Kitty Hello

Jup! Bug. Behoben. Bin gerade dabei ein Update hochzuladen. Sorry.

Sieht schon super aus! Bin schon gespannt auf die ersten "Formationen".

D2O

Hi Schranz0r,
Deins lauft bei mir mit 150fps, das ist doch schon mal nicht schlecht :)
Ach, und das schaut echt gut aus, mein JDedit wird nich so schön.

Ich hab mir den Code jetzt noch nicht so durchgeschaut, komm gerade von der maloche :(
Wenn ich morgen etwas mehr zeit habe schau ich ihn mir mal genauer an.

Noch was zur grösse der Map, die spielt hier keine rolle, da die for schleifen eh nur das durchlaufen lassen was im Bildschirmbereich liegt.
Wichtig sind auch wie oft die sprite und print befehle aufgerufen werden.

Um speed zu bekommen könnte man auch das dahinterliegende Layer als 64*64 oder 128*128 aufen lassen, das pusht :) allerding wächst dafür auch der speicher bedarf im Vram, aber das sollte heutzutage kein problem darstellen

@all, es wär nicht schlecht wenn man in der Signatur die groben Hartware daten mit rein schreibt.

@Gernot, gibts da irgendwo ein Befehl um die Speichergrössen anzuzeigen lassen, oder ich hab den übersehen?
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Kitty Hello

Aktuellen Speicher gibt's nicht zu sehen. Grafikspeicher ist gar nicht möglich, der andere hmpf... Bei einem Spiel würd' ich sagen: Läuft's nicht, ist die Kiste zu alt. ;)

Kitty Hello

Aktuellen Speicher gibt's nicht zu sehen. Grafikspeicher ist gar nicht möglich, der andere hmpf... Bei einem Spiel würd' ich sagen: Läuft's nicht, ist die Kiste zu alt. ;)

KidPaddle

Der Internet - Updater meldet, das keine aktuelle Version vorliegt. Ist 4.131 die aktuelle Version?
Gruß
Thomas
Intel CoreDuo 6300, GT 7950 512MB, 2 GB Ram, XP SP2
GP2X MK1, Firmware 2.0.0

D2O

I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell