' ÉÍÍÍÍÍÍÍÍÍÍÍÍÍ» Programmed by: ' º JSCROLL.BAS º John Wilbert Villamor ' ÈÍÍÍÍÍÍÍÍÍÍÍÍͼ October 30, 2010 ' CopyLeft 2008 - 2010 Crap Systems Inc. ' This is one of the coolest and fastest pixel-to-pixel scroller ' engines i have ever made compared to other scroller engines which is slow ' and required external libraries but this one runs at full 70 frames per ' second in a Cyrix MII 333MHz computer with FFIX.COM loaded due to the ' floating point calculations with no stinking DirectQB or any other library ' exept for QB.QLB and QB.LIB. ' The only problem with this is the hit detection system. Its up to you ' to add a hit detection system since it will mostly slow the engine a lot ' with matrix search while the level is rendered, using POINT is crappy. ' Im still experimenting with a fast pixel to pixel and will add it later. ' Program features: ' - Cool scrolly thing. ' - No sub or function mouse routine (with QB.QLB and QB.LIB). ' - ANDXOR routine already implemented from Mario LaRosa. ' - No stinking libraries needed. ' Controls: ' Mouse Movement - Move the cursor and scroll around the map. ' ESC - Quit. ' ============================================================================ ' More memory and speed DEFINT A-Z ' More memory '$DYNAMIC ' SUB Declarations DECLARE SUB VGASEE () DECLARE SUB VGASET () DECLARE SUB VGAPUT (ARRAY(), xxLEFT, yyTOP, frame) ' User types TYPE CameraType X AS SINGLE Y AS SINGLE END TYPE TYPE PlayerType X AS SINGLE Y AS SINGLE END TYPE ' Global variables COMMON SHARED VGA(), VXL, VYT, VXR, VYB COMMON Camera AS CameraType COMMON Player AS PlayerType ' Array for the ANDXOR routine DIM SHARED VGA(32007) ' Array for the map DIM Map(64, 64) ' Array for the cool tile DIM Tile(20, 20) ' Set the timer for the FPS counter ON TIMER(1) GOSUB UpdateFPS RANDOMIZE TIMER VGASET ' Draw a cool looking tile and GET it FOR Dy = 1 TO 20: Col = 31 + Dy: FOR Dx = 1 TO 20 PSET (Dx, Dy), Col: Col = Col + 1 NEXT Dx: NEXT Dy GET (1, 1)-(20, 20), Tile ' Make a random 64X64 map FOR My = 1 TO 64: FOR Mx = 1 TO 64 Map(Mx, My) = INT(RND * 4) - 2 PSET (Mx, My), Map(Mx, My) NEXT Mx: NEXT My LINE (0, 0)-(319, 199), 0, BF ' Default variables Camera.X = 20: Camera.Y = 20 Player.X = 90: Player.Y = 90 ' Initialize the timer TIMER ON ' Main loop DO Press$ = UCASE$(INKEY$) ' A very cool mouse routine i found in a demo i got in this website: ' http://www.advsys.net/ken/klab.htm ' Just find LABDEMO2.BAS in the bottom of the page which is a super cool ' 3D raycaster demo and where i got this mouse routine. Regs(0) = 5: CALL INT86OLD(&H33, Regs(), Regs()): BStatus = Regs(0) Regs(0) = 11: CALL INT86OLD(&H33, Regs(), Regs()) LB = 0: RB = 0: MB = 0 SELECT CASE BStatus CASE 1: LB = 1 CASE 2: RB = 1 CASE 3: LB = 1: RB = 1 CASE 4: MB = 1 CASE 5: LB = 1: MB = 1 CASE 6: RB = 1: MB = 1 CASE 7: LB = 1: RB = 1: MB = 1 END SELECT ' Move the player with the mouse registers Player.X = Player.X + Regs(2) Player.Y = Player.Y + Regs(3) ' Some math calculations CamX! = Camera.X - Camera.X * 2 CamY! = Camera.Y - Camera.Y * 2 ' Don't let the player escape the map IF Player.X < 0 THEN Player.X = 0 IF Player.X > 1279 THEN Player.X = 1279 IF Player.Y < 0 THEN Player.Y = 0 IF Player.Y > 1279 THEN Player.Y = 1279 ' Move the camera with smooth scrolling FOR M = 0 TO 10 IF Player.X + CamX! < 150 - 10 * M AND Camera.X > -20 THEN Camera.X = Camera.X - 1 IF Player.X + CamX! > 170 + 10 * M AND Camera.X < 980 THEN Camera.X = Camera.X + 1 IF Player.Y + CamY! < 90 - 10 * M AND Camera.Y > -20 THEN Camera.Y = Camera.Y - 1 IF Player.Y + CamY! > 110 + 10 * M AND Camera.Y < 1100 THEN Camera.Y = Camera.Y + 1 NEXT M ' Render the 64X64 map BlockX! = CamX!: BlockY! = CamY! FOR Dy = 1 TO 64 FOR Dx = 1 TO 64 ' Put the tile if its within the screen boundaries IF BlockX! > 1 AND BlockX! < 299 THEN IF BlockY! > 1 AND BlockY! < 179 THEN SELECT CASE Map(Dx, Dy) CASE 1: PUT (BlockX!, BlockY!), Tile, OR END SELECT END IF END IF BlockX! = BlockX! + 20 NEXT Dx BlockX! = CamX! BlockY! = BlockY! + 20 NEXT Dy ' Draw the player as a cross LINE (Player.X - 1 + CamX!, Player.Y + CamY!)-(Player.X - 5 + CamX!, Player.Y + CamY!), 14 LINE (Player.X + 1 + CamX!, Player.Y + CamY!)-(Player.X + 5 + CamX!, Player.Y + CamY!), 14 LINE (Player.X + CamX!, Player.Y - 1 + CamY!)-(Player.X + CamX!, Player.Y - 5 + CamY!), 14 LINE (Player.X + CamX!, Player.Y + 1 + CamY!)-(Player.X + CamX!, Player.Y + 5 + CamY!), 14 ' Draw the borders to hide missing tiles LINE (19, 19)-(300, 180), 15, B FOR D = 0 TO 18: LINE (0 + D, 0 + D)-(319 - D, 199 - D), 0, B: NEXT D ' Show everything with ANDXOR VGASEE LINE (0, 0)-(319, 199), 0, BF LOCATE 2, 1: PRINT "FPS:"; FPS Loops = Loops + 1 LOOP UNTIL Press$ = CHR$(27) SCREEN 0: WIDTH 80, 25 END UpdateFPS: FPS = Loops: Loops = 0: RETURN SUB VGAPUT (ARRAY(), xxLEFT, yyTOP, frame) segVGA& = 1& + VARSEG(VGA(0)) segPUT& = VARSEG(ARRAY(0)) TW = ARRAY(0) \ 8: TH = ARRAY(1) TP& = TW * TH: TI = ((5 + TP&) \ 2) * (frame - 1) XR = (xxLEFT + TW) - 1: YB = (yyTOP + TH) - 1 IF xxLEFT < VXL THEN IF XR < VXL THEN EXIT SUB LD = (VXL - xxLEFT): XD = LD XL = VXL ELSE XL = xxLEFT END IF IF yyTOP < VYT THEN IF YB < VYT THEN EXIT SUB YD = VYT - yyTOP: YT = VYT ELSE YT = yyTOP END IF IF XR > VXR THEN IF XL > VXR THEN EXIT SUB XD = XD + (XR - VXR) XR = VXR END IF IF YB > VYB THEN IF YT > VYB THEN EXIT SUB YB = VYB END IF aB& = (4 + (TI * 2&)) + ((YD * TW) + LD) DIM AC(XL TO XR): bSUM = (TW - XD): bDIV = (bSUM \ &H10) bMOD = (bSUM MOD &H10) DIM BT(&H0 TO &HF), BD(&H0 TO &HF) FOR X = &H0 TO &HF: BD(X) = (X + XL): NEXT FOR VY = (YT * 20) TO (YB * 20) STEP 20 TS& = segPUT&: DS& = segVGA& + VY BT(&H0) = (&H0 + aB&): BT(&H1) = (&H1 + aB&) BT(&H2) = (&H2 + aB&): BT(&H3) = (&H3 + aB&) BT(&H4) = (&H4 + aB&): BT(&H5) = (&H5 + aB&) BT(&H6) = (&H6 + aB&): BT(&H7) = (&H7 + aB&) BT(&H8) = (&H8 + aB&): BT(&H9) = (&H9 + aB&) BT(&HA) = (&HA + aB&): BT(&HB) = (&HB + aB&) BT(&HC) = (&HC + aB&): BT(&HD) = (&HD + aB&) BT(&HE) = (&HE + aB&): BT(&HF) = (&HF + aB&) GSR = 0 FOR X = &H1 TO bDIV DEF SEG = TS& BF: BF = PEEK(BT(&HF)) BE: BE = PEEK(BT(&HE)) BD: BD = PEEK(BT(&HD)) BC: BC = PEEK(BT(&HC)) BB: BB = PEEK(BT(&HB)) BA: BA = PEEK(BT(&HA)) B9: B9 = PEEK(BT(&H9)) B8: B8 = PEEK(BT(&H8)) B7: B7 = PEEK(BT(&H7)) B6: B6 = PEEK(BT(&H6)) B5: B5 = PEEK(BT(&H5)) B4: B4 = PEEK(BT(&H4)) B3: B3 = PEEK(BT(&H3)) B2: B2 = PEEK(BT(&H2)) B1: B1 = PEEK(BT(&H1)) B0: B0 = PEEK(BT(&H0)) IF GSR THEN RETURN DEF SEG = DS& TF: IF BF THEN POKE BD(&HF), BF TE: IF BE THEN POKE BD(&HE), BE TD: IF BD THEN POKE BD(&HD), BD TC: IF BC THEN POKE BD(&HC), BC TB: IF BB THEN POKE BD(&HB), BB TA: IF BA THEN POKE BD(&HA), BA T9: IF B9 THEN POKE BD(&H9), B9 T8: IF B8 THEN POKE BD(&H8), B8 T7: IF B7 THEN POKE BD(&H7), B7 T6: IF B6 THEN POKE BD(&H6), B6 T5: IF B5 THEN POKE BD(&H5), B5 T4: IF B4 THEN POKE BD(&H4), B4 T3: IF B3 THEN POKE BD(&H3), B3 T2: IF B2 THEN POKE BD(&H2), B2 T1: IF B1 THEN POKE BD(&H1), B1 T0: IF B0 THEN POKE BD(&H0), B0 IF GSR THEN RETURN TS& = TS& + &H1: DS& = DS& + &H1 NEXT GSR = -1 SELECT CASE bMOD CASE &H1: DEF SEG = TS&: GOSUB B0: DEF SEG = DS&: GOSUB T0 CASE &H2: DEF SEG = TS&: GOSUB B1: DEF SEG = DS&: GOSUB T1 CASE &H3: DEF SEG = TS&: GOSUB B2: DEF SEG = DS&: GOSUB T2 CASE &H4: DEF SEG = TS&: GOSUB B3: DEF SEG = DS&: GOSUB T3 CASE &H5: DEF SEG = TS&: GOSUB B4: DEF SEG = DS&: GOSUB T4 CASE &H6: DEF SEG = TS&: GOSUB B5: DEF SEG = DS&: GOSUB T5 CASE &H7: DEF SEG = TS&: GOSUB B6: DEF SEG = DS&: GOSUB T6 CASE &H8: DEF SEG = TS&: GOSUB B7: DEF SEG = DS&: GOSUB T7 CASE &H9: DEF SEG = TS&: GOSUB B8: DEF SEG = DS&: GOSUB T8 CASE &HA: DEF SEG = TS&: GOSUB B9: DEF SEG = DS&: GOSUB T9 CASE &HB: DEF SEG = TS&: GOSUB BA: DEF SEG = DS&: GOSUB TA CASE &HC: DEF SEG = TS&: GOSUB BB: DEF SEG = DS&: GOSUB TB CASE &HD: DEF SEG = TS&: GOSUB BC: DEF SEG = DS&: GOSUB TC CASE &HE: DEF SEG = TS&: GOSUB BD: DEF SEG = DS&: GOSUB TD CASE &HF: DEF SEG = TS&: GOSUB BE: DEF SEG = DS&: GOSUB TE END SELECT aB& = aB& + TW NEXT END SUB SUB VGASEE DEF SEG POKE VGA(0), VGA(2): POKE VGA(1), VGA(3) PUT (0, 0), VGA(6), PSET: WAIT &H3DA, 8 POKE VGA(0), VGA(4): POKE VGA(1), VGA(5) END SUB SUB VGASET DEF SEG SCREEN 13: CLS VIDEOseg& = 1& + VARSEG(VGA(0)) n = &H7 FOR B& = 0 TO 63999 STEP 2 n = n + 1: l = PEEK(B&): h = PEEK(B& + 1) IF h > &H7F THEN VGA(n) = l + ((&HFF00 + h) * &H100) ELSE VGA(n) = l + (&H100 * h) END IF IF VGA(n - 1) = &H7DA0 AND VGA(n) = &HA000 THEN VGA(0) = B&: VGA(1) = VGA(0) + 1 VGA(2) = PEEK(VGA(0)): VGA(3) = PEEK(VGA(1)) VGA(4) = VIDEOseg& AND &HFF IF (VIDEOseg& AND &H8000) THEN VGA(5) = ((VIDEOseg& AND &HFF00) \ &HFF) + &H100 ELSE VGA(5) = (VIDEOseg& AND &HFF00) \ &HFF END IF VGA(6) = 2560 VGA(7) = 200 POKE VGA(0), VGA(4) POKE VGA(1), VGA(5) EXIT FOR END IF NEXT VXL = 0: VYT = 0: VXR = 319: VYB = 199 END SUB