見出し画像

PICO-8で遊ぼう(自分を中心に世界を動かす編

これまで作ってきた2Dシューティングゲームめいた何かちゃんとしたゲームに仕上げてみたいと思います。
※面白いゲームになるかどうかは別の話です。

ブルラビくんを世界の中心にする

今までは固定画面でブルラビくんやスライムが動き回るような構造でしたが、それをブルラビくんを画面の中心に固定して、移動するたびに上下左右にスクロールするいわゆる2Dスクロールな構造に変更します。

2Dスクロールゲームに構造を変更するには、ブルラビくんの表示位置を中心に固定しつつ、スライムの表示位置はブルラビくんの仮想的な座標から相対的な距離を計算して…と、結構めんどくさいことになりそうですが、pico-8にはcamera()という超便利な関数が用意されています。

camera(x,y)

すべての描画命令について、画面のオフセットを(-x, -y)に設定します。 camera()でリセットします。

https://github.com/kitao/pico8-jp/blob/master/pico8-jp.txt
_draw()でcamera()を使用します。
オフセットする座標はブルラビくんの座標から64引いたもの
(ブルラビくんを画面中央に表示するため)。
世界の中心にブルラビくんがいる…??

ブルラビくんとスライムの位置関係の変化から正常にスクロールしてるように見えますが背景が紺一色なのでイマイチわかりませんね…。
なので画面がスクロールしてるのがわかるような背景をつけてみましょう。

の前に、なんか動作が変

そっちの方向にスライムはいないのに・・・

PICO-8では数値は32767.99までしか扱えません。
そのため、ビームとスライムの当たり判定で使われている関数distance()で馬鹿正直に三平方の定理で距離を計算している箇所でオーバーフローを起こしていると思われます。

関数distance()三平方の定理から角度と高さから斜辺(距離)を求める方式に変更します。

どこまでいっても大丈夫!

スクロールする背景

上下左右に2画面分スクロールする背景を作ってみます。

まずは半径256(area_size)の緑の円をどーんと描く関数draw_map()を用意
_draw()draw_map()を追加
円形の緑の大地出現。

大地っぽくする

さすがに緑一色では味気なさすぎるので、もうちょっと味付けしてみます。緑一色の大地に茶色、黄色、明るい緑色の点々をつけて大地っぽさをだしてみます。

マップ表示用の全コード

要は上下左右4画面分(512x512)の座標にランダムに点を打つテーブル(map_tiles)を用意すれば良いだけではありますが、さすがにその座標分のテーブルは量が多すぎるので8で割って、原点0,0を中心とした-32〜+32までの64x64のタイル状のテーブルとしてデータを用意します。

背景テーブルの概念図(1画面分)。
これが上下左右に4画面分ある。

draw_map()でマップを描画する際も背景テーブル(map_tiles)から実際に描画する領域分のデータをブルラビくんの現在の座標から抽出して描画しています。

これで移動してる感じでた??

スプライトに置き換える

点描だけではまだまだ地味なので草花っぽいスプライトを描いて点描をそれに置き換えてみます。

草花?のスプライト
背景テーブルmap_tilesを設定するrandom_tiles()spriteに草花のスプライト番号9〜16をランダムに設定。
draw_map()で点を描画していた部分をスプライトを描画するように変更。


大地完成!!

以上!

この記事が気に入ったらサポートをしてみませんか?