Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Help with mode7
#1
Hi!

After reading an old tutorial by Eclipzer I found on my HD, and studying Toshi's floormapper code I made a simple and slow floormapper, use A,Z to adjust height, and use arrow keys to move around.

Code:
DEFINT A-Z
'$DYNAMIC
DIM SHARED scrnbuff(32001)       AS INTEGER  'Screen buffer
CONST XCenter = 160
CONST YCenter = 100

SCREEN 13


'Read map data
DIM map(15, 15)
FOR y = 0 TO 15
  FOR x = 0 TO 15
    READ map(x, y)
  NEXT
NEXT

'Make 3 textures
DIM tex(2, 15, 15)
FOR n = 0 TO 2
FOR y = 0 TO 15
  FOR x = 0 TO 15
    tex(n, x, y) = x XOR y + 16 * (n + 1)
  NEXT
NEXT
NEXT
      
h = -20
d = 256
uoff = 128
DEF SEG = VARSEG(scrnbuff(0))                'Make sure I poke to the
                                             'buffer
  DO
  
    k$ = INKEY$

    REDIM scrnbuff(32001) AS INTEGER                '|CLS
    scrnbuff(0) = 2560 'Set buffer length (320 * 8) '|
    scrnbuff(1) = 200  'Set buffer height           '|

    'Do keyboard stuff
    xkey = INP(&H60)
    clearbuffer$ = INKEY$
    '
    IF xkey = 30 THEN h = h - 1                 'Z
    IF xkey = 44 AND h - 1 < 0 THEN h = h + 1   'A
  
    IF xkey = &H48 THEN voff = voff + 1
    IF xkey = &H50 THEN voff = voff - 1
    IF xkey = &H4B THEN uoff = uoff - 1
    IF xkey = &H4D THEN uoff = uoff + 1
    
    'Render screen
    FOR y = 0 TO 99
      v = d * h \ (h - y) + voff
      FOR x = 0 TO 319
        u = (x - XCenter) * h \ (h - y) + uoff

        mapx = ABS((u \ 16) MOD 16)
        mapy = ABS((v \ 16) MOD 16)
        tile = map(mapx, mapy)
      
        POKE (y + YCenter) * 320& + 4 + x, tex(tile, u AND 15, v AND 15)
      NEXT
    NEXT
    WAIT &H3DA, 8: WAIT &H3DA, 8, 8
    PUT (0, 0), scrnbuff(0), PSET

  LOOP UNTIL k$ = CHR$(27)

END

'Map data
DATA 2,2,2,2,2,2,1,0,0,1,2,2,2,2,2,2
DATA 2,2,2,2,2,2,1,0,0,1,2,2,2,2,2,2
DATA 2,2,2,2,2,2,1,0,0,1,2,2,2,2,2,2
DATA 2,2,2,2,2,2,1,0,0,1,2,2,2,2,2,2
DATA 2,2,2,2,2,1,1,0,0,1,1,2,2,2,2,2
DATA 2,2,2,2,1,1,1,0,0,1,1,1,2,2,2,2
DATA 1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1
DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0
DATA 1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1
DATA 2,2,2,2,1,1,1,0,0,1,1,1,2,2,2,2
DATA 2,2,2,2,1,1,1,0,0,1,1,2,2,2,2,2
DATA 2,2,2,2,2,2,1,0,0,1,2,2,2,2,2,2
DATA 2,2,2,2,2,2,1,0,0,1,2,2,2,2,2,2
DATA 2,2,2,2,2,2,1,0,0,1,2,2,2,2,2,2
DATA 2,2,2,2,2,2,1,0,0,1,2,2,2,2,2,2

However I can't figure out how to make the map rotate :???: , help would be much appreciated.

/DarkShark
Reply
#2
Tip:

Use AND 15 instead of MOD 16

Intro of game:
http://rel.betterwebber.com/junk.php?id=11

For a better looking one:
http://rel.betterwebber.com/junk.php?id=1

Sub Mode7....

Re: Rotation:

