極楽すぱんだの予定
更新日付 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がはじき飛ばされる(teki_cond:にフラグを設定するだけ)
やられ処理ではフラグを設定したり、ワークを変化させるだけです。
体力ゲージが減ったり、敵OBJがはじき飛ばされて動くなどの処理は、
別ルーチンで処理するようになっています。
かけ算組...
koh@inetmie.or.jp