GLBasic forum

Main forum => Bug Reports => Topic started by: D2O on 2010-May-12

Title: GP2X Scrolling Bug
Post by: D2O on 2010-May-12
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)
Title: Re: GP2X Scrolling Bug
Post by: Schranz0r on 2010-May-12
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!
Title: Re: GP2X Scrolling Bug
Post by: D2O on 2010-May-12
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.
Title: Re: GP2X Scrolling Bug
Post by: Kitty Hello on 2010-May-13
Wenn bug, bitte ganz kleines Beispiel machen.
Title: Re: GP2X Scrolling Bug
Post by: D2O on 2010-May-13
Hmmm das ist jetzt echt schwierig für mich.
Folgender simpler Code geht.
Code (glbasic) Select

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:

Code (glbasic) Select

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:
Code (glbasic) Select

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.