Use Sin/Cos as an offset of the rasterizer.
ie. Instead of lineary doing x and y, do an mx=mx+cos(ang) and my=my+sin(ang)
y smiley is 24 bit.
[Image: anya2.jpg]

Genso's Junkyard:
http://rel.betterwebber.com/
Reply
#3
Sorry, double post. :*)

Code:
'Mode 7 using pset and fix point math. :*)
'Relsoft
DECLARE SUB Mode7 (scalex%, Scaley%, Scalez%, horz%, Angle%, px%, py%, Ls!(), Lc!())
DEFINT A-Z

DIM SHARED Lcos!(359)
DIM SHARED Lsin!(359)
DIM SHARED Texture%(63, 63)

Layer1% = VARSEG(Vpage1%(2))
Offs1% = VARPTR(Vpage1%(2))

FOR I% = 0 TO 359
    RA! = I% * (3.141593 / 180)
    Lcos!(I%) = COS(RA!)
    Lsin!(I%) = SIN(RA!)
NEXT I%



FOR y = 0 TO 63
FOR x = 0 TO 63
    Texture%(x, y) = (4 * SQR((x - 32) ^ 2 + (y - 32) ^ 2)) AND 255
NEXT
NEXT


CLS
SCREEN 13


FOR I = 0 TO 255
OUT &H3C8, I
OUT &H3C9, I \ 8
OUT &H3C9, I \ 4
OUT &H3C9, I \ 8
NEXT I

sx% = 256           'scale
sy% = 256           'scale
sz% = 15
horz% = 5

COLOR 245
LOCATE 1, 1
PRINT "Control with: CTRL,ALT,SHIFT"

T# = TIMER

DO
    F& = (F& + 1) AND &H7FFFFFFF
    DEF SEG = 0
    K$ = INKEY$
    IF PEEK(1047) AND 4 THEN
       Angle% = (Angle% - 1)
       IF Angle% < 0 THEN Angle% = 360 + Angle%
    END IF
    IF PEEK(1047) AND 8 THEN
       Angle% = (Angle% + 1)
       IF Angle% > 359 THEN Angle% = 360 - Angle%
    END IF
    IF PEEK(1047) AND 2 THEN
        px% = px% + Lcos!(Angle%) * 3
        py% = py% + Lsin!(Angle%) * 3
    END IF
    IF PEEK(1047) AND 1 THEN
    END IF
    Mode7 sx%, sy%, sz%, horz%, Angle%, px%, py%, Lsin!(), Lcos!()
LOOP UNTIL K$ = CHR$(27)

Fps% = F& / (TIMER - T#)

CLS
SCREEN 0
WIDTH 80
PRINT "FPS:"; Fps%
c$ = INPUT$(1)

SUB Mode7 (scalex%, Scaley%, Scalez%, horz%, Angle%, px%, py%, Ls!(), Lc!()) STATIC
'Precalc constants
xv& = Lc!(Angle%) * 256
yv& = Ls!(Angle%) * 256

ts% = Scalez% * Scaley%
tsl& = ts% * 256&
FOR ya% = 0 TO 99
        distance& = (tsl&) \ ((ya% + horz%))
        HorizScale& = (distance& \ (scalex%))
        LineDx& = (-yv& * HorizScale&)
        LineDy& = (xv& * HorizScale&)
        spacex& = ((distance& * xv&)) - (160 * LineDx&)
        spacey& = ((distance& * yv&)) - (160 * LineDy&)
        spacex& = spacex& + px% * 65536
        spacey& = spacey& + py% * 65536

FOR xa% = 0 TO 319
        xx% = spacex& \ 65536
        yy% = spacey& \ 65536
        xx% = xx% AND 63
        yy% = yy% AND 63
        PSET (xa%, 100 + ya%), Texture%(xx%, yy%)
        spacex& = spacex& + LineDx&
        spacey& = spacey& + LineDy&
NEXT xa%
NEXT ya%


END SUB
y smiley is 24 bit.
[Image: anya2.jpg]

Genso's Junkyard:
http://rel.betterwebber.com/
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)