100 CLEAR 512:SCREEN 0 110 ' 120 ' テクスチャ描画 130 ' 140 LINE (0,0)-(319,159),RGB(0,0,10),BF 150 FOR I=0 TO 10:CIRCLE (40+RND(240),40+RND(80)),RND(40),RND(500),F 160 NEXT 170 ' 180 ' 球ポリゴンの頂点定義 190 ' 200 N1=20:N2=8:X=160:Y=112 210 VER_ID=VERTEXID(-1):SETVERTEX VER_ID,(N2+1)*N1 220 R=80:FOR J=0 TO N2:FOR I=0 TO N1-1 230 X1=XSIN(I/N1)*R*XSIN(J/N2/2):Y1=-XCOS(I/N1)*R*XSIN(J/N2/2):Z1=-R*XCOS(J/N2/2) 240 SETVERTEX (X1,Z1,Y1):NEXT :NEXT 250 ' 260 ' 頂点を集めて面をつくる 270 ' 280 SETPOLYGON 0,N2*N1,VER_ID:ATR_ID=ATRID(-1):SETATR ATR_ID,N2*N1 290 W=320/N1:H=160/N2:ALPHA1=.9:ALPHA2=.3 300 FOR J=0 TO N2-1 310 ' ▼ シェーディングのための準備 320 FOR U=0 TO H-1:CS=(-XSIN((J*H+H/2)/160/2)+XSIN((J*H+U)/160/2))*14 330 FOR V=0 TO W-1 :WH=16+CS-V*16/W 340 PSET (V,U+160),RGBADD(0,WH,WH,WH) :NEXT V,U 350 GCOPY (0,160)-(W-1,160+H-1) TO ALPHA_IMAGE2$ 360 ' ▼ グラフィックをテクスチャに貼り付け 370 FOR I=0 TO N1-1:K1=J*N1+I:K2=J*N1+(I+1)MOD N1 380 GCOPY 0,(I*W,J*H)-((I+1)*W-1,(J+1)*H-1) TO TX$ 390 ' ○ シェーディングとグラフィックをαブレンド 400 ALPHA_IMAGE1$=TX$:GOSUB *ALPHABLENDING:GCOPY ALPHA_IMAGE$ TO (I*W,J*H):TX$=ALPHA_IMAGE$ 410 SETTEX K1,W,H,32768,RIGHT$(TX$,W*H*2) 420 SETPOLYGON,(K1,K2,N1+K2,N1+K1):SETATR (0,1,2,K1,0,8) 430 NEXT :NEXT 440 ' 450 ' ポリゴン表示 460 ' 470 OBJATR 1,0,ATR_ID:OBJTYPE 1,4:OBJLINK 1,0:SETLIGHT 3,0,1 480 OBJ(1,@YRV)=-.001 490 P = PAD(0,1) 500 IF P AND @PAD_UP THEN OBJ(0,@ZP)=OBJ(0,@ZP)-1 510 IF P AND @PAD_DOWN THEN OBJ(0,@ZP)=OBJ(0,@ZP)+1 520 VSYNC :GOTO 490 530 END 540 *ALPHABLENDING: ' C's さんのルーチンの流用です(^^; 550 IF LEFT$(ALPHA_IMAGE1$,4) <> LEFT$(ALPHA_IMAGE2$,4) THEN END 560 ALPHA_IMAGE$="" 570 WIDTH_$ = MID$(ALPHA_IMAGE1$,1,2) :WIDTH_ = VAL("&H"+BINHEX$(WIDTH_$)) 580 HEIGHT_$ = MID$(ALPHA_IMAGE2$,3,2) :HEIGHT_= VAL("&H"+BINHEX$(HEIGHT_$)) 590 P_ =(WIDTH_*HEIGHT_*2+4)/64:P1_=0:P2_=P_:P3_=P_*2:P4_=P_*3:P5_=P_*4:P6_=P_*5 600 POKE P1_,0,WMUL$(WANDOR$(ALPHA_IMAGE1$,&H1F,0),ALPHA1) 610 POKE P2_,0,WMUL$(WANDOR$(ALPHA_IMAGE1$,&H3E0,0),ALPHA1/32) 620 POKE P3_,0,WMUL$(WANDOR$(ALPHA_IMAGE1$,&H7C00,0),ALPHA1/1024) 630 POKE P4_,0,WMUL$(WANDOR$(ALPHA_IMAGE2$,&H1F,0),ALPHA2) 640 POKE P5_,0,WMUL$(WANDOR$(ALPHA_IMAGE2$,&H3E0,0),ALPHA2/32) 650 POKE P6_,0,WMUL$(WANDOR$(ALPHA_IMAGE2$,&H7C00,0),ALPHA2/1024) 660 FOR II=5 TO WIDTH_*HEIGHT_*2+4 STEP 2 670 C1 = RGBADD( 0,PEEK(P1_,II),PEEK(P2_,II),PEEK(P3_,II)) 680 C2 = RGBADD(C1,PEEK(P4_,II),PEEK(P5_,II),PEEK(P6_,II)) 690 BUF_$=BUF_$+HEXBIN$(RIGHT$(HEX$(C2 + &H8000,1),4)) 700 IF LEN(BUF_$)>200 THEN ALPHA_IMAGE$=ALPHA_IMAGE$+BUF_$:BUF_$="" 710 NEXT 720 ALPHA_IMAGE$ = WIDTH_$+HEIGHT_$+ALPHA_IMAGE$+BUF_$ 730 BUF_$ ="" 740 RETURN