画面上の、紫色のキャラが敵で、白色のキャラが自機です。
敵から自機に向かって弾を発射します。
発射の際には、レーダー法によって発射方向を求めています。
総発射方向はサンプルプログラム3同様全32方向で、sin テーブル、cos テーブル(配列)も同じものです。
逆正接テーブルは1マス16×16ドット、全31×23マスとしています(SCREEN 1使用)。
発射角度(発射方向)は画面下に表示されます。
y 座標は画面下向きで、それに伴い、角度も時計周りに大きくなっていくことに注意して下さい。
1 'SAVE"TABLSP4.BAS 2 'SAVE"TABLSP4.ASC",A 1000 'テーブルか サンプル4 1010 ' レーダーほう(1) 1020 ' for MSX 1030 DEFINT A-Z:DIM TX(8),TY(8),SN!(31),CS!(31),RT(30,22),HX(1),HY(1) 1040 SCREEN1,1,0:WIDTH30:COLOR15,4,3:KEY OFF:CLS 1050 RESTORE1270:FOR PN=0TO2:A$="":FOR I=0TO7:READ B$:A$=A$+CHR$(VAL(" &B"+B$)):NEXT:SPRITE$(PN)=A$:NEXT'スプライト パターンの じゅんび 1060 RESTORE1540:FOR ST=0TO8:READ TX(ST),TY(ST):NEXT'キー へんかん テー ブルの じゅんび 1070 GS=2:FOR AG=0TO31:SN!(AG)=GS*SIN(2*3.141592#/32*AG):CS!(AG)=GS *COS(2*3.141592#/32*AG):NEXT'SIN/COS テーブルの じゅんび 1080 'ATN テーブルの じゅんび 1090 FOR Y=1TO11:RT(15+Y,11+Y)=4:RT(15,11+Y)=8:RT(15-Y,11+Y)=12:RT(15- Y,11-Y)=20:RT(15,11-Y)=24:RT(15+Y,11-Y)=28:NEXT:FOR X=1TO15:RT(15+X,11 )=0:RT(15-X,11)=16:NEXT:RT(15,11)=8 1100 FOR X=2TO11:FOR Y=1TO X-1:I=31AND(5.09295*ATN(Y/X)):RT(15+X,11+Y )=I:RT(15+Y,11+X)=8-I:RT(15-Y,11+X)=8+I:RT(15-X,11+Y)=16-I:RT(15-X,11- Y)=16+I:RT(15-Y,11-X)=24-I:RT(15+Y,11-X)=24+I:RT(15+X,11-Y)=31AND(-I): NEXT:NEXT 1110 FOR X=12TO15:FOR Y=1TO11:I=31AND(5.09295*ATN(Y/X)):RT(15+X,11+Y) =I:RT(15-X,11+Y)=16-I:RT(15-X,11-Y)=16+I:RT(15+X,11-Y)=31AND(-I):NEXT: NEXT 1120 'ざひょう および がめんの しょきか 1130 HX(0)=120:HY(0)=151:HX(1)=120:HY(1)=23 1140 PRINT" カーソルキーで プレイヤー いどう。":PRINT" SPACE キー + カ ーソルキーで てき いどう。":PRINT" [CTRL]+[STOP]で しゅうりょう。" 1150 'LOOP 1160 FOR L1=0TO2480STEP0 1170 AG=RT((HX(0)-HX(1)+8)/16+15,(HY(0)-HY(1)+8)/16+11):GX!=HX(1):GY! =HY(1):LOCATE1,22:PRINT USING"ANGLE:## (やく ###ど)";AG,360/32*AG 1180 FOR L2=0TO1:TIME=0:L2=0 1190 PUT SPRITE0,(HX(0),HY(0)),15,0:PUT SPRITE1,(HX(1),HY(1)),13,1:P UT SPRITE2,(GX!,GY!),10,2 1200 ST=STICK(0):TR=-STRIG(0) 1210 HX(TR)=HX(TR)+TX(ST):IF HX(TR)<0 OR HX(TR)>240 THEN HX(TR)=HX(T R)-TX(ST) 1220 HY(TR)=HY(TR)+TY(ST):IF HY(TR)<-1 OR HY(TR)>175 THEN HY(TR)=HY( TR)-TY(ST) 1230 GX!=GX!+CS!(AG):GY!=GY!+SN!(AG):IF GX!<0 OR GX!>240 OR GY!<-16 OR GY!>190 THEN L2=1 1240 FOR WT=-32768!TO-32766:WT=TIME-32768!:NEXT 1250 NEXT 1260 NEXT'LOOP おわり 1270 'SPRITE DATA(PLAYER) 1280 DATA 00011000 1290 DATA 00011000 1300 DATA 10100101 1310 DATA 10100101 1320 DATA 10111101 1330 DATA 11111111 1340 DATA 11111111 1350 DATA 10111101 1360 'SPRITE DATA(ENEMY) 1370 DATA 10000001 1380 DATA 01011010 1390 DATA 00111100 1400 DATA 01100110 1410 DATA 01100110 1420 DATA 00111100 1430 DATA 01011010 1440 DATA 10000001 1450 'SPRITE DATA(GUN) 1460 DATA 00111100 1470 DATA 01011110 1480 DATA 11111111 1490 DATA 10111111 1500 DATA 10111111 1510 DATA 10111111 1520 DATA 01111110 1530 DATA 00111100 1540 'キー へんかん テーブル データ 1550 DATA 0,0,0,-4,3,-3,4,0,3,3,0,4,-3,3,-4,0,-3,-3
TX()、TY() | キー変換テーブル |
---|---|
SN!() | sin テーブル |
CS!() | cos テーブル |
RT(,) | 逆正接テーブル |
HX(n), HY(n) | 自機及び敵の座標(n = 0:自機、n = 1:敵) |
L1 | ループフラグ (無限ループ実現のためのダミー変数) |
L2 | ループフラグ (L2=0:敵弾移動継続、L2=1:敵弾移動終了) |
AG | 敵弾の発射角度(0〜31の整数) |
GX!、GY! | 敵弾の座標 |
ST | カーソルキー入力方向(0〜8) |
TR | 自機、敵移動モード判別用 (TR = 0:自機を移動、TR = 1:敵を移動) |
WT | ウェイトカウンタ |