N=7 REPULSION=0.05 'REPULSION=-0.01 DRAG=0.001 'DRAG=0 FRICTION=0.01 GLOBAL B_RI,B_LE,B_UP,B_LO,REPULSION,DRAG,FRICTION B_RI=159-17 B_LE=0 B_UP=0 B_LO=127-17 RANDOMIZE TIMER DIM PX(N),PY(N),VX(N),VY(N) FOR I=0 TO N SPRITE I SIZE 2 PX(I)=RND(140) PY(I)=RND(100) NEXT I DO CALL PHYSICS (N,VX(),VY(),PX(),PY()) CALL DRAW (N,PX(),PY()) WAIT VBL LOOP SUB PHYSICS(N,VX(),VY(),PX(),PY()) FX=0 FY=0 FOR I=0 TO N CALL PHYSICS_LOOP(I,FX,FY,VX(I),VY(I),PX(I),PY(I),PX(),PY()) NEXT I END SUB SUB PHYSICS_LOOP(I,FX,FY,VX,VY,PX,PY,PX(),PY()) CALL FORCES (I,FX,FY,VX,VY,PX,PY,PX(),PY()) CALL MOTION ( FX,FY,VX,VY,PX,PY) CALL COLLISION(I,FX,FY,VX,VY,PX,PY) END SUB SUB FORCES(I,FX,FY,VX,VY,PX,PY,PX(),PY()) DX=VX DY=VY CALL UNIT_VECTOR(DX,DY) FX=0.01 FY=0.01 CALL C_BALL2(I,FX,FY,VX,VY,PX,PY,PX(),PY(),REPULSION) CALL FRICTION(FX,DX,FRICTION) CALL FRICTION(FY,DY,FRICTION) CALL DRAG(FX,VX,DRAG) CALL DRAG(FY,VY,DRAG) END SUB SUB FRICTION(F,D,M) ADD F,-D*M END SUB SUB DRAG(F,V,M) ADD F,SGN(V)* MIN( ABS(V), M*V*V) END SUB SUB MOTION(FX,FY,VX,VY,PX,PY) ADD VX,FX ADD VY,FY ADD PX,VX ADD PY,VY END SUB SUB COLLISION(I,FX,FY,VX,VY,PX,PY) CALL C_WALL(FX,VX,PX,B_LE,B_RI) CALL C_WALL(FY,VY,PY,B_UP,B_LO) 'CALL C_BALL(I,FX,FY,VX,VY,PX,PY) END SUB SUB C_WALL(F,V,P,B1,B2) IF PB2 THEN V=-ABS(V) END SUB SUB C_BALL(I,FX,FY,VX,VY,PX,PY) IF SPRITE HIT(I) THEN VX=-VX VY=-VY 'VX(HIT) END IF END SUB SUB C_BALL2(I,FX,FY,VX,VY,PX,PY,PX(),PY(),REP) IF SPRITE HIT(I) THEN DX=PX-PX(HIT) DY=PY-PY(HIT) 'D=0 'CALL MAG(DX,DY,D) FX=DX*REP FY=DY*REP 'VX(HIT) 'FX=RND(1) 'FY=RND(1) END IF END SUB SUB DRAW(N,PX(),PY()) FOR I=0 TO N SPRITE I,PX(I),PY(I),3 NEXT I END SUB SUB UNIT_VECTOR(DX,DY) D=0 CALL MAG(DX,DY,D) IF D<>0 THEN D=1/D ELSE D=0 DX=DX*D DY=DY*D END SUB SUB MAG(X,Y,M) M=SQR(X*X+Y*Y) END SUB SUB POLAR(I1,I2) 'A LITTLE BIT OF MATH TO GET AN ANGLE AND A LENGTH FROM A SET OF COORDINATES 'CONVERTS THE CARTESIAN (X,Y) TO THE POLAR (RADIUS,ANGLE) 'CODE EXPLANATION '1 SET A TO INPUT 1 '2 SET B TO INPUT 2 '3 I1 TO THE LENGTH OF THE VECTOR (PYTHAGORAS) '4 IF THE LENGTH VARIABLE (I1) SUPPORTS DIVISIONS '5 I2 TO THE ANGLE OF THE VECTOR: ATAN2 MADE WITH ACOS IN A UNIT CIRCLE AND SGN(B) (NOT 0) '6 IF THE LENGTH IS ZERO WE MAY AS WELL HAVE NO ANGLE AT ALL A=I1 B=I2 I1=SQR(A*A+B*B) IF I1>0 THEN I2=ACOS(MIN(1,MAX(-1,A/I1))) * (1+2*(B>=0)) ELSE I2=0 END IF END SUB #1:MAIN PALETTES 0038343000383400003C0C00003F3C00 003F2A15003F2A15003F2A15003F2A15 #2:MAIN CHARACTERS 00000000000000000000000000000000 071F3F7F7FFFFFFF0000000000000000 E0F8FCFEFEFFFFFF0000000000000000 0208061D5274EF7F010719222D0B109F 300478CF013FFFA9C0F88639FFC723FF 000000008000C040000000000080C080 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000070000000000000000 00000000000000E00000000000000000 00000000000000000000000000000000 00000103070F1F3F0000000000000000 0F7FFFFFFFFFFFFF0000000000000000 F0FEFFFFFFFFFFFF0000000000000000 000080C0E0F0F8FC0000000000000000 00000000000000000000000000000000 FFFFFF7F7F3F1F070000000000000000 FFFFFFFEFEFCF8E00000000000000000 F3EEE4BF541F0B120F9F1F472F61370D 1FF1BFF740EF65F8FEFF47CFFFD3FEC6 C0C0C0C000800000C0C0C08080800000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000101010000000000000000 1F3F7FFFFFFFFFFF0000000000000000 F8FCFEFFFFFFFFFF0000000000000000 00000000008080800000000000000000 3F7F7F7FFFFFFFFF0000000000000000 FFFFFFFFFFFFFFFF0000000000000000 FFFFFFFFFFFFFFFF0000000000000000 FCFEFEFEFFFFFFFF0000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 08000000000000000703000000000000 C0000000000000003CF0000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 01010100000000000000000000000000 FFFFFFFFFF7F3F1F0000000000000000 FFFFFFFFFFFEFCF80000000000000000 80808000000000000000000000000000 FFFFFFFF7F7F7F3F0000000000000000 FFFFFFFFFFFFFFFF0000000000000000 FFFFFFFFFFFFFFFF0000000000000000 FFFFFFFFFEFEFEFC0000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 07000000000000000000000000000000 E0000000000000000000000000000000 00000000000000000000000000000000 3F1F0F07030100000000000000000000 FFFFFFFFFFFF7F0F0000000000000000 FFFFFFFFFFFFFEF00000000000000000 FCF8F0E0C08000000000000000000000