“RUN” それは魔法の言葉

私とコンピュータの思い出を、だらだらと綴ります。最近はHSP3でのゲーム作り日記です

208.HSPでゲームを作ろう:標準スプライトのマップ表示を使ってアクションゲームを作る→たまねとりっぷ! その6

ゲーム名を「たまねとりっぷ!(仮称)」と名付けた。何とか今年のコンテストに応募できるように形にしたい。

マップデータの作成について考える。
複数面を準備してクリアしていくゲームにはしないので、ゲームスタート時に1つだけマップを作る。
ランダム性を持ったマップを動的に生成するためのロジックと、仕組みを考えていく。

マップを作るために必要な条件を考えた。

  • クリアするまでの床数
  • 床から次の床までの間隔
  • スコア加算のための旗を置く

大枠のルールとして、100フロア登り切ったらクリア。と設定。
100フロアといっても、床と床の間隔分も作らないといけない。この間隔を適切にしないと、ジャンプして登れなくなる。
ジャンプ力は、あるギミックをもとに可変させる予定なので、床と床の間隔も可変させないといけない。
あとは、スコアを加算するためのギミックで各フロアに旗を1本置く。

これらの条件を加味しつつ、マップを作っていくのだが、一番の問題は、配列の数。
マップを作るにあたって、まずはX×Yの数分、1次元配列を定義しなくてはならない。
床の間隔を固定すれば、計算できるが、今回は可変させるため、マップが出来上がるまでYの数が確定しない。しかも、上から順に作っていかないといけない。
そこで、HSP3の特徴的な文字列操作機能のnoteを使うことにした。
noteは、培養臼でもステージデータ管理で使ったが、ファイルを読み込むのではなくて、一時的なバッファして使う。

notesel命令でバッファにする変数を指定して、1フロア分の文字列を生成し、noteadd命令でどんどん足していく。
このときは、床から上に向かって足して作るので、マップの向きは逆に出来上がる。
マップ作りのベースが決まったので、次は床の間隔と旗の設置ロジックを考える。

床の間隔を決めるのは、ジャンプ力と重力の設定値。何チップ分のジャンプができるかを算出する。
es_gravity命令は便利な反面、最高到達点がすぐにわからない。重力の問題なので、物理の公式で求められるはず。
ただ、ゲーム内の疑似重力なので、実際の公式のままは適用できず、ごにょごにょっと適当計算式wで、ジャンプできるチップ数を算出。そのチップ数-1を、床から床の間隔になるようにした。

旗は、床を設定したら、その次の段に必ず置くため、床を設定したら、旗を作成するフラグを1に、旗を設置したらフラグを0にするという単純な考え方で行ける。そのとき、床が無いところに旗を立てることができないので、1つ前の床の状態を変数にバッファとして残して、乱数で旗の位置を決めたら、その下に床がないとやり直しするようにした。

あとは、作りたいフロア数分、do~whileループして、床、旗、空間→床、旗、空間→…を繰り返し行っていけばよいだろう。

が、床の作成でちょっと困った。最下層はすべて床になるのだが、それより上はすべて、どこかに空間の空いた、穴あきの床になる。

始めに考えたのは、20ブロック分を20ビット分に見立てて、0~$FFFFFまでの1つの数字を乱数で作成し、ビットごとに0と1に分解して床にするというもの。

この方法では、数字のばらつきが大きすぎることと、大きな値にならないと床がほとんどないので、左半分がスッカスカ、右半分がまばらな床になるという、高難易度なフロアマップができあがった…

20ビット分を1つの乱数で生成

そこで、左10ビット、右10ビットに分けて2つの乱数を発生させて結合する方法で、ある程度、床のあるマップになったw
いったんこれで進めることにした。

左右10ビットずつに分けて生成

そうして作ったnoteをもとにして、map用の配列変数にチップNoをセットする。
mapの配列数は、X方向のチップ数×noteに登録した行数で定義できる。
あとはnoteを末尾の行から先頭までひっくり返して、map用の配列変数にセットしていけば、できあがり!
マップ作成のめどが立った。