Beim Levelscrolling wird normal immer ein Tile stück auserhalb des Screens gezeichnet so das kein "Aufploppen" des Leveltiles
sichtbar ist, unter Win funktionierts, aber beim GP2X eben nicht.
Das schaut nicht schön aus.
Der Code von beiden versionen ist der gleiche bis auf 2 Variablen die die Tilegrösse bestimmen und eine function
die für die sys.ini mit Pfadangaben zuständig ist.
Link zu den Dateien und mehr gibts hier:
http://www.glbasic.com/forum/index.php?topic=4416.0 (http://www.glbasic.com/forum/index.php?topic=4416.0)
Hmm beim GP2X ist ja die Auflösung anders so das du wohl die Tiles in x und y richtung +1 nehmen musst :)
Wenn du beide Version haben willst aber nur einen Code dafür erstellst(was auch Sinn macht), schau dir mal die Präprozessor Befehle an!
Ja, genau das mach ich auch, es wird immer nur das gezeichnet was im Screen sichtbar ist plus jeweils auf der X und Y aches eine
reihe/linie dazu.
Auflösung und Levelgrösse spielen hier keine rolle, das habe ich mir Flexibel gehalten so das der Screen auch 200x100
oder 2xxx * 2xxx usw sein kann.
Werde morgen mal für den GP2X das ganze um zwei linien erweitern und schauen was da raus kommt.
Wenn bug, bitte ganz kleines Beispiel machen.
Hmmm das ist jetzt echt schwierig für mich.
Folgender simpler Code geht.
GLOBAL a[]
DIM a[60]
DRAWRECT 0,0,32,32,RGB(0xff, 0x00, 0x00)
DRAWRECT 1,1,30,30,RGB(0xdf, 0xa4, 0xaf)
GRABSPRITE 0,0,0,32,32
CLEARSCREEN
GLOBAL sx%,sy%
GETSCREENSIZE sx,sy
GLOBAL posx%,x%,y%,z%
GLOBAL startx%,endex%,a_count%
WHILE TRUE
IF KEY(205)
DEC posx,2
ENDIF
IF KEY(203)
INC posx,2
ENDIF
startx = ABS(posx/32)
IF startx < 0 THEN startx = 0
IF startx > LEN(a[])-1 THEN startx = LEN(a[])-1
endex = (startx + sx / 32)
IF endex > LEN(a[])-1 THEN endex = LEN(a[])-1
IF posx > 0 THEN posx = 0
// IF posx < 0 - 250 * 32 + 1024 THEN posx = 0 - 250 * 32 + 1024
//-------------------------------------------------------------------------
FOR x = startx TO endex
DRAWSPRITE 0,posx + x*32 ,60
NEXT
//-------------------------------------------------------------------------
PRINT "for i = "+startx+" to "+endex,10,10
SHOWSCREEN
WEND
Das ist eigendlich der Grundcode auf dem ich das ganze später immer wieder aufgebaut habe.
Nun habe ich gestern ja erwähnt das ich im Aktuellen Project immer ein Tile auserhalb des Screens mit zeichne,
um das aufploppen zu verhindern.
Das hat ja beim GP2X trotzdem aufgeploppt.
Nun habe ich das ganze erhöht, so das nun 2 Tiles weiter gezeichnet wird.
Nun klappt das auch beim GP2X.
Die Funktion die ich dazu benutze ist folgende:
FUNCTION F_LEVEL_IN_SCREEN AS Tlevpos : l_go AS Tlevpos , l_win AS Tsys, l_level AS Tsmp
// l_go.sx|y = startpunkt für die For schleife
// l_level.posx|y = die Grungkordinaten wo alles dranhängt
// l_level.tilex|y = die Gittergrösse der Tilemap 32x32, 22x22,....usw
// l_level.width|hight = anzahl der gitter in der map
// wenn die map nun dim a[31][31] ist,
// wäre l_level.width = 31 | hight = 31
// l_win.x|y = die Bildschirmauflösung
l_go.sx = ABS(l_level.posx/l_level.tilex)
IF l_go.sx < 0 THEN l_go.sx = 0
IF l_go.sx > l_level.width THEN l_go.sx = l_level.width
l_go.sy = ABS(l_level.posy/l_level.tiley)
IF l_go.sy < 0 THEN l_go.sy = 0
IF l_go.sy > l_level.hight THEN l_go.sy = l_level.hight
l_go.ex = l_go.sx + l_win.x/l_level.tilex + 2 ///<<<<<<<<<< geändert von 1 auf 2
IF l_go.ex > l_level.width THEN l_go.ex = l_level.width
l_go.ey = l_go.sy + l_win.y/l_level.tiley + 2 ///<<<<<<<<<< geändert von 1 auf 2
IF l_go.ey > l_level.hight THEN l_go.ey = l_level.hight
RETURN l_go /// Rückgabewerte vom Type Tlevpos um die Start und endwerte für die Forschleife zu haben
ENDFUNCTION
Die for schleife ist dann so aufgebaut:
FOR level.j = go.sy TO go.ey-1 //level.hight - 1 // Y Achse // -1 damit man nicht ausserhalb des DIM bereichs kommt.
FOR level.i = go.sx TO go.ex-1 //level.width - 1 // X Achse
///-----Code---
NEXT
NEXT
Vieleicht ist es nun ein Bug bei mir, aber es wundert mich das es unter Windows läuft und der kleine Zickt.
Bei bedarf, kann ich für "Gernot only" mal die gesamte Projektdatei hochladen.