
PICO-8で遊ぼう(モンスターの出現!編
ブルラビくんがビームを撃てるようになったので、次はそれに当たってもらう?モンスター(NPC)を出現させてみます。
本日の教科書

あれです、弱いやつ。
まずはスプライトシートのタブ1にモンスター(NPC)を描いてみます。
左上のスプライトの番号は64。
ブルラビくんと同じく上下左右に2コマずつのアニメーション持ってます。
ちょっと贅沢ですね、モンスター(NPC)のくせに()。
キャラクターの処理を共通化する
PC/NPCともに、表示したり動かす処理のほとんどは共通化できます。
またPCもNPCも、テーブルによってそれぞれのデータを管理します。
これまではPCのテーブルはソースコードの冒頭で作っていましたが、今回からその処理をPC/NPC共通のキャラクターのテーブルを作る関数、create_character() にまとめます。

s0はキャラクター用のスプライトシートの左上のスプライトの番号。


PCの初期設定を書き換えます。
新たにinit_pc()関数を追加し、そこでcreate_character()を使ってテーブルPCに初期値を設定します。PC独自のビームを撃つ設定用の初期値も追加します。スプライト番号64を設定してPCをブルラビくんからグリーンスライムにしてみます。

メイン処理の部分にも_init()を追加します。最初に1度だけ呼ばれる特別な関数です。そこに先ほどのinit_pc()を追加します。

更なる共通化
PC/NPCのキャラクター追加(初期化)は共通化できましたが、更新(update)と描画(draw)も共通化します。

グリーンスライムを配置してみる
NPCとしてグリーンスライムを複数個、画面に表示させてみます。



AIを作る
グリーンスライムたちに知能(Artificial Intelligence、略してAI)を入れ込んで動くようにしてみます。

update_npc()にfollow_pc()を追加してブルラビくんを追いかけるようなAIを作ります。グリーンスライムから見たブルラビくんの方向を計算して、その方向に毎フレームちょっとずつ移動していく単純なAIです。
ブルラビくんとグリーンスライムの間の距離の関数distance()は以前の記事で作ったものです。

スライムのアニメーション的には既に十分な感じですが、1方向のアニメーションしかしてないので進む方向によってスプライトを変えてみます。


一応進む方向によってスプライトが切り替わっています。
NPC同士が重ならないようにする
現状では動かし続けているとNPCが一箇所にかたまってしまいますのでNPCに衝突判定を設定して重ならないようにしたいと思います。

NPCの座標を更新するupdate_npc()の前に現在のNPCの座標を一時保存しておくox,oyを設定します。
次にupdate_npc()の後に新たに作成した、他のNPCとの衝突判定ロジックavoidance_npc()で自身以外の全NPCとの衝突判定をおこない、判定がtrueだった場合、一時保存しておいたox,oyで更新前の座標に戻す(移動を取りやめる)ことでNPC同士が重なるのを防ぎます。
avoidance_npc()内で使用している関数collision()は以前の記事で作成したものです。

良い感じじゃないですか??NPCは移動速度も衝突判定も全部一律ですがこれをランダムにしたりするとよりっぽくなりそうです。
以上!
次回は撃ったビームにスライムが当たって爆発?したりなんだり、よりゲームっぽくしてみます。