100 SCREEN 0:CLEAR 256:DIM X(64),Y(64),Z(64),TX_D$(10),TX_W(10),TX_H(10) 110 '--- テクスチャの絵を描画する 120 GOSUB *TEXPATTERNSET 130 DEG_LR = 0 : 'カーブの曲り 140 DEG_UD = 0 : '上り下り 150 DEG_AB = 0 : 'ねじれ角 160 ROAD_L = 128 : '1ブロック当たりの道路の長さ 170 ROAD_W = 256 : ' 道路の幅 180 GOSUB *SETMAP: ' マップデータ読み込み 190 M = &HFFFF.FFFC: Q = &H7FFF : '座標クリッピング用 200 OC_X = 16384: OC_Y = -2500+Q: OC_Z = 8192: 'スタート時の座標 210 '--- ポリゴンとテクスチャを定義する 220 SCREEN 5,,,-1 230 SETPFONT 1,7,(35,35,20,0,-900,0) ,RGB(10,10,3):OBJ(1,@XR)=.5 240 SETPFONT 2,7,(35,35,20,0,-1800,0) ,RGB(10,10,3):OBJLINK 1,2 250 SETPFONT 3,ASC("V"),(2,2,2,50,0,0) ,RGB(31,0,0):OBJ(3,@XR)=.25 260 SETPFONT 4,12,(.8,.7,1.5,50,-10,-20) ,RGB(31,31,31):OBJLINK 3,4 270 SETVERTEX 5,4,(-200,600,0), (200,600,0), (200,200,0),(-200,200,0) 280 GOSUB *TEXSET:CR=6 290 '+++ 看板定義 +++ 300 ATR=ATRID(-1):SETATR ATR,1,(0,1,3,1,0,3):SETPOLYGON 5,1,5,,(0,1,2,3) 310 OBJTYPE 6,4:OBJATR 6,5,ATR:OBJPOS 6,0,0,0 320 '+++ 道路ポリゴン定義 +++ 330 FOR I=0+CR TO 63+CR 340 GOSUB *SETNEXT:SETPOLYGON I,1,I,, (0,1,2,3):NEXT : '道路の初めの64ブロックの定義 350 ATR=ATRID(-1):SETATR ATR,1,(0,1,3,0,0,0) 360 FOR I=1+CR TO 64+CR:OBJTYPE I,4:OBJATR I,I-1,ATR:OBJPOS I,-128,0,0:NEXT 370 '--- 画角などの設定 380 SETDISP 1:SPRWINDOW,,,,,,180:ROTOVER 0:'ROTPOS 0,0,-100:ROTZOOM 1,1,1 390 SETPERS 90:PRIORITY 10,5:PRIORITY 5,1 400 CLS 0 410 SETCHR 5,0,STRING$(64,140) 420 SETCHR 8,0,STRING$(64,144):SETCHR 8,2,CHR$(255)+STRING$(63,144) 430 FOR I=0 TO 5000:PUTCHR 8,(RND(512),RND(256)),4:NEXT : ' 海(回転BG面)定義 440 '-- main 450 Z=(Z+1)AND &H1FFFF 460 U1=(V_NO+1)AND 63: U2=(V_NO+5)AND 63 470 OBJ(4,@XP)=X(U2),Y(U2)-200,Z(U2):OBJ(4,@YR)=-DEG_LR+.25 480 CAMERA (X(U1),Y(U1)-70+30,Z(U1)),B TO (X(U2),Y(U2)-70,Z(U2)),BG 490 IF V_NO THEN ELSE OBJ(2,@XP)=X(63),Y(63),Z(63):OBJ(6,@YR)=DEG_LR-.25:OBJLINK 6,V_NO+C+1 500 B = DEG_LR-DEG_LR_OLD: DEG_LR_OLD=DEG_LR 510 LOCATE 0,0:PRINT OC_X,OC_Y,OC_Z,V_NO,DEG_UD:GOSUB *SETNEXT:VSYNC : GOTO 450 1000 '-- 道路の座標計算 1010 *SETNEXT 1020 DEG_LR=DEG_LR+(PEEK(0,PTR+1)-128)/&H4000 1030 DEG_UD=DEG_UD+(PEEK(0,PTR+2)-128)/&H4000 1040 DEG_AB=DEG_AB+(PEEK(0,PTR+3)-128)/&H4000 1050 PTR=(PTR+4)MOD UPTR 1060 NC_X=XCOS(DEG_LR)*XCOS(DEG_UD)*ROAD_L + OC_X 1070 NC_Y= XSIN(DEG_UD)*ROAD_L + OC_Y 1080 NC_Z=XSIN(DEG_LR)*XCOS(DEG_UD)*ROAD_L + OC_Z 1090 X(V_NO)=OC_X-Q:Y(V_NO)=OC_Y-Q:Z(V_NO)=OC_Z-Q 1100 OC_X=NC_X AND M: OC_Y=NC_Y AND M: OC_Z=NC_Z AND M 1110 P3_X=P0_X:P3_Y=P0_Y:P3_Z=P0_Z 1120 P2_X=P1_X:P2_Y=P1_Y:P2_Z=P1_Z 1130 PP_X= XCOS(DEG_AB)*XSIN(DEG_LR)*ROAD_W 1140 PP_Y=-XSIN(DEG_AB) *ROAD_W 1150 PP_Z=-XCOS(DEG_AB)*XCOS(DEG_LR)*ROAD_W 1160 P0_X=( PP_X+NC_X)AND M:P0_Y=( PP_Y+NC_Y)AND M: P0_Z=( PP_Z+NC_Z)AND M 1170 P1_X=(-PP_X+NC_X)AND M:P1_Y=(-PP_Y+NC_Y)AND M: P1_Z=(-PP_Z+NC_Z)AND M 1180 SETVERTEX V_NO+CR,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) 1190 V_NO = (V_NO+1) AND 63:RETURN 1200 '--- コースデータ展開 1210 *SETMAP 1220 READ A$:IF A$="END" THEN RETURN 1230 P=1:ALR=128:AUD=128:AAB=128:STR_L=LEN(A$):A$=A$+"@" 1240 *SETMAP2 1250 C$=MID$(A$,P,1):P=P+1 1260 ON INSTR("LRUDAB=*",C$) GOSUB *SETM_L,*SETM_R,*SETM_U,*SETM_D,*SETM_A,*SETM_B,*SETM_NML,*SETM_LOOP 1270 IF P>STR_L THEN *SETMAP ELSE *SETMAP2 1280 *SETM_L: GOSUB *GETNUM:ALR= 128+NUM:RETURN 1290 *SETM_R: GOSUB *GETNUM:ALR= 128-NUM:RETURN 1300 *SETM_U: GOSUB *GETNUM:AUD= 128-NUM:RETURN 1310 *SETM_D: GOSUB *GETNUM:AUD= 128+NUM:RETURN 1320 *SETM_A: GOSUB *GETNUM:AAB= 128+NUM:RETURN 1330 *SETM_B: GOSUB *GETNUM:AAB= 128-NUM:RETURN 1340 *SETM_NML: ALR=128:AUD=128:AAB=128:RETURN 1350 *SETM_LOOP 1360 GOSUB *GETNUM 1370 TMP$=CHR$(0)+CHR$(ALR AND 255)+CHR$(AUD AND 255)+CHR$(AAB AND 255) 1380 ALR=128:AUD=128:AAB=128 1390 POKE 0,UPTR,STRW$(NUM,TMP$) 1400 UPTR = UPTR + NUM*4:RETURN 1410 *GETNUM 1420 NUM = 0 1430 *GETNUM2 1440 C$=MID$(A$,P,1):P=P+1 1450 NUM2=INSTR("0123456789",C$) 1460 IF NUM2 THEN NUM=NUM*10+NUM2-1:GOTO *GETNUM2 ELSE P=P-1:RETURN 2000 '--- テクスチャパターン定義 2010 *TEXPATTERNSET 2020 TX_NO = 0 2030 '=== 道路 === 2040 W = 64 : H = 32 2050 LINE (0,0)-(63,31),RGB(7,7,7),BF 2060 FOR I=0 TO 2000:X=RND(64):Y=RND(32) 2070 LINE (X,Y)-(X,Y+2+RND(3)),(INT(RND(20)/20+5-ABS(XSIN(X/64))*5)+5)*1057:NEXT 2080 LINE (31,0)-(31,15),RGB(31,31,31),BF 2090 GCOPY 0,(0,0)-(63,31) TO A$:GOSUB *TEXPSET2 2100 '=== どりーむきゃすと === 2110 W = 64 : H = 64 2120 LINE (64,0)-(64+W-1,H-1),32767,BF 2130 FOR I=0 TO 550:R=2+I/24 2140 CIRCLE (96+R*XSIN(I/200+.5),32-R*XCOS(I/200+.5)),1,2266:NEXT 2150 GCOPY 0,(64,0)-(64+W-1,H-1) TO A$:GOTO *TEXPSET2 2160 'RETURN 2170 '------------------------ 2180 *TEXPSET2 2190 TX_W(TX_NO)=W: TX_H(TX_NO)=H: TX_D$(TX_NO)=RIGHT$(A$,W*H*2):TX_NO=TX_NO+1 2200 RETURN 2210 '------------------------ 2220 *TEXSET 2230 FOR I=0 TO TX_NO-1:SETTEX I,TX_W(I),TX_H(I),32768,TX_D$(I):NEXT :RETURN 3000 '--- コースデータ 3010 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" 3020 DATA "B90R64*20 R64*216 A90R64*20" 3030 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" 3040 DATA "END"