テーブル化サンプルプログラム4

レーダー法サンプル1

内容

レーダー法を利用して、シューティングゲームにおける、敵から自機への弾の発射を行います。
MSX1(RAM ?KB)で動作します。

画面上の、紫色のキャラが敵で、白色のキャラが自機です。
敵から自機に向かって弾を発射します。 発射の際には、レーダー法によって発射方向を求めています。 総発射方向はサンプルプログラム3同様全32方向で、sin テーブル、cos テーブル(配列)も同じものです。 逆正接テーブルは1マス16×16ドット、全31×23マスとしています(SCREEN 1使用)。
発射角度(発射方向)は画面下に表示されます。 y 座標は画面下向きで、それに伴い、角度も時計周りに大きくなっていくことに注意して下さい。

カーソルキーで自機の移動、スペースキーを押しながらカーソルキーで敵の移動が出来ます。 両者の位置をいろいろ変えて、動作を確認してみましょう。

プログラムリスト

※プログラムの実行にあたっては、table2.lzh中の "TABLSP4.BAS" を御利用下さい。
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 ウェイトカウンタ

プログラム解説

ポイント

このサンプルのポイントは1170行。 逆正接関数(ATN())を使うより簡単に(軽い処理で)、敵弾の発射方向が求められていることが分かります。 「関数で計算する」というより、「既に計算されたものを配列から読み出すだけ」という感じです。

逆正接テーブル自体も作り置きに?

サンプルプログラムでは、逆正接テーブルは計算して求めています(1080行〜1110行)が、実戦ではこの部分も省き、あらかじめデータ文か別ファイルとして逆正接テーブルデータを計算して用意しておき、プログラムではそれを読み込むだけにしてもよいでしょう(アセンブリ言語なら DEFB(DB)、DEFW(DW)で用意しておくとかね)。 その方が実行時にかかる時間も少なくなるでしょうし。

「AND」ってなあに?

1100行および1110行には、「AND」という文字が含まれた計算式があります。 これは「論理演算」と呼ばれるもののうち、「論理積」と呼ばれるもので、「+、-、*、/」などと同様、式の一種です。
論理演算がどのように行われるかは、C 言語や機械語の本などを見ればたいてい載っていると思いますので、詳しく知りたい方はそちらを参考にして下さい。 ここでは、簡単な計算例を挙げるにとどめておきますが、これだけのことが分かっているだけでも、応用範囲はかなり広がると思います。


戻る

MSXの適当手帳 MSX駅 西山駅