10000 !========================================= 10010 ! 関節可動サンプル 10020 !----------------------------------------- 10030 INIT ALL ! モデルバッファを初期化 10040 TEXTMODE 2 10050 ZSORT 1,10 10060 !========================================= 10070 ! モデルデータ用配列宣言 10080 !----------------------------------------- 10090 PN=13 ! モデルパーツ数(奇数) 10100 DIM MBNO(PN) ! モデルバッファ番号 10110 DIM MONO(PN) ! バッファ内オブジェクト番号 10120 DIM MX(PN),MY(PN),MZ(PN) ! モデル座標 10130 DIM MRX(PN),MRY(PN),MRZ(PN) ! モデル回転角 10140 !========================================= 10150 CALL MODELS_INIT ! モデルデータの初期化 10160 DIST=400 ! カメラとモデルの距離 10170 !========================================= 10180 DO 10190 FSYNC 1 10200 CALL MODELS_UPDATE ! モデル角度、位置更新 10210 CALL CAMERA_UPDATE ! カメラ角度、位置更新 10220 FOR N=1 TO 12 10230 IF PAD(1,N)>0 THEN CALL ACT(N) 10240 NEXT N 10250 IF PAD(1,13)< 64 THEN CALL CAM( 2,0,0,0) 10260 IF PAD(1,13)>191 THEN CALL CAM(-2,0,0,0) 10270 IF PAD(1,14)< 64 THEN CALL CAM(0,-2,0,0) 10280 IF PAD(1,14)>191 THEN CALL CAM(0, 2,0,0) 10290 IF PAD(1,15)< 64 THEN CALL CAM(0,0,0,-5) 10300 IF PAD(1,15)>191 THEN CALL CAM(0,0,0, 5) 10310 IF PAD(1,16)< 64 THEN CALL CAM(0,0, 2,0) 10320 IF PAD(1,16)>191 THEN CALL CAM(0,0,-2,0) 10330 IF PAD(1,17)>0 OR PAD(1,18)>0 THEN CALL CAM_RESET 10340 LOOP 10350 !========================================= 10360 ! モデルデータの初期化 10370 !----------------------------------------- 10380 SUB MODELS_INIT 10390 FOR I=1 TO PN 10400 IF MOD(I,2)=1 THEN ! Iが奇数なら 10410 MODSET I,2,1 ! 立方体をセット 10420 ELSE ! Iが偶数なら 10430 MODSET I,1,9 ! 球体をセット 10440 END IF 10450 IF I>1 THEN ! I>1なら 10460 MZ(I)=40 ! Z座標を40にセット 10470 END IF 10480 MODJOIN I,I-1 ! モデルIをモデル(I-1)に結合 10490 MODDISP I ! モデルIを表示 10500 NEXT I 10510 END SUB 10520 !========================================= 10530 ! モデルの角度、位置更新 10540 !----------------------------------------- 10550 SUB MODELS_UPDATE 10560 FOR I=1 TO PN 10570 ! モデルの回転角セット 10580 MODROT I,RAD(MRX(I)),RAD(MRY(I)),RAD(MRZ(I)) 10590 ! モデルの位置セット 10600 MODPOS I,MX(I),MY(I),MZ(I) 10610 NEXT I 10620 END SUB 10630 !========================================= 10640 ! カメラの角度、位置更新 10650 !----------------------------------------- 10660 SUB CAMERA_UPDATE 10670 ! カメラの位置を計算で求める 10680 CX= DIST*COS(RAD(CRX))*SIN(RAD(CRY)) 10690 CY=-DIST*SIN(RAD(CRX)) 10700 CZ=-DIST*COS(RAD(CRX))*COS(RAD(CRY)) 10710 ! カメラの角度セット 10720 CAMROT 1,RAD(CRX),RAD(CRY),RAD(CRZ) 10730 ! カメラの位置セット 10740 CAMPOS 1,CX,CY,CZ 10750 END SUB 10760 !========================================= 10770 ! モデル動かす(数値を変更するだけ) 10780 !----------------------------------------- 10790 SUB ACT(A) 10800 FOR I=2 TO PN STEP 2 10810 SELECT CASE A 10820 CASE 1 ! 右を押した場合 10830 MRY(I)=MIN( 15,MRY(I)+1) 10840 CASE 2 ! 左を押した場合 10850 MRY(I)=MAX(-15,MRY(I)-1) 10860 CASE 3 ! 上を押した場合 10870 MRX(I)=MIN( 15,MRX(I)+1) 10880 CASE 4 ! 下を押した場合 10890 MRX(I)=MAX(-15,MRX(I)-1) 10900 CASE 6 ! ○を押した場合 10910 MZ(I)=MIN(60,MZ(I)+1) 10920 MZ(I+1)=MIN(60,MZ(I+1)+1) 10930 CASE 7 ! ×を押した場合 10940 MZ(I)=MAX(20,MZ(I)-1) 10950 MZ(I+1)=MAX(20,MZ(I+1)-1) 10960 CASE 9,11 ! L1,L2を押した場合 10970 MRZ(I)=MAX(-30,MRZ(I)-1) 10980 CASE 10,12 ! R1,R2を押した場合 10990 MRZ(I)=MIN( 30,MRZ(I)+1) 11000 CASE ELSE ! △□を押した場合リセット 11010 MRX(I),MRY(I),MRZ(I)=0 11020 MZ(I),MZ(I+1)=40 11030 END SELECT 11040 NEXT I 11050 END SUB 11060 !========================================= 11070 ! カメラ動かす(数値を変更するだけ) 11080 !----------------------------------------- 11090 SUB CAM(X,Y,Z,R) 11100 CRX=MOD(CRX+X,360) 11110 CRY=MOD(CRY+Y,360) 11120 CRZ=MOD(CRZ+Z,360) 11130 DIST=DIST+R 11140 END SUB 11150 !========================================= 11160 ! カメラ位置リセット(数値を変更するだけ) 11170 !----------------------------------------- 11180 SUB CAM_RESET 11190 CRX,CRY,CRZ=0 11200 DIST=400 11210 END SUB