' ITS BEEN A WHILE '#-----------------# '|## # #### ##### | '|# # # # # # | '|# ## #### # | '|# # # # # | '#-----------------# 'NAT PLATFORMER ENGINE 'THIS ISNT AN ACTUAL PHYSICS ENGINE THAT TRIES TO SIMULATE THE LAWS OF PHYSICS, THIS CHECKS FOR COLLISIONS AND HANDLES GRAVITY, U HAVE TO DO THE ACTUAL WORK LOL 'ALL VELOCITY AND ACCELERATION IS STORED IN PIXELS/FRAME, 16 PX IS A METER BG COPY 0,0,20,16 TO 0,0 GAMEPAD 1 'PHYSICS OBJECTS 'USED TO STORE THE PHYSICS STUFF ABOUT OBJECTS 'SECOND DIMENSION: 0-SIMULATED(BOOL), 1-X VEL, 2-Y VEL,3-GRAVITY(BOOL) ' 4-XPOS(WITH DECIMALS), 5-YPOS(WITH DECIMALS) DIM GLOBAL POBJS(64, 6) 'LAST CELL VALUE GOTTEN FROM COLX/COLY GLOBAL COLC BG COPY 0,0,20,16 TO 0,0 SPRITE 0,8,0,1 CALL REGISTEROBJ(0) SPRITE 1,75,0,2 CALL REGISTEROBJ(1) PAUSE OFF MODE = 0 ACC = 0.1 DO WAIT VBL 'CHEAT MODE :FLUSHED: IF PAUSE THEN IF MODE = 0 THEN MODE = 1 ELSE MODE = 0 END IF 'JUMP CALL COLY(POBJS(0,4), POBJS(0,5), 1) IF COLC <> 0 AND BUTTON TAP(0,0)THEN POBJS(0,2) = -3 'LEFT/RIGHT ACCELERATION IF LEFT(0) THEN ADD POBJS(0,1), -ACC IF POBJS(0,1) < -1 THEN POBJS(0,1) = -1 ELSE IF RIGHT(0) THEN ADD POBJS(0,1), ACC IF POBJS(0,1) > 1 THEN POBJS(0,1) = 1 ELSE POBJS(0,1) = 0 END IF 'BOUNCY BOX CALL COLY(POBJS(1,4), POBJS(1,5), 1) IF COLC <> 0 THEN POBJS(1,2) = -2 'RUN "SIM" IF MODE = 0 OR BUTTON TAP(0,1) THEN CALL SIMULATE LOOP 'TIME TO DIE :D SUB SIMULATE FOR OBJ=0 TO 63 'IF THE OBJECT ISNT SIMULATED THEN SKIL THE SIM PROCESS IF POBJS(OBJ, 0) = 0 THEN GOTO NEXT_POBJ 'ADD GRAVITY ACCELERATION TO CURRENT VELOCITY IF POBJS(OBJ, 3) THEN ADD POBJS(OBJ, 2), 0.1 'THAT WAS SURPRISINGLY SHORT 'WRITE VALUES INTO TEMPORARY VARIABLES 'MOVE X, MOVE Y MX = POBJS(OBJ, 1) MY = POBJS(OBJ, 2) 'TEMPORARY POSITION PX = POBJS(OBJ,4) PY = POBJS(OBJ,5) ' MOV THE OBJECT, CHECK IF IT COLLIDES REPEAT IF MY <> 0 THEN 'IF IT IS CURRENT IN THE MIDDLE OF A CELL DIR = SGN(MY) IF PY MOD 8 > 0 THEN PO = PY MOD 8 ADD PY,DIR * MIN(PO, MY * DIR) ADD MY, -MIN(PO, MY) 'IF FINISHED MOVING, CHECK IF TOUCH WALL IF MY = 0 AND ((DIR = -1 AND (PY \ 1) MOD 8 = 0) OR DIR=1) THEN CALL COLY(PX,PY,DIR) IF COLC<>0 THEN POBJS(OBJ,2) = 0 ADD PY, -INT(PY) MOD 8 END IF END IF ELSE CALL COLY(PX,PY,SGN(MY)) IF COLC <> 0 THEN MY = 0 POBJS(OBJ,2) = 0 PY = INT(PY) ELSE ADD PY, MIN(8, MY) ADD MY, -MIN(8, MY) 'IF FINISHED MOVING, CHECK IF TOUCH WALL IF MY = 0 AND INT(PY) MOD 8 = 0 THEN CALL COLY(PX,PY,DIR) IF COLC<>0 THEN POBJS(OBJ,2) = 0 PY = INT(PY) END IF END IF END IF END IF END IF 'COPY & PASTED CUZ IM LAZY PLS DONT KILL ME IF MX <> 0 THEN 'IF IT IS CURRENT IN THE MIDDLE OF A CELL DIR = SGN(MX) IF PX MOD 8 > 0 THEN PO = PX MOD 8 ADD PX,DIR * MIN(PO, MX * DIR) ADD MX, -MIN(PO, MX) 'IF FINISHED MOVING, CHECK IF TOUCH WALL '((DIR = -1 AND (PY \ 1) MOD 8 = 0) OR DIR=1) IF MX = 0 AND INT(PX) MOD 8 = 0 THEN CALL COLX(PX,PY,DIR) IF COLC<>0 THEN POBJS(OBJ,1) = 0 ADD PX, -INT(PX) MOD 8 END IF END IF ELSE CALL COLX(PX,PY,SGN(MX)) IF COLC <> 0 THEN MX = 0 POBJS(OBJ,1) = 0 PX = INT(PX) ELSE ADD PX, MIN(8, MX) ADD MX, -MIN(8, MX) 'IF FINISHED MOVING, CHECK IF TOUCH WALL IF MX = 0 AND INT(PX) MOD 8 = 0 THEN CALL COLX(PX,PY,DIR) IF COLC<>0 THEN POBJS(OBJ,1) = 0 PX = INT(PX) END IF END IF END IF END IF END IF UNTIL MX = 0 AND MY = 0 SPRITE OBJ,PX,PY, POBJS(OBJ, 4) = PX POBJS(OBJ, 5) = PY NEXT_POBJ: NEXT OBJ END SUB SUB REGISTEROBJ(OBJ) POBJS(OBJ,0) = 1 POBJS(OBJ,3) = 1 POBJS(OBJ,4) = SPRITE.X(OBJ) POBJS(OBJ,5) = SPRITE.Y(OBJ) END SUB SUB COLY(PX, PY, DIR) COLC = CELL.C(PX\8, PY\8 + DIR) <> 0 IF COLC = 0 THEN IF PX MOD 8 > 0 THEN COLC = CELL.C(PX\8 + 1, PY\8 + DIR) END SUB SUB COLX(PX, PY, DIR) COLC = CELL.C(PX\8 + DIR, PY\8) <> 0 IF COLC = 0 THEN IF PY MOD 8 > 0 THEN COLC = CELL.C(PX\8 + DIR, PY\8 + 1) END SUB #2:MAIN CHARACTERS 00000000000000000000000000000000 3C3C18FF18FFFFE70000000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF #3:MAIN BG 00001410000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000020000000000000000000000 00000000000000000000000000000000 00000000000000000000000002000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000020000000000000000000000 00000000000000000000020002000200 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000200000000000000 00000000000000000000000000000000 00000000000000000000000000000200 02000200020000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000200020002000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000002000200 02000200020002000200020002000200 02000200020002000200020002000200 02000200