Making「ActBarrier」その3

Home PC-6001mkII Program etc

Making「ActBarrier」 Top


2017/03/12:敵追加
 いよいよ敵の追加だ。はじめは上から移動してくる敵を考える。

 敵の管理領域は、HP,Y座標,X座標,キャラクタ番号,Y移動量,X移動量 6バイト構成にする。256バイトだと最大で256/6≒42種類の敵を管理できるが、プチコンmkII版に準拠して32種類までの管理とする。

 余談ながら、「Y座標,X座標,キャラクタ番号」の並びは、最初に作成したキャラクタ表示ルーチンの都合による。またキャラクタ表示ルーチンを使いまわすため、自機とオプションも「Y座標,X座標,キャラクタ番号」の並びにしている。

 敵の初期値は、暫定的に以下を入れる。HP:1、Y:1AH(Y表示範囲上端 - 6)、X:乱数値の下5bit + 20H、キャラクタ:00H、Y移動量:1、X移動量:0

 敵の最大出現数(32)と現時点の出現数を設け、最大出現数に達しない場合に敵を追加し出現数をカウントアップする。また、移動により敵が画面外に出た場合に、敵の削除を行う。これで、最低限の動きになるかな。

画像

 表示は暫定的過ぎるが、とりあえず敵の出現と削除の部分はうまく動いているようだ。

2017/03/12:敵撃破その1
 さて、次は敵の撃破判定だ。オプションの攻撃により敵のHPが0以下になった場合、敵のHPを0にして敵の削除を行う。

 すると、敵が一斉に消えたり、動かない敵が残るといった不可解な現象が起こり始めた。原因を調べた結果、条件によって、敵の管理領域の参照先アドレスが誤っていた。という事で修正。

 これで解決と思いきや、今度はしばらく動かしていると敵が出現しなくなる現象が発生した。処理上、現在数出現数が最大出現数以上になるとそれ以上出現しないようにしているので、おそらく出現数が実際と異なっているのだろう。

 出現数を見ていくと、たまに必要以上にカウントダウンされているようだ。これが繰り返された結果、出現数が0を通り越して255になったのが直接の原因のようだ。ただ、なぜ必要以上に出現数がカウントダウンされたかがわからない。

2017/03/14:敵撃破その2
 出現数が意図せずカウントダウンする原因が分かった。

 HPが0の敵は表示対象からは除いたのだが、移動や当たり判定は続き、かつ画面外に出ても消えないゾンビ状態となっていた。このゾンビ状態の敵を再度撃破する事で、出現数がさらにカウントダウンされていた。

 原因がわかればあとは簡単だ。HPが0の敵は移動や当たり判定の処理を行わないようにする。これでOKかな。

 次に、これまでHP=1としていた敵のHPを3に変更してみる。すると、今度は明らかに3回以上敵にオプションが当たっているのに撃破されない。HP=2にすると、たまに撃破される。どうやら、1つの敵に2つ以上のオプションが重なっているときは撃破されるようだ。

 これってつまり、実質敵のHP減算結果を覚えてなくて、直近のダメージがHP以上の時のみ撃破されているよね。という事で、HPからダメージ量を減らした値を保存するよう修正する。

 これでひとまずOK。

2017/03/18:スコア
 スコアの表示について考える。

 最初のHSP版で100万点台が出ている事を考えると、P6版でも最低7桁のスコア表示は実現したい。この場合、スコアが2バイトの範囲を超えるため処理が面倒な事になる。ただ、ここはこのゲームの肝の部分でもあるので何とかしたい。

 表示処理を簡潔にするため、スコア部分8桁を上4桁と下4桁で分け、それぞれを2バイトで管理するようにする。スコアの表示ルーチンも、4桁分(0000〜9999)の表示を行う処理とし、上位4桁と下位4桁で2回に分けて表示を行う。

 上位2バイトと下位2バイトがそれぞれ0〜9,999の値を持つ事になる。ただし、下位2バイトはスコア加算等で一時的に10,000以上の値を持つ。この場合は、上位2バイトへの繰り上げ処理を行って、表示時には0〜9,999の範囲に収まるようにする。

 簡単にスコア表示処理を作成し、暫定的に敵にオプションが当たった時に1,001点ずつ加算してスコア表示を確認する。

画像

 よしよし、上位4桁への繰り上げ表示も正常に行われているようだ。

2017/03/19:オプションHP
 次に、オプションのHPを実装する。

 原作のHSP版はというと、オプションHPの初期値255、最大300、敵にオプションが当たる毎に-1、自機と重なると1フレーム毎に+5となっている。また、オプションパワーはオプションHPを64で割った商としている。

 HSP版は約60fpsに対し、P6版では25.6fps(予定)なので、フレームレートは倍近く落ちる。まあ、HPが半分になるよう調整するか。という事で、初期値127、最大値150、敵に当たると-1、自機と重なると1フレーム毎に+5とする。

 まずは、パワー部分を実装。5種類のオプションキャラパターンを用意し、オプションHP/32を元にキャラ番号を設定する。

 次に、これまで敵にオプションが当たった時の敵のダメージ量を可変(=オプションのパワー)に変更し、オプションのHPを減らす処理を追加する。

画像

 うん、まあまあ良い感じだ。

 ついでに、敵の移動速度も自機の1/4に変更する。敵の移動処理にかかる時間を少しでも平準化するよう、最大32体の敵を8体ずつ4つのグループに分けて、1フレームで1グループずつ順繰りに動かす事にする。これで、敵の移動処理部分だけだが、処理負荷のばらつきが減るはず。

2017/03/20:オプション処理
 オプションの回復処理を実装する。
 敵とオプション/自機間の当たり判定で使用したテーブルでは8bit中4bitのみ使用しているため、もう1bit使用して自機用に大き目の判定範囲を追加する。これを、自機 - オプションの衝突判定に使用する。

 続いて、オプションの集合処理。オリジナルのHSP版では、8フレームかけて自機を追尾しながら自機位置にオプションが収束する。対してP6版では集合開始時の自機とオプションの位置差分を出し4フレームかけて自機を追尾せずにオプションが移動する。若干動きに違和感はあるが、許容範囲かな。

2017/03/25:敵出現処理てこ入れ
 敵の出現処理をてこ入れする。

 まずは、敵の出現位置。これまで乱数を元に32dotの範囲で敵を出現させていたが、これを画面の端から端まで42dotの範囲に変える。毎回計算すると面倒なので、乱数値0〜255を0+20H〜31+20Hに変換するためのテーブルを用意する。

 次は、時間経過による最大敵数の変化。HSP版では、10〜40の範囲で、時間に比例して1ずつ増えていく。これをP6版に置き換えると...敵数8〜32の範囲で2560/24フレームごとに1つずつ増やせばいい?切り上げて107フレームか。まずは、敵増加用の カウンタを増やし、カウンタが107になるたびに敵の最大数を増やす。
 次は、今まで上からしか登場しなかった敵を上下左右から出現するようにする。

画像

 さらに時間経過によって出現する方向が増えていく処理が必要だが、これは後回しだな。


その2 Making「ActBarrier」 その4