GLBasic forum

Other languages => GLBasic - de => Topic started by: Schranz0r on 2007-Mar-19

Title: Tilemap mit 3 Layern..... Spieler auf Layer 2 Laufen lassen ?!
Post by: Schranz0r on 2007-Mar-19
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
Title: Tilemap mit 3 Layern..... Spieler auf Layer 2 Laufen lassen ?!
Post by: Kitty Hello on 2007-Mar-19
Schau, welcher Bereich (xmin, xmax und ymin bis ymax sichtbar ist, dann zeichne nur die, die darin sind.
Title: Tilemap mit 3 Layern..... Spieler auf Layer 2 Laufen lassen ?!
Post by: Schranz0r on 2007-Mar-19
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 !
Title: Tilemap mit 3 Layern..... Spieler auf Layer 2 Laufen lassen ?!
Post by: Kitty Hello on 2007-Mar-20
Mach die layer ancheinander und zeichne dazwischen alle Spieler. <50FPS kann bei 100x100 mit 32x32 gar nicht sein. Das ist ja nicht viel Zeugs.
Title: Tilemap mit 3 Layern..... Spieler auf Layer 2 Laufen lassen ?!
Post by: D2O on 2007-Mar-20
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
Title: Tilemap mit 3 Layern..... Spieler auf Layer 2 Laufen lassen ?!
Post by: Schranz0r on 2007-Mar-20
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
Title: Tilemap mit 3 Layern..... Spieler auf Layer 2 Laufen lassen ?!
Post by: KidPaddle on 2007-Mar-20
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
Title: Tilemap mit 3 Layern..... Spieler auf Layer 2 Laufen lassen ?!
Post by: Kitty Hello on 2007-Mar-20
Welche GLBasic Version hast Du?
Title: Tilemap mit 3 Layern..... Spieler auf Layer 2 Laufen lassen ?!
Post by: KidPaddle on 2007-Mar-20
Die letzte, 4.131.

Gruß
Thomas
Title: Tilemap mit 3 Layern..... Spieler auf Layer 2 Laufen lassen ?!
Post by: Kitty Hello on 2007-Mar-20
Jup! Bug. Behoben. Bin gerade dabei ein Update hochzuladen. Sorry.

Sieht schon super aus! Bin schon gespannt auf die ersten "Formationen".
Title: Tilemap mit 3 Layern..... Spieler auf Layer 2 Laufen lassen ?!
Post by: D2O on 2007-Mar-20
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?
Title: Tilemap mit 3 Layern..... Spieler auf Layer 2 Laufen lassen ?!
Post by: Kitty Hello on 2007-Mar-21
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. ;)
Title: Tilemap mit 3 Layern..... Spieler auf Layer 2 Laufen lassen ?!
Post by: Kitty Hello on 2007-Mar-21
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. ;)
Title: Tilemap mit 3 Layern..... Spieler auf Layer 2 Laufen lassen ?!
Post by: KidPaddle on 2007-Mar-21
Der Internet - Updater meldet, das keine aktuelle Version vorliegt. Ist 4.131 die aktuelle Version?
Gruß
Thomas
Title: Tilemap mit 3 Layern..... Spieler auf Layer 2 Laufen lassen ?!
Post by: D2O on 2007-Mar-21
Ich hab 4.132.
Title: Tilemap mit 3 Layern..... Spieler auf Layer 2 Laufen lassen ?!
Post by: Kitty Hello on 2007-Mar-21
Oops! ;)
Title: Tilemap mit 3 Layern..... Spieler auf Layer 2 Laufen lassen ?!
Post by: Schranz0r on 2007-Mar-21
@Slayer

Schön das dir der Editor gefällt ;)
Wenn du bock hast kannst ja gerne mit machen bei dem Game  ^^
Das mit den "dahinter liegenden Layern größer machen", ist net so das was ich will, weil das ja der Bodenlayer ist, und ich damit Wege usw einzeichne.

Mit der Signatur hast du recht, werd ich bei mir mal einfügen !

@ Gernot

Kommt schon mal vor ^^
Title: Tilemap mit 3 Layern..... Spieler auf Layer 2 Laufen lassen ?!
Post by: Kitty Hello on 2007-Mar-21
Meine Rechnerspec. ist zum Davonlaufen ;)
Title: Tilemap mit 3 Layern..... Spieler auf Layer 2 Laufen lassen ?!
Post by: Schranz0r on 2007-Mar-21
Na meiner ist ja auch nicht viel besser ;)
Title: Tilemap mit 3 Layern..... Spieler auf Layer 2 Laufen lassen ?!
Post by: KidPaddle on 2007-Mar-21
Hallo Gernot,

bin ja ungern überbringer von schlechten Nachrichten, der von mir mitgeteilte Bug ist weg, aber jetzt sind die Tile in 2 Farben aufgespilttet, die oberen 32x16 haben die gewünschte Farbe, die unteren 32x16 sind schwarz und zwar gilt das für alle Tiles, egal wo auf dem Bildschirm die Tiles angeordnet sind. Auf dem PC sind die Tiles 32x32 groß und einfarbig.

Das seltsame ist, dass in dem Spiel x1945 der Fehler nicht mehr vorhanden ist und die Grafiken korrekt angezeigt werden.

Gruß
Thomas
Title: Tilemap mit 3 Layern..... Spieler auf Layer 2 Laufen lassen ?!
Post by: Kitty Hello on 2007-Mar-21
Bitte Projekt mit Fehler hochladen, damit ich's testen kann.
Title: Tilemap mit 3 Layern..... Spieler auf Layer 2 Laufen lassen ?!
Post by: KidPaddle on 2007-Mar-22
Hallo Gernot,

unter http://www.seban.de/download/BugTest.zip ist das Projekt verfügbar. Es ist der Quelltext von Slayer, nur das hier die Auflösung und die MAP-Größe auf 200x200 angepasst wurden.

Die Datei enthält eine PC und GP2X - Version.

Gruß
Thomas
Title: Tilemap mit 3 Layern..... Spieler auf Layer 2 Laufen lassen ?!
Post by: Kitty Hello on 2007-Mar-30
Bei den Projekt-Optionen war eine Auflösung von 640x480 eingestellt für GP2X. Hab' den Fall trotzdem abgefangen in der neuen Version.