BG COPY 0,0,20,16 TO 0,0 SPRITE 1,30,108,64 SPRITE 2,70,108,64 SPRITE 1 SIZE 1 SPRITE 2 SIZE 1 FLIP 1,0 GAMEPAD 1 LL=0 RR=0 DO PX=30 PY=10 VX=0 VY=0 SPRITE 0,PX,PY,2 DO 'L=PEEK($FF70) 'R=PEEK($FF71) 'PAD=PEEK($FF70) 'L=SGN(PAD AND %00001111) 'R=SGN(PAD AND %00110000) L=LEFT(0) OR BUTTON(0,0) R=RIGHT(0) OR BUTTON(0,1) CALL FLIPPERS (L,R,LL,RR) CALL PHYSICS(PX,PY,VX,VY,L,R) SPRITE 0,PX,PY, TRACE PY IF PY>128 THEN PLAY 3,40 SOUND 9 EXIT END IF WAIT VBL LOOP LOOP SUB FLIPPERS(L,R,LL,RR) IF L THEN IF LL=0 THEN PLAY 0,20 SOUND 4 LL=MIN(7,LL+1) ELSE LL=MAX(0,LL-1) END IF IF R THEN IF RR=0 THEN PLAY 1,20 SOUND 4 RR=MIN(7,RR+1) ELSE RR=MAX(0,RR-1) END IF SPRITE 1,,,64+LL*2 SPRITE 2,,,64+RR*2 END SUB SUB PHYSICS(PX,PY,VX,VY,L,R) GRAVITY=0.1 DRAG=0.01 FX= -DRAG*VX FY=GRAVITY -DRAG*VY ADD VX,FX ADD VY,FY CALL COLLISION(PX,PY,VX,VY,FX,FY,L,R) 'IF VY<0.1 THEN VY=0 ADD PX,VX ADD PY,VY END SUB SUB COLLISION(PX,PY,VX,VY,FX,FY,L,R) FORCE=0.5 BOUNCE_EFFICIENCY=1 CX=PX+4 CY=PY+4 CALL PIXEL_TO_CELL(CX) CALL PIXEL_TO_CELL(CY) C=CELL.C(CX,CY) A=CELL.A(CX,CY) CXX=CX*8 CYY=CY*8 SPRITE 63, CXX,CYY, C SPRITE.A 63, A IF SPRITE HIT(63,0) THEN IF C=5 THEN PLAY 2,40 SOUND 8 VX=-VX*BOUNCE_EFFICIENCY ELSE IF C=6 THEN PLAY 2,40 SOUND 8 'IF VY<0.5 THEN VY=0 VY=-VY*BOUNCE_EFFICIENCY ELSE IF C=7 THEN PLAY 2,40 SOUND 8 VX=-VX*BOUNCE_EFFICIENCY VY=-VY*BOUNCE_EFFICIENCY ELSE IF C=8 THEN PLAY 2,40 SOUND 8 SWAP VX,VY VX=-VX*BOUNCE_EFFICIENCY VY=-VY*BOUNCE_EFFICIENCY ELSE IF C=3 OR C=4 THEN PLAY 2,60 SOUND 8 FX= 1-SGN(A AND %00001000) FY= 1-SGN(A AND %00010000) DX= PX - 7*FX DY= PY - 7*FY M=0 CALL UNIT_VECTOR2(DX,DY,M) ADD VX,DX*FORCE ADD VY,DY*FORCE END IF END IF IF SPRITE HIT(0,1 TO 2) THEN IF (L AND HIT=1) OR (R AND HIT=2) THEN ADD VY,-5 END IF END IF SPRITE OFF 63 END SUB SUB PIXEL_TO_CELL(P) P=INT(P*0.125) END SUB SUB UNIT_VECTOR(DX,DY) D=0 CALL MAG(DX,DY,D) CALL INVERT(D) DX=DX*D DY=DY*D END SUB SUB UNIT_VECTOR2(DX,DY,M) D=0 CALL MAG(DX,DY,D) M=D CALL INVERT(D) DX=DX*D DY=DY*D END SUB SUB SCALE(V,S) V=V*S END SUB SUB MAG(X,Y,M) M=SQR(X*X+Y*Y) END SUB SUB MAG_SQ(X,Y,D) D=X*X+Y*Y END SUB SUB INVERT(V) IF V<>0 THEN V=1/V ELSE V=0 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 SUB CARTHESIAN(I0,I1) I0=COS(I0)*I1 I1=SIN(I0)*I1 END SUB #1:MAIN PALETTES 003F2A15000F0B0700302010001F1B16 003F2A15003F2A15003F2A15003F2A15 #2:MAIN CHARACTERS 00000000000000000000000000000000 00384482828244380038448282824438 00183863030E7E181866469FFF7E7E18 071F3F7F7FFFFFFF071F3F7F7FFFFFFF 071E3F7D77E4FAAB071F3F7E7FFFEDFC A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 FF00FF0000000000FF00FF0000000000 FFFFFFE0E0E0E0E0FFFFFFE0E0E0E0E0 8040A0D068341A0D8040A0D068341A0D 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 071E3F7D77E4FAAB071F3F7E7FFFEDFC E078FCFEF63F1FD7E0F8FC7EFEFFFF3E 071F3F7F7FFFFFFF071F3F7F7FFFFFFF E0F8FCFEFEFFFFFFE0F8FCFEFEFFFFFF 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 ABE9FC7F6C2F1F07FCFEFF7F7F371F07 D6D73DFA9EFC38E03F3FFFFE7EFCF8E0 FFFFFF7F7F3F1F07FFFFFF7F7F3F1F07 FFFFFFFEFEFCF8E0FFFFFFFEFEFCF8E0 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 000000000040F09C000000000040F0FC 00000000000000000000000000000000 000000000060F89E000000000060F8FE 00000000000000000000000000000000 000000000060FC9F000000000060FCFF 00000000000000800000000000000080 000000000060FF9F000000000060FFFF 00000000000080FF00000000000080FF 000000000060FF9F000000000060FFFF 00000000000FFFFF00000000000FFFFF 000000000067FF9F000000000067FFFF 00000217FFFCFCE000000217FFFCFCE0 00000001077FFF9F00000001077FFFFF 00031FFFFCF8E08000031FFFFCF8E080 000000070F7FFF9F000000070F7FFFFF 031FFEFCF8E08000031FFEFCF8E08000 9FFF3F0F01000000FFFF3F0F01000000 0080E0F0FC7E0F030080E0F0FC7E0F03 9FFF3F0300000000FFFF3F0300000000 C0F0FCFF1F060000C0F0FCFF1F060000 9FFF630000000000FFFF630000000000 F8FFFF0300000000F8FFFF0300000000 9FFF600000000000FFFF600000000000 FE00000000000000FE00000000000000 9FFF780000000000FFFF780000000000 F800000000000000F800000000000000 9FFC780000000000FFFC780000000000 80000000000000008000000000000000 9EF8700000000000FEF8700000000000 00000000000000000000000000000000 9CF8700000000000FCF8700000000000 #3:MAIN BG 00001410070006000600060006000600 06000600060006000600060006000600 06000600060006000600070805000000 00000000000000000000000000000000 00000000000000000000000000000000 00000508050000000000000000000000 00000000000000000000000000000000 00000000000000000000050805000000 00000401040900000000000000000000 00000000000000000000000000000401 04090508050000000000041104190000 00000000000000000000000000000000 00000000000004110419050805000800 00000000000000000000000000000000 00000401040900000000000000000000 00000808050000000800000000000000 00000000000000000000041104190000 00000000000000000808050805000000 00000800000000000000000000000000 00000000000000000000000000000808 00000508050000000000000008000000 00000000000000000000000000000000 00000000080804010409050805000000 04010409000000000000000000000000 00000000000000000000080800000411 04190508080000000411041900000000 00000000000000000000000000000000 08080401040900000000050805000800 00000000000000000000000000000000 00000000000008080000041104190000 00000508050000000800000000000000 00000000000000000000000008080401 04090000000000000000050805000401 04090800000000000000000000000000 00000808000004110419000000000000 00000508050004110419000008000000 00000000000000000808040104090000 00000000000000000000050807100610 06100610000000000000000000000000 00000411041900000000000000000000 00000508 #15:MAIN SOUND 1800303A00FE00001800300018FE8000 1100300018FE00001800303019FE0000 320021F0180000003800505000000000 2800000F00FE00002800000F19FCF000 680E000F19FB10000800900006BA0000 4810000F160D0F00320002F118000000 6202F12F180FF00020002120180DF000 2100300018FE00002800400018FD8000