極楽すぱんだの予定


更新日付 1998-09-14

「すぱんだ」の開発予定についてまとめました。
こういった作業は、面倒に思えますが、
プログラミングの方針を固めることで、美しいプログラムになります。
確かにHTML形式でレイアウトする作業はムダですけどね。
ヨットレース、X-GAMES、MLB、NFLなんかを観ながら作ってます。

あまり動作確認をしていないのですが、
このページで紹介する二つのルーチンはすでに実装しています。
余計にゲームが進まなくなりましたが...。
興味がある方は、ソースのteki_move:とplay_atari:を見てください。

[目次]


・小さな敵を動かす

小さな敵を動かす処理を追加します。
大きな敵はまだポーズデータがそろっていないので後回し。
少しでも早く遊べるよう、小さな敵を倒すゲームをまず作ります。

------------------------------------------------------------
teki_type:	ds	1		;敵の種類
teki_cond:	ds	1		;敵の状態
teki_time:	ds	1		;カウンタ
teki_res:	ds	1		;未使用
		ds	TEKI*4-4
------------------------------------------------------------
ワークteki_type、teki_cond、teki_timeを追加し、
ついでにte_resという未使用のワークを確保しました。
こういったワークを参照するためには、インデックスレジスタを使いますが、
インデックスレジスタはOAMの構造上、4バイト単位でカウントしています。
それに合わせて一組のワークを4バイトにしたのです。
こうすることで一つのインデックスレジスタで 複数のワークを参照できるのです。

#OAMはOBJの情報を格納するメモリで、
#x座標,y座標,キャラ番号,属性で4バイト一組となっています。

・teki_cond:の内容(仮)

 $00:空きワーク
 $02:爆発中
 $04:左へ少しだけはじき飛ばされる
 $06:右へ少しだけはじき飛ばされる
 $08:時間待ち
 $0a:移動パターンのテーブルにそって動く

・teki_type:の内容(仮)

 $00:空きワーク
 $02:リポビタンD
 $04:こけたリポビタンD
 $06:ふわふわ赤風船
 $08:ゆらゆら青風船

まずteki_condを判定し、その値によって処理をふり分けます。
最初は動きテーブルにそって移動する敵だけを作り、
いずれは個々の敵がきちんとしたアルゴリズムで動くようにします。
そのためには、teki_cond=$0aならteki_typeを判定して、
その値次第では個々の処理ルーチンにも分岐できるようにすればいいのです。

teki_timeはその名の通り、時間をカウントします。
たとえば敵をやっつけると、敵キャラがしばらく爆発中キャラになるとか。
まあ、いろいろ使えると思います。
待ち時間をteki_timeに入れ、毎回teki_timeを-1します。
teki_timeが0になったら一定時間が経過したというわけです。
動きテーブルに沿って動く敵なら、そのインデックスにも使えますね。

[目次]


・自機に対する当たり判定

自機に対する当たり判定を追加します。
この処理はすでに実装し、動作確認も終えていますが、
kan002.lzhに同梱のソースではコメントアウトされています。

カンカンを構成するすべてのパーツを当判すると処理が重くなります。
そこで自機は大きな四角形と考え、1回だけ当判します。
この当たり判定を行なう範囲を当判エリアと呼び、
あらかじめ計算してワークに入れておきます。
------------------------------------------------------------
	p_top:		ds	2		;当判エリア上
	p_bottom:	ds	2		;  〃  下
	p_left:		ds	2		;  〃  左
	p_right:	ds	2		;  〃  右
		:
		:
calc_area:
	on16a
	on16i
	rep	#$30

	ldx	p_offset	;現在のポーズデータの先頭アドレス
	lda	pose_data+44,x	;パーツ11のx座標
	and	#$00ff		;上位バイトクリア
	clc
	adc	base_px

	sec
	sbc	#$0010		;当判エリアの幅/2
	sta	p_left
	clc
	adc	#$0020		;当判エリアの幅
	sta	p_right

	lda	pose_data+45,x	;パーツ11のy座標
	and	#$00ff		;上位バイトクリア
	clc
	adc	base_py
	sta	p_bottom
	sec
	sbc	#$0040		;当判エリアの高さ
	sta	p_top

	とりあえず
	rts
------------------------------------------------------------
当判エリアを計算するサブルーチンを試しに作ってみました。
大きな敵キャラも同様に当判エリアを計算しておいた方がいいと思いますが、
今はとりあえず無視します。
当判エリアについては、位置関係がつかみにくいので、
後で図解するつもりです。
------------------------------------------------------------
play_atari:
	on16a
	on16i
	rep	#$30

	ldx	#TEKI*4-4
_loop:
	lda	teki_x,x
	cmp	p_left
	bcc	_next
	cmp	p_right
	bcs	_next

	lda	teki_y,x
	and	#$00ff
	cmp	p_top
	bcc	_next
	cmp	p_bottom
	bcs	_next
	jsr	自機やられ処理
_next:
	dex
	dex
	dex
	dex
	bpl	_loop
	rts
------------------------------------------------------------
自機のやられ処理は次のようなものを考えています。
やられ処理ではフラグを設定したり、ワークを変化させるだけです。
体力ゲージが減ったり、敵OBJがはじき飛ばされて動くなどの処理は、
別ルーチンで処理するようになっています。

[目次]


かけ算組... koh@inetmie.or.jp