REM === SPACE SIM === REM == 2022 MCPEPIC == GOSUB INIT DO CALL OBJ_PHYSICS CALL OBJ_COLLIDE CALL OBJ_MOVE CALL OBJ_DRAW CALL CAM_MOVE INC FRAMES DELTA = SECONDS / FRAMES LOOP SUB OBJ_PHYSICS FOR I = 0 TO 63 IF OBJ(I, 0) THEN FOR J = 0 TO 63 IF OBJ(J, 0) AND I <> J THEN DIRX = OBJ(J, 1) - OBJ(I, 1) DIRY = OBJ(J, 2) - OBJ(I, 2) DIST = SQR( DIRX ^ 2 + DIRY ^ 2 ) FORCE = ( ( OBJ(I, 5) * OBJ(J, 5) ) / (DIST ^ 2) ) * G DIRX = DIRX / DIST DIRY = DIRY / DIST ADD OBJ(I, 3), DIRX * FORCE ADD OBJ(I, 4), DIRY * FORCE END IF NEXT J END IF NEXT I END SUB SUB OBJ_COLLIDE FOR I = 0 TO 63 IF OBJ(I, 0) THEN FOR J = 0 TO 63 IF OBJ(J, 0) AND I <> J THEN IF SPRITE HIT(I, J) THEN ADD OBJ(I, 1), SGN( OBJ(I, 1) - OBJ(J, 1) ) / PPM ADD OBJ(I, 2), SGN( OBJ(I, 2) - OBJ(J, 2) ) / PPM OBJ(I, 3) = 0 OBJ(I, 4) = 0 END IF END IF NEXT J END IF NEXT I END SUB SUB OBJ_MOVE FOR I = 0 TO 63 IF OBJ(I, 0) THEN ADD OBJ(I, 1), OBJ(I, 3) * DELTA ADD OBJ(I, 2), OBJ(I, 4) * DELTA END IF NEXT I END SUB SUB OBJ_DRAW FOR I = 0 TO 63 IF OBJ(I, 0) THEN 'DETERMINE THE SIZE AND CHARACTER OF THE OBJECT BASED ON THE MASS S = MAX( 0, MIN( INT( OBJ(I, 5) * 4 ) - 1, 2 ) ) IF S=0 THEN C = 1 ELSE IF S=1 THEN C = 16 ELSE C = 2 'GET THE PIXEL POSITION RELATIVE TO THE CAMERA X = OBJ(I, 1) * PPM - CAMX Y = OBJ(I, 2) * PPM - CAMY 'CONVERT CARTESIAN COORDINATES '-80..80 => 0..160 '64..-64 => 0..128 X = X + 80 Y = 128 - (Y + 64) 'MOVE THE PIVOT POINT TO THE CENTER OF THE OBJECT X = X - (S + 1) * PPM / 2 Y = Y - (S + 1) * PPM / 2 'RIGHT & BOTTOM EDGE OF OBJECT X2 = X + (S + 1) * PPM Y2 = Y + (S + 1) * PPM 'OBJECT IN BOUNDS IF X < 160 AND X2 > 0 AND Y < 128 AND Y2 > 0 THEN SPRITE I, X, Y, C SPRITE I SIZE S PAL OBJ(I, 6) ELSE SPRITE OFF I END IF ELSE SPRITE OFF I END IF NEXT I END SUB SUB CAM_MOVE ADD CAMX, LEFT(0) - RIGHT(0) ADD CAMY, DOWN(0) - UP(0) SCROLL 0, CAMX / PPM, -CAMY / PPM END SUB SUB INTERRUPT ADD SECONDS, 1 / 60 IF FRAMES = 0 THEN FRAMES = SECONDS DELTA = SECONDS / FRAMES END SUB INIT: RANDOMIZE TIMER 'ENABLED, X, Y, VX, VY, MASS, PALETTE DIM GLOBAL OBJ(63, 6) GLOBAL G GLOBAL FRAMES, SECONDS, DELTA GLOBAL PPM GLOBAL CAMX, CAMY RESTORE OBJ_DATA INDEX = 0 REPEAT READ ENABLED IF ENABLED THEN READ X, Y, VX, VY, MASS, PP OBJ(INDEX, 0) = -1 OBJ(INDEX, 1) = X OBJ(INDEX, 2) = Y OBJ(INDEX, 3) = VX OBJ(INDEX, 4) = VY OBJ(INDEX, 5) = MASS OBJ(INDEX, 6) = PP END IF INC INDEX UNTIL NOT ENABLED OBJ_DATA: DATA -1, 0, 0, 0, 0 , 1, 1 DATA -1, 8, 0, 0, 0.5, 0.0123031469, 7 DATA -1, 15, 25, -0.3, 0 , 0.107, 4 DATA 0 G = 0.674 PPM = 8 GAMEPAD 1 FOR Y = 0 TO 31 FOR X = 0 TO 31 CELL X, Y, 48 + RND(5) NEXT X NEXT Y ON VBL CALL INTERRUPT RETURN #1:MAIN PALETTES 003F2A1500030201000C0804000F0A05 0030201000332211003C2814002A1500 #2:MAIN CHARACTERS 00000000000000000000000000000000 243CFF7E7EFF3C243C4281818181423C 0002030F1F1F7F3F0003040000204040 BDFFFFFFFFFFFFFFC300000000000000 0040C0F0F8F8FEFC00C0200000040202 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 05173F7F3FFF7FFF0618204040808000 A0E8FCFEFCFFFEFF6018040202010100 FF7FFFFFFFFF7FFF8080000000008080 FFFFFFFFFFFFFFFF0000000000000000 FFFEFFFFFFFFFEFF0101000000000101 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 FF7FFF3F7F3F17050080804040201806 FFFEFFFCFEFCE8A00001010202041860 3F7F1F1F0F0302004040200000040300 FFFFFFFFFFFFFFBD00000000000000C3 FCFEF8F8F0C04000020204000020C000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000020000000000000 00000000000400000000000000040000 00000000000000000000200000000000 00000000000000000000000000020000 00000000200000000000000020000000 00100000000000000010000000000000