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 DIFFX = OBJ(I, 1) - OBJ(J, 1) DIFFY = OBJ(I, 2) - OBJ(J, 2) DIST = SQR( DIFFX ^ 2 + DIFFY ^ 2 ) 'COLLISION IF DIST < (OBJ(I, 6) + OBJ(J, 6)) * 2 THEN ADD OBJ(I, 3), SGN( DIFFX ) / PPM ADD OBJ(I, 4), SGN( DIFFY ) / PPM TRACE "COLLISION "+STR$(I)+", "+STR$(J) 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, 6) * 4 ) - 1, 3 ) ) IF S=0 THEN C = 1 ELSE IF S=1 THEN C = 16 ELSE IF S=2 THEN C = 2 ELSE C = 5 '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, 7) 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, RADIUS, PALETTE DIM GLOBAL OBJ(63, 7) 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, RADIUS, 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) = RADIUS OBJ(INDEX, 7) = PP END IF INC INDEX UNTIL NOT ENABLED OBJ_DATA: DATA -1, 0, 0, 0 , 0 , 1 , 1 , 1 DATA -1, 8, 0, 0 , 0.5, 0.012, 0.273, 7 DATA -1, 15, 15, -0.3, 0 , 0.107, 0.532, 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(4) NEXT X NEXT Y ON VBL CALL INTERRUPT RETURN #1:MAIN PALETTES 003F2A1500030201000C0804000F0A05 0030201000332211003C2814002A1500 #2:MAIN CHARACTERS 00000000000000000000000000000000 243CFF7E7EFF3C243C4281818181423C 0002030F1F1F7F3F0003040000204040 BDFFFFFFFFFFFFFFC300000000000000 0040C0F0F8F8FEFC00C0200000040202 0000010103070F3F0000010204081020 0B5F7FFFFFFFFFFF0C60800000000000 D0FAFEFFFFFFFFFF3006010000000000 00008080C0E0F0FC0000804020100804 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 05173F7F3FFF7FFF0618204040808000 A0E8FCFEFCFFFEFF6018040202010100 FF7FFFFFFFFF7FFF8080000000008080 FFFFFFFFFFFFFFFF0000000000000000 FFFEFFFFFFFFFEFF0101000000000101 1F7F3F7FFF7FFFFF2040400080800000 FFFFFFFFFFFFFFFF0000000000000000 FFFFFFFFFFFFFFFF0000000000000000 F8FEFCFEFFFEFFFF0402020001010000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 FF7FFF3F7F3F17050080804040201806 FFFEFFFCFEFCE8A00001010202041860 3F7F1F1F0F0302004040200000040300 FFFFFFFFFFFFFFBD00000000000000C3 FCFEF8F8F0C04000020204000020C000 FFFF7FFF7F3F7F1F0000808000404020 FFFFFFFFFFFFFFFF0000000000000000 FFFFFFFFFFFFFFFF0000000000000000 FFFFFEFFFEFCFEF80000010100020204 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000020000000000000 00000000000400000000000000040000 00000000000000000000200000000000 00000000000000000000000000020000 00000000200000000000000020000000 3F0F0703010100002010080402010000 FFFFFFFFFF7F5F0B000000000080600C FFFFFFFFFFFEFAD00000000000010630 FCF0E0C0808000000408102040800000