MAXPLANETS = 10 GLOBAL MAXPLANETS PLANETS = 0 GLOBAL PLANETS ADDINGPLANET = 0 GLOBAL ADDINGPLANET GLOBAL TOUCHX, TOUCHY DIM GLOBAL PP(MAXPLANETS) DIM GLOBAL PX(MAXPLANETS), PY(MAXPLANETS) DIM GLOBAL VX(MAXPLANETS), VY(MAXPLANETS) PALETTE 0,0,,, DO CALL DRAGPLANET CALL GRAVITATEPLANETS CALL BOUNCEEDGES REM CALL BOUNCEPLANETS CALL CRASHPLANETS CALL MOVEPLANETS CALL DRAWPLANETS WAIT VBL LOOP SUB DRAGPLANET IF ADDINGPLANET = 0 AND TOUCH THEN ADDINGPLANET = 1 TOUCHX = TOUCH.X TOUCHY = TOUCH.Y ELSE IF ADDINGPLANET = 1 AND NOT TOUCH THEN CALL ADDPLANET ADDINGPLANET = 0 END IF END SUB SUB ADDPLANET IF PLANETS < 10 THEN NEWPLANET = -1 FOR P = 0 TO MAXPLANETS-1 IF PP(P) = 0 THEN NEWPLANET = P GOTO DONE END IF NEXT P DONE: IF NEWPLANET >= 0 THEN VSCALE = 16 PP(NEWPLANET) = 1 PX(NEWPLANET) = TOUCHX PY(NEWPLANET) = TOUCHY VX(NEWPLANET) = (TOUCHX-TOUCH.X)/VSCALE VY(NEWPLANET) = (TOUCHY-TOUCH.Y)/VSCALE PLANETS = PLANETS + 1 END IF END IF END SUB SUB GRAVITATEPLANETS FOR P = 0 TO MAXPLANETS-1 IF PP(P) = 1 THEN AX = 0 AY = 0 FOR Q = 0 TO MAXPLANETS-1 IF PP(Q) = 1 THEN IF P <> Q THEN DX = PX(Q)-PX(P) DY = PY(Q)-PY(P) R2 = DX*DX + DY*DY FX = DX/R2 AX = AX + FX FY = DY/R2 AY = AY + FY END IF END IF NEXT Q VX(P) = VX(P) + AX VY(P) = VY(P) + AY END IF NEXT P END SUB SUB BOUNCEEDGES FOR P = 0 TO MAXPLANETS-1 IF PP(P) = 1 THEN IF PX(P) <= 0 THEN PX(P) = 0 VX(P) = -VX(P) END IF IF PX(P) >= 157 THEN PX(P) = 157 VX(P) = -VX(P) END IF IF PY(P) <= 0 THEN PY(P) = 0 VY(P) = -VY(P) END IF IF PY(P) >= 125 THEN PY(P) = 125 VY(P) = -VY(P) END IF END IF NEXT P END SUB SUB BOUNCEPLANETS FOR P = 0 TO MAXPLANETS-1 IF PP(P) = 1 AND SPRITE HIT(P) THEN SPRITE.A P,(1) Q = HIT DVX = VX(P)-VX(Q) DVY = VY(P)-VY(Q) DPX = PX(P)-PX(Q) DPY = PY(P)-PY(Q) DOT = DVX*DPX+DVY*DPY DIST = DPX*DPX+DPY*DPY DIV = DOT/DIST DVVX = DPX * DIV DVVY = DPY * DIV VX(P) = VX(P)-DVVX VY(P) = VY(P)-DVVY END IF NEXT P END SUB SUB CRASHPLANETS FOR P = 0 TO MAXPLANETS-1 IF PP(P) = 1 AND SPRITE HIT(P) THEN CALL DELETEPLANET(P) Q = HIT IF PP(Q) = 1 THEN CALL DELETEPLANET(Q) END IF END IF NEXT P END SUB SUB DELETEPLANET(P) PP(P) = 0 SPRITE OFF P PLANETS = PLANETS - 1 END SUB SUB MOVEPLANETS FOR P = 0 TO MAXPLANETS-1 IF PP(P) = 1 THEN PX(P) = PX(P) + VX(P) PY(P) = PY(P) + VY(P) END IF NEXT P END SUB SUB DRAWPLANETS CLS IF PLANETS = 0 THEN PRINT "GRAVITY SIMULATOR" PRINT PRINT "TOUCH AND DRAG" PRINT "TO CREATE PLANETS" PRINT PRINT "TRY TO MAKE THEM" PRINT "ORBIT EACH OTHER!" END IF FOR P = 0 TO MAXPLANETS-1 IF PP(P) = 1 THEN SPRITE P, PX(P), PY(P), 2 END IF NEXT P IF ADDINGPLANET = 1 THEN SPRITE MAXPLANETS, TOUCHX, TOUCHY, 2 SPRITE.A MAXPLANETS,(2) SPRITE MAXPLANETS+1, TOUCH.X, TOUCH.Y, 1 SPRITE.A MAXPLANETS+1,(1) ELSE SPRITE OFF MAXPLANETS SPRITE OFF MAXPLANETS+1 END IF END SUB #1:MAIN PALETTES 053F2F0000383400003C0C00003F3C00 003F2A15003F2A15003F2A15003F2A15 #2:MAIN CHARACTERS 00000000000000000000000000000000 00000018180000000000182424180000 0000183C3C180000003C664242663C00