100 SCREEN 1:DIM X(64),Y(64),Z(64) 110 FOR I=0 TO 10:PALETTE 0,I+1,RGB(I+7,I+7,I+7):PALETTE 10,I+1,RGB(I+7,I+7,I+7):NEXT 120 PALETTE 10,8,RGB(31,31,31):LINE (0,0)-(127,63),3,BF 130 FOR I=0 TO 5000:X=RND(128):Y=RND(64) 140 LINE (X,Y)-(X,Y+2+RND(3)),INT(RND(20)/20+5-ABS(XSIN(X/128))*5)+1:NEXT 150 LINE (63,0)-(63,31),8,BF: ' テクスチャ作成 200 GCOPY 0,(0,0)-(127,63) TO A$:A$=RIGHT$(A$,128*64) 202 SCREEN 5:SETTEX 0,128,64,256,A$: ' テクスチャ定義 203 SETPFONT 1,7,(35,35,20,0,-900,0) ,RGB(10,10,3):OBJ(1,@XR)=0.5 204 SETPFONT 2,7,(35,35,20,0,-1800,0) ,RGB(10,10,3):OBJLINK 1,2 205 SETPFONT 3,ASC("V"),(2,2,2,50,0,0) ,RGB(31,0,0):OBJ(3,@XR)=.25 206 SETPFONT 4,12,(.8,.7,1.5,50,-10,-20) ,RGB(31,31,31):OBJLINK 3,4 210 DEG_LR = .25 : 'カーブの曲り 220 DEG_UD = 0 : '上り下り 230 DEG_CW = 0 : 'ねじれ角 240 L = 128 : '1ブロック当たりの道路の長さ 250 W = 256 : ' 道路の幅 260 OC_X = 8192: OC_Y = 5000: OC_Z = 8192: 'スタート時の座標 265 M = &HFFFF.FFFC: Q = &H7FFF : '座標クリッピング用 270 FOR I=0+5 TO 63+5:DEG_LR=DEG_LR-&H0.01:DEG_UD=0:DEG_CW=DEG_CW+&H0.001 280 GOSUB *SETNEXT:SETPOLYGON I,1,I,, (0,1,2,3):NEXT : '道路の初めの64ブロックの定義 290 ATR=ATRID(-1):SETATR ATR,1,(0,1,3,0,0,0) 295 FOR I=1+5 TO 64+5:OBJTYPE I,4:OBJATR I,I-1,ATR:OBJPOS I,-128,0,0:NEXT 300 SETDISP 1:SPRWINDOW,,,,,,180:ROTPOS 0,0,-100:ROTOVER 0:ROTZOOM 1,1,1 302 SETPERS 90:PRIORITY 10,5:PRIORITY 5,1 310 CLS 0 322 SETCHR 5,0,STRING$(64,140) 330 SETCHR 8,0,STRING$(64,144):SETCHR 8,2,CHR$(255)+STRING$(63,144) 332 FOR I=0 TO 5000:PUTCHR 8,(RND(512),RND(256)),4:NEXT : ' 海(回転BG面)定義 340 '-- main 350 Z=(Z+1)AND &H1FFFF 351 U1=(V_NO+1)AND 63: U2=(V_NO+5)AND 63 352 OBJ(4,@XP)=X(U2),Y(U2)-200,Z(U2):OBJ(4,@YR)=-DEG_LR-0.25-&h0.1 353 CAMERA (X(U1),Y(U1)-100,Z(U1)),B TO (X(U2),Y(U2)-100,Z(U2)),BG 354 IF V_NO THEN ELSE OBJ(2,@XP)=X(63),Y(63),Z(63) 355 DEG_LR=DEG_LR+&h0.02:DEG_UD = XSIN(Z/&H200)/32:DEG_CW=&H0.07 359 B = DEG_LR-DEG_LR_OLD: DEG_LR_OLD=DEG_LR 360 LOCATE 0,0:PRINT OC_X,OC_Y,OC_Z,V_NO:GOSUB *SETNEXT:VSYNC : GOTO 350 999 '-- 道路の座標計算 1000 *SETNEXT 1010 NC_X=XCOS(DEG_LR)*XCOS(DEG_UD)*L + OC_X 1020 NC_Y= XSIN(DEG_UD)*L + OC_Y 1030 NC_Z=XSIN(DEG_LR)*XCOS(DEG_UD)*L + OC_Z 1031 X(V_NO)=OC_X-Q:Y(V_NO)=OC_Y-Q:Z(V_NO)=OC_Z-Q 1032 OC_X=NC_X AND M: OC_Y=NC_Y AND M: OC_Z=NC_Z AND M 1040 P3_X=P0_X : P3_Y=P0_Y : P3_Z=P0_Z 1050 P2_X=P1_X : P2_Y=P1_Y : P2_Z=P1_Z 1060 PP_X= XCOS(DEG_CW)*XSIN(DEG_LR)*W 1070 PP_Y=-XSIN(DEG_CW) *W 1080 PP_Z=-XCOS(DEG_CW)*XCOS(DEG_LR)*W 1090 P0_X=( PP_X+NC_X )AND M: P0_Y = ( PP_Y+NC_Y )AND M: P0_Z = ( PP_Z+NC_Z )AND M 1100 P1_X=(-PP_X+NC_X )AND M: P1_Y = (-PP_Y+NC_Y )AND M: P1_Z = (-PP_Z+NC_Z )AND M 1110 SETVERTEX V_NO+5,4,(P0_X-Q,P0_Y-Q,P0_Z-Q), (P1_X-Q,P1_Y-Q,P1_Z-Q), (P2_X-Q,P2_Y-Q,P2_Z-Q), (P3_X-Q,P3_Y-Q,P3_Z-Q) 1120 V_NO = (V_NO+1) AND 63:RETURN