100 SCREEN 1:CLEAR 256: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: ' テクスチャ作成 160 GCOPY 0,(0,0)-(127,63) TO A$:A$=RIGHT$(A$,128*64) 170 SCREEN 5,,,-1:SETTEX 0,128,64,256,A$: ' テクスチャ定義 180 SETPFONT 1,7,(35,35,20,0,-900,0) ,RGB(10,10,3):OBJ(1,@XR)=.5 190 SETPFONT 2,7,(35,35,20,0,-1800,0) ,RGB(10,10,3):OBJLINK 1,2 200 SETPFONT 3,ASC("V"),(2,2,2,50,0,0) ,RGB(31,0,0):OBJ(3,@XR)=.25 210 SETPFONT 4,12,(.8,.7,1.5,50,-10,-20) ,RGB(31,31,31):OBJLINK 3,4 220 DEG_LR = 0 : 'カーブの曲り 230 DEG_UD = 0 : '上り下り 240 DEG_CW = 0 : 'ねじれ角 250 ROAD_L = 128 : '1ブロック当たりの道路の長さ 260 ROAD_W = 256 : ' 道路の幅 265 GOSUB *SETMAP: ' マップデータ読み込み 270 M = &HFFFF.FFFC: Q = &H7FFF : '座標クリッピング用 280 OC_X = 8192: OC_Y = -2500+Q: OC_Z = 8192: 'スタート時の座標 290 FOR I=0+5 TO 63+5 300 GOSUB *SETNEXT:SETPOLYGON I,1,I,, (0,1,2,3):NEXT : '道路の初めの64ブロックの定義 310 ATR=ATRID(-1):SETATR ATR,1,(0,1,3,0,0,0) 320 FOR I=1+5 TO 64+5:OBJTYPE I,4:OBJATR I,I-1,ATR:OBJPOS I,-128,0,0:NEXT 330 SETDISP 1:SPRWINDOW,,,,,,180:ROTOVER 0:'ROTPOS 0,0,-100:R OTZOOM 1,1,1 340 SETPERS 90:PRIORITY 10,5:PRIORITY 5,1 350 CLS 0 360 SETCHR 5,0,STRING$(64,140) 370 SETCHR 8,0,STRING$(64,144):SETCHR 8,2,CHR$(255)+STRING$(63,144) 380 FOR I=0 TO 5000:PUTCHR 8,(RND(512),RND(256)),4:NEXT : ' 海(回転BG面)定義 390 '-- main 400 Z=(Z+1)AND &H1FFFF 410 U1=(V_NO+1)AND 63: U2=(V_NO+5)AND 63 420 OBJ(4,@XP)=X(U2),Y(U2)-200,Z(U2):OBJ(4,@YR)=-DEG_LR+.25 430 CAMERA (X(U1),Y(U1)-100+30,Z(U1)),B TO (X(U2),Y(U2)-100,Z(U2)),BG 440 IF V_NO THEN ELSE OBJ(2,@XP)=X(63),Y(63),Z(63) 460 B = DEG_LR-DEG_LR_OLD: DEG_LR_OLD=DEG_LR 470 LOCATE 0,0:PRINT OC_X,OC_Y,OC_Z,V_NO,DEG_UD:GOSUB *SETNEXT:VSYNC : GOTO 400 480 '-- 道路の座標計算 490 *SETNEXT 491 DEG_LR=DEG_LR+(PEEK(0,PTR+1)-128)/&H4000 492 DEG_UD=DEG_UD+(PEEK(0,PTR+2)-128)/&H4000 493 DEG_CW=DEG_CW+(PEEK(0,PTR+3)-128)/&H4000 495 PTR=(PTR+4)MOD UPTR 500 NC_X=XCOS(DEG_LR)*XCOS(DEG_UD)*ROAD_L + OC_X 510 NC_Y= XSIN(DEG_UD)*ROAD_L + OC_Y 520 NC_Z=XSIN(DEG_LR)*XCOS(DEG_UD)*ROAD_L + OC_Z 530 X(V_NO)=OC_X-Q:Y(V_NO)=OC_Y-Q:Z(V_NO)=OC_Z-Q 540 OC_X=NC_X AND M: OC_Y=NC_Y AND M: OC_Z=NC_Z AND M 550 P3_X=P0_X:P3_Y=P0_Y:P3_Z=P0_Z 560 P2_X=P1_X:P2_Y=P1_Y:P2_Z=P1_Z 570 PP_X= XCOS(DEG_CW)*XSIN(DEG_LR)*ROAD_W 580 PP_Y=-XSIN(DEG_CW) *ROAD_W 590 PP_Z=-XCOS(DEG_CW)*XCOS(DEG_LR)*ROAD_W 600 P0_X=( PP_X+NC_X)AND M:P0_Y=( PP_Y+NC_Y)AND M: P0_Z=( PP_Z+NC_Z)AND M 610 P1_X=(-PP_X+NC_X)AND M:P1_Y=(-PP_Y+NC_Y)AND M: P1_Z=(-PP_Z+NC_Z)AND M 620 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) 630 V_NO = (V_NO+1) AND 63:RETURN 999 '--- コースデータ展開 1000 *SETMAP 1010 READ A$:IF A$="END" THEN RETURN 1020 P=1:ALR=128:AUD=128:AAB=128:STR_L=LEN(A$):A$=A$+"@" 1025 *SETMAP2 1030 C$=MID$(A$,P,1):P=P+1 1040 ON INSTR("LRUDAB=*",C$) GOSUB *SETM_L,*SETM_R,*SETM_U,*SETM_D,*SETM_A,*SETM_B,*SETM_NML,*SETM_LOOP 1050 IF P>STR_L THEN *SETMAP ELSE *SETMAP2 1060 *SETM_L: GOSUB *GETNUM:ALR= 128+NUM:RETURN 1080 *SETM_R: GOSUB *GETNUM:ALR= 128-NUM:RETURN 1100 *SETM_U: GOSUB *GETNUM:AUD= 128-NUM:RETURN 1120 *SETM_D: GOSUB *GETNUM:AUD= 128+NUM:RETURN 1140 *SETM_A: GOSUB *GETNUM:AAB= 128+NUM:RETURN 1160 *SETM_B: GOSUB *GETNUM:AAB= 128-NUM:RETURN 1174 *SETM_NML: ALR=128:AUD=128:AAB=128:RETURN 1180 *SETM_LOOP 1190 GOSUB *GETNUM 1230 TMP$=CHR$(0)+CHR$(ALR AND 255)+CHR$(AUD AND 255)+CHR$(AAB AND 255) 1235 ALR=128:AUD=128:AAB=128 1240 POKE 0,UPTR,STRW$(NUM,TMP$) 1250 UPTR = UPTR + NUM*4:RETURN 2000 *GETNUM 2002 NUM = 0 2003 *GETNUM2 2004 C$=MID$(A$,P,1):P=P+1 2010 NUM2=INSTR("0123456789",C$) 2020 IF NUM2 THEN NUM=NUM*10+NUM2-1:GOTO *GETNUM2 ELSE P=P-1:RETURN 2900 '--- コースデータ 3000 DATA "=*30 U30*10 U60*10 U90*10 D90*10 D60*10 D30*10 D30*10 D60*10 D90*10 U90*10 U60*10 U30*10 =*30 A90L64*10 L64*108 B90L64*10" 3010 DATA "=*30 D30*10 D60*10 D90*10 U90*10 U60*10 U30*10 U30*10 U60*10 U90*10 D90*10 D60*10 D30*10 =*30 A90L64*10 L64*108 B90L64*10" 4000 DATA "END"