06-04-2003, 07:23 PM
OK, I'm in my college CS class and I'm really bored, so I went and programmed a scroller. The problem is... I get 16 FPS and it's not even full screen. Here I thought my DrawSprite routine was fast... anyway, here's the code, try to get it zippity zappy. If you have to convert the graphics to N13 (double the memory, no more DEF SEG though) so be it.
Code:
DEFINT A-Z
'$DYNAMIC
DECLARE SUB DrawSprite (Sprite(), X, Y, frame)
DECLARE SUB nPrint (Xpos%, Ypos%, Text$, col%)
DECLARE SUB Scroll ()
DIM SHARED buffer(32001), lutsegy(199) AS LONG, Map(21, 14), CamX, CamY
buffer(0) = 2560: buffer(1) = 200
CONST minXXwin = 99, minYYwin = 49
CONST maxXXwin = 219, maxYYwin = 149
FOR n& = 0 TO 199
lutsegy(n&) = n& * 320 + 4
NEXT
SCREEN 13
FOR Y = 0 TO 15
FOR X = 0 TO 15
PSET (X, Y), RND * 15 + 16
NEXT
NEXT
DIM SHARED tiles((16 * 16) \ 2 + 1)
GET (0, 0)-(15, 15), tiles
t# = TIMER
DO
Scroll
nPrint 100, 20, "Mmm, Scrolling...", 24
PUT (0, 0), buffer, PSET
REDIM buffer(32001): buffer(0) = 2560: buffer(1) = 200
CamX = CamX + 1
CamY = CamY + 1
LOOP UNTIL LEN(INKEY$)
PRINT CamX / (TIMER - t#)
SUB DrawSprite (Sprite(), X, Y, frame)
DIM addr AS LONG
TileW = Sprite(0) \ 8
TileH = Sprite(1)
TW = TileW - 1
TH = TileH - 1
TF = frame - 1
TP = TileW * TileH
IF TF AND 1 THEN
ToffsBYT = (frame * 4) + TF + TP * TF
ELSE
ToffsBYT = frame * 4 + TP * TF
END IF
xLeft = X
xRight = X + TW
yTop = Y
yBot = Y + TH
IF xLeft < minXXwin THEN
sum = minXXwin - xLeft
IF sum < 0 THEN sum = -sum
IF sum > TW THEN EXIT SUB
CLIPadd = sum
CLIPleft = sum
xLeft = minXXwin
END IF
IF xRight > maxXXwin THEN
sum = xRight - maxXXwin
IF sum < 0 THEN sum = -sum
IF sum > TW THEN EXIT SUB
CLIPadd = sum
xRight = maxXXwin
END IF
IF yTop < minYYwin THEN
sum = minYYwin - yTop
IF sum > TH THEN EXIT SUB
CLIPtop = sum * TileW
yTop = minYYwin
END IF
IF yBot > maxYYwin THEN
sum = yBot - maxYYwin
IF sum > TH THEN EXIT SUB
yBot = maxYYwin
END IF
t = ToffsBYT + CLIPleft + CLIPtop
addr = lutsegy(yTop)
FOR yy = yTop TO yBot
FOR xx = xLeft TO xRight
DEF SEG = VARSEG(Sprite(0))
c = PEEK(t)
DEF SEG = VARSEG(buffer(0))
POKE addr + xx, c
t = t + 1
NEXT
t = t + CLIPadd
addr = addr + 320
NEXT
END SUB
REM $STATIC
SUB nPrint (Xpos%, Ypos%, Text$, col%)
X% = Xpos%
Y% = Ypos%
FOR I% = 0 TO LEN(Text$) - 1
X% = X% + 8
Offset% = 8 * ASC(MID$(Text$, I% + 1, 1)) + 14
FOR J% = 0 TO 7
DEF SEG = &HFFA6
Bit% = PEEK(Offset% + J%)
DEF SEG = VARSEG(buffer(0))
IF Bit% AND 1 THEN POKE X% + lutsegy(Y% + J%), col% + J%
IF Bit% AND 2 THEN POKE X% - 1 + lutsegy(Y% + J%), col% + J%
IF Bit% AND 4 THEN POKE X% - 2 + lutsegy(Y% + J%), col% + J%
IF Bit% AND 8 THEN POKE X% - 3 + lutsegy(Y% + J%), col% + J%
IF Bit% AND 16 THEN POKE X% - 4 + lutsegy(Y% + J%), col% + J%
IF Bit% AND 32 THEN POKE X% - 5 + lutsegy(Y% + J%), col% + J%
IF Bit% AND 64 THEN POKE X% - 6 + lutsegy(Y% + J%), col% + J%
IF Bit% AND 128 THEN POKE X% - 7 + lutsegy(Y% + J%), col% + J%
NEXT J%
NEXT I%
END SUB
SUB Scroll
CamXtile = CamX \ 16
CamYtile = CamY \ 16
ppX = CamX AND 15
ppY = CamY AND 15
FOR Y = 0 TO 14
FOR X = 0 TO 21
'xt = x + CamXtile
tile = Map(X, Y) + 1
DrawSprite tiles(), X * 16 - ppX, Y * 16 - ppY, tile
NEXT
NEXT
END SUB