Making「ActBarrier」

Home PC-6001mkII Program etc

関連リンク (P6)ActBarrier

最新の画面 更新日:2018/07/16
作成日:2018/06/24

2017年のP6オフ会で公開したネタ「ActBarrier」の作成過程を以下少しずつ書き綴っていこうと思います。

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

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

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

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

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

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

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

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

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

画像

 自機と同じ速度で動くため敵が速すぎるが、とりあえず敵の出現と削除の部分はうまく動いているようだ。

2017/03/11:乱数
 さて、次は乱数だ。

 乱数というと、前回の乱数値に中途半端な数を掛けて余りを取るといったイメージがある。マシン語で掛け算はコストが高いので、何か別の方法がないか探してみる。

 Webを探して目に留まったのは、「和田維作のホームページ」の「良い乱数・悪い乱数」だった。これによると、UNIXのrandom( )は足し算だけで乱数値が求まるとの事。え、掛け算が要らないの?

 ただ、乱数値は4バイト(0〜4,294,967,295)の範囲になる模様。Z80だと4バイトの計算は面倒なので、せめて2バイト(0〜65,535)にしたい。乱数値の範囲を2バイトに縮小しても乱数っぽくなるかはわからないが、とりあえず処理を作ってみる。

 軽く乱数値を確認した限りでは、値がばらけているように見える。とりあえずこれで進めてみるか。

2017/03/05〜07:コリジョンその2
 2/28に考えていたコリジョン処理を実装し、オプションまたは自機が敵と当たったらパーティクルを出すようにする。

 当たったかどうかが視認できるようになったので、動かすと楽しい。

画像

 ただ、当然ながら処理速度はコリジョン処理の分落ちてしまい、最大で30割り込みまで突入した。

 このあと、少しだけパーティクル処理を高速化したが、最大でほぼ29割り込みだった。うむむ、目標のおよそ1.5倍の遅さか…。

履歴

ページ項目
その1 2014/12/xx:はじめに
2017/01/xx:発掘
2017/02/10:6パターン
2017/02/10:座標変換
2017/02/18〜19:キャラクタ表示
2017/02/26:画面外
2017/02/26:表示テスト
2017/02/27:高速化その1
その2 2017/02/28:コリジョンその1
2017/03/01:オプション
2017/03/04:パーティクルその1
2017/03/05:パーティクルその2

PC-6001mkII