'ALLOWS VECTOR TERRAIN WITH VECTOR COLLISION IN NX X_CELL=9 Y_CELL=8 CELL X_CELL,Y_CELL,1 GLOBAL X_CELL,Y_CELL 'SPRITE 0,100,100, SUB POINT_LINE(N0,N1) X0=SPRITE.X(N0) Y0=SPRITE.Y(N0) X1=SPRITE.X(N1) Y1=SPRITE.Y(N1) DX=X1-X0 DY=Y1-Y0 L=DX A=-DY CALL POLAR(L,A) CALL PLOT_LINE(6,X0,Y0,A,L*0.1,0) FOR IY=-5 TO 5 FOR IX=-5 TO 5 CALL VECTERRAIN( X_CELL+IX, Y_CELL+IY, X0,Y0,DX,DY) NEXT IX NEXT IY END SUB SUB VECTERRAIN(CX,CY,X0,Y0,DX,DY) 'CASES LINE 'STRAIGHT VERTICAL : FOR LEFT / RIGHT : CHECK IF EQUAL TO KNOWN X 'STRAIGHT HORIZONTAL : FOR TOP / BOTTOM : CHECK IF EQUAL TO KNOWN Y 'CASES BOX: '- NO COLLISION 'X SKIM CORNER (A SINGLE INTERSECTION) (IMPOSSIBLE) '- COLLIDE WITH RIB '- PASS THROUGH (LEFT + RIGHT / TOP + BOTTOM) '- TOP CORNER PASS (LEFT/RIGHT) '- BOTTOM CORNER PASS (LEFT/RIGHT) 'CELL BOX DEFINITION XA=CX*8 YA=CY*8 XB=XA+7+1 YB=YA+7+1 XC=0 YC=0 XD=0 YD=0 XCIN=0 YCIN=0 XDIN=0 YDIN=0 FLIPPED=0 C=0 'FIND INTERSECTION COORDINATES 'LEFT/RIGHT 'TOP/BOTTOM CALL LINE_BOX_FIND(DX,DY,X0,Y0,XA,XB,YA,YB,YC,YD,YCIN,YDIN) CALL LINE_BOX_FIND(DY,DX,Y0,X0,YA,YB,XA,XB,XC,XD,XCIN,XDIN) CALL COORDS_CHARACTER(XA,YA, XC,XD,YC,YD, XCIN,XDIN,YCIN,YDIN, FLIPPED,C) CALL DEMO_VISUALS(XA,XB,XC,XD,YA,YB,YC,YD,XCIN,XDIN,YCIN,YDIN,FLIPPED,C,CX,CY) END SUB SUB DEMO_VISUALS(XA,XB,XC,XD,YA,YB,YC,YD,XCIN,XDIN,YCIN,YDIN,FLIPPED,C,CX,CY) 'INTERACTIVE DEMO VISUALS 'INTERSECTION INDICATORS IF CX=X_CELL AND CY=Y_CELL THEN IF YCIN THEN SPRITE 2,XA,YC,3 ELSE SPRITE OFF 2 IF YDIN THEN SPRITE 3,XB,YD,3 ELSE SPRITE OFF 3 IF XCIN THEN SPRITE 4,XC,YA,3 ELSE SPRITE OFF 4 IF XDIN THEN SPRITE 5,XD,YB,3 ELSE SPRITE OFF 5 'DISPLAY DEBUG INFO TEXT 0,0,STR$(ABS(YCIN))+STR$(ABS(YDIN))+STR$(ABS(XCIN))+STR$(ABS(XDIN)) NUMBER 5,0,FLIPPED,1 XXC=XC-XA XXD=XD-XA YYC=YC-YA YYD=YD-YA CALL SLOPE_ROUND(XXC) CALL SLOPE_ROUND(XXD) CALL SLOPE_ROUND(YYC) CALL SLOPE_ROUND(YYD) TEXT 0,1,STR$(ABS(XXC))+STR$(ABS(XXD))+STR$(ABS(YYC))+STR$(ABS(YYD)) PAL 3 FLIP FLIPPED,0 CELL 7,0,C FLIP 0,0 PAL 0 END IF PAL 3 FLIP FLIPPED,0 BG 1 CELL CX,CY,C BG 0 FLIP 0,0 PAL 0 END SUB SUB COORDS_CHARACTER(XA,YA, XC,XD,YC,YD, TOP_,BOTTOM_,LEFT_,RIGHT_, FLIPPED,C) XXC=XC-XA XXD=XD-XA YYC=YC-YA YYD=YD-YA CALL SLOPE_ROUND(XXC) CALL SLOPE_ROUND(XXD) CALL SLOPE_ROUND(YYC) CALL SLOPE_ROUND(YYD) 'TRACE XXC,XXD,YYC,YYD IF BOTTOM_ AND TOP_ THEN FLIPPED=ABS(XC0 THEN 'LINE X PARAMETERS A AND B LXA=DY/DX LXB=Y0-X0*LXA 'LEFT YC=XA*LXA+LXB YCIN=(YC>=YA AND YC<=YB) 'RIGHT YD=XB*LXA+LXB YDIN=(YD>=YA AND YD<=YB) ELSE 'LINE IS FULLY HORIZONTAL YC=Y0 YD=Y0 YCIN=0 YDIN=0 IF X0=XA THEN 'HITS EVERYWHERE ON THE CELL-BOX RIB 'YC=0 YCIN=-1 ELSE IF X0=XB THEN 'YD=0 YDIN=-1 END IF END IF END SUB SUB LINE_BOX_FIND_Y(DY,DX,Y0,X0,YA,YB,XA,XB,XC,XD,XCIN,XDIN) IF DY<>0 THEN 'LINE Y PARAMETERS A AND B LYA=DX/DY LYB=X0-Y0*LYA 'UP XC=YA*LYA+LYB XCIN=(XC>=XA AND XC<=XB) 'DOWN XD=YB*LYA+LYB XDIN=(XD>=XA AND XD<=XB) ELSE 'LINE IS FULLY HORIZONTAL XC=X0 XD=X0 XCIN=0 XDIN=0 IF Y0=YA THEN 'HITS EVERYWHERE ON THE CELL-BOX RIB 'XC=0 XCIN=-1 ELSE IF Y0=YB THEN 'XD=0 XDIN=-1 END IF END IF END SUB SUB CLAMP(V,L,H) V=MIN(H,MAX(L,V)) END SUB 'CODE FROM DRAGDOTS AND VECTOR ALLIGNMENT: 'DRAGDOTS '(MAX) AMOUNT OF DOTS M=1 'FIRST SPRITE ID'S F_DOTSPRITE=0 F_BOXSPRITE=F_DOTSPRITE+M+1 GLOBAL F_DOTSPRITE,F_BOXSPRITE 'INIT DOTS FOR I=0 TO M CALL DOT_INIT(I,42+I*60,34+I*60) NEXT I 'INIT BOX CALL MAIN TOUCHSCREEN DO IF TAP THEN FOR I=0 TO M CALL DOT(I) NEXT I END IF WAIT VBL LOOP SUB DOT_INIT(N,X,Y) SPRITE F_DOTSPRITE+N,X,Y,1 END SUB SUB DOT(N) IF (TOUCH.X-SPRITE.X(N))\8=0 AND (TOUCH.Y-SPRITE.Y(N))\8=0 THEN REPEAT SPRITE F_DOTSPRITE+N,TOUCH.X-4,TOUCH.Y-4,1 CALL MAIN UNTIL NOT(TOUCH) END IF END SUB SUB MAIN 'CALL BOX(0,0,1) CALL POINT_LINE(0,1) WAIT VBL END SUB SUB BOX(N,N0,N1) X0=SPRITE.X(N0) Y0=SPRITE.Y(N0) X1=SPRITE.X(N1) Y1=SPRITE.Y(N1) OFFSET=-2 DX=X1-X0 DY=Y1-Y0 XD=ABS(DX>=0) YD=ABS(DY>=0) XD2=XD*2-1 YD2=YD*2-1 ADD X0, OFFSET*XD2 ADD Y0, OFFSET*YD2 ADD X1,-OFFSET*XD2 ADD Y1,-OFFSET*YD2 DX=X1-X0 DY=Y1-Y0 SX=ABS(DX) SY=ABS(DY) XD=ABS(DX>=0) YD=ABS(DY>=0) S=MIN((MIN(SX,SY)-4)\8,3) N4=N*4 CALL BOXSPRITE(N4+0,X0,Y0,S,1-XD,1-YD) CALL BOXSPRITE(N4+1,X1,Y1,S,XD,YD) CALL BOXSPRITE(N4+2,X1,Y0,S,XD,1-YD) CALL BOXSPRITE(N4+3,X0,Y1,S,1-XD,YD) END SUB SUB BOXSPRITE(N,X,Y,S,XD,YD) SPRITE F_BOXSPRITE+N,X-8*S*XD,Y-8*S*YD,12 SPRITE F_BOXSPRITE+N SIZE S FLIP XD,YD END SUB 'VECTOR ALLIGNMENT X0=0 Y0=0 X1=50 Y1=10 TOUCHSCREEN A=0 DO X1=50*COS(A) Y1=50*SIN(A) ADD A,0.01 X0=TOUCH.X-80 Y0=TOUCH.Y-64 CALL ALLIGN(X0,Y0,X1,Y1) CALL PLOT_VECTOR(0,X0,Y0,0) CALL PLOT_VECTOR(1,X1,Y1,1) CALL PLOT_VECTOR(2,TOUCH.X-80,TOUCH.Y-63,0) FOR I=0 TO 2 CALL PLOT_LINE(3+I*10,80,64,A+(0.5*I-0.5)*PI,5,2) NEXT I FOR I=0 TO 1 CALL PLOT_LINE(33+I*10,80+X0,64+Y0,A+I*PI,5,0) NEXT I WAIT VBL LOOP SUB ALLIGN(X,Y,RX,RY) M=X A=Y RM=RX RA=RY CALL POLAR(M,A) CALL POLAR(RM,RA) DA=A-RA IF NOT(ABS(DA)<=0.5*PI OR ABS(DA)>=1.5*PI) THEN RA=1.5*PI-RA NA=A+RA-2*PI*(RA<0)-0.5*PI M=-M*SIN(NA) X=COS(RA)*M Y=SIN(RA)*M END IF END SUB SUB PLOT_VECTOR(N,X,Y,P) SPRITE N,X+80,Y+64,1 SPRITE N PAL P END SUB SUB PLOT_LINE(N,X0,Y0,A,S,P) FOR I=0 TO 9 SPRITE N+I,X0+COS(A)*I*S,Y0+SIN(A)*I*S,2 SPRITE N+I PAL P NEXT I 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 000F2A3000383400003C0C0000080424 000F3038003F2A15003F2A15003F2A15 #2:MAIN CHARACTERS 00000000000000000000000000000000 0000000000000000DB810081810081DB 80000000000000000000000000000000 80000000000000008000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 FFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF7F7F7F7FFFFFFFFF FFFFFFFFFFFFFFFF7F7F7F7F7F7F7F7F 0F0F0F0F0F0F0F0F0707070707070707 00000000404070000000000040407000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 FFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFF 1F3F7FFFFFFFFFFF0F1F3F7FFFFFFFFF 1F1F3F3F7F7FFFFF0F0F1F1F3F3F7F7F 00000000004060000000000000406000 00000000004070000000000000407000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF 030F3FFFFFFFFFFF00030F3FFFFFFFFF 0103070F1F3F7FFF000103070F1F3F7F 00000000030F3FFF0000000000030F3F 00000000000000FF0000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000FFFFFFFF0000000000FFFFFF 00060200000000000006020000000000 0101030307070F0F0000010103030707 000000000103070F0000000000010307 000000000000000F0000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 000E020200000000000E020200000000 00060202000000000006020200000000 01010101010101010000000000000000 00000000010101010000000000000000 00000000000000010000000000000000