見出し画像

PICO-8で遊ぼう(モンスターの出現!編

ブルラビくんがビームを撃てるようになったので、次はそれに当たってもらう?モンスター(NPC)を出現させてみます。

本日の教科書

モンスター名:グリーンスライム。
あれです、弱いやつ。

まずはスプライトシートのタブ1モンスター(NPC)を描いてみます。
左上のスプライトの番号は64。
ブルラビくんと同じく上下左右に2コマずつのアニメーション持ってます。
ちょっと贅沢ですね、モンスター(NPC)のくせに()。

キャラクターの処理を共通化する

PC/NPCともに、表示したり動かす処理のほとんどは共通化できます。
またPCもNPCも、テーブルによってそれぞれのデータを管理します。
これまではPCのテーブルはソースコードの冒頭で作っていましたが、今回からその処理をPC/NPC共通のキャラクターのテーブルを作る関数、create_character() にまとめます。

引数のx,yは座標。
s0はキャラクター用のスプライトシートの左上のスプライトの番号。
ブルラビくんのスプライト番号は001、グリーンスライムは064

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

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

PCがグリーンスライムになりました。ビームも撃てます笑

更なる共通化

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

update_c()draw_c()

グリーンスライムを配置してみる

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

NPC用にadd_npc()update_npc()を追加
_init()内で2重ループにて合計14体のグリーンスライム(NPC)を追加。
整然と並ぶグリーンスライム。ピクリとも動きません…AIが無いから!

AIを作る

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

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

命(AI)が吹き込まれたグリーンスライムたち

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

update_npc()face_pc()を追加して向かっている方向を示すn.dを更新します
・・・あんまり変わってないのでは?
一応進む方向によってスプライトが切り替わっています。

NPC同士が重ならないようにする

現状では動かし続けているとNPCが一箇所にかたまってしまいますのでNPCに衝突判定を設定して重ならないようにしたいと思います。

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

良い感じじゃないですか??NPCは移動速度も衝突判定も全部一律ですがこれをランダムにしたりするとよりっぽくなりそうです。

以上!

次回は撃ったビームにスライムが当たって爆発?したりなんだり、よりゲームっぽくしてみます。

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