ランダムにモンスターを出現させる
おひさしぶりです。結構更新が開いてしまいました。すみません
でも、更新しない間に少しずつモンスターを発生させるプログラムを作成していました。
今回はモンスターを発生させるプログラムの他、少し改良した部分の解説を行います。
~今回の内容~
初期画面です。犬がいます。階段まで移動します。
階段の近くまで移動しました。この時、下の犬が移動していることがわかると思います。
階段を上り、次のマップに移動しました。黒い玉ねぎがいますね。階段の近くまで移動します。
階段の近くまで移動しました。この時、黒い玉ねぎも同時に移動しています。
~プログラムの説明~
276行目では敵キャラ「オニオン」をマップ上に表示させるプログラムを書いています。
276行目でグローバル変数Enemy1にモンスターオブジェクトのインスタンスを格納しています。この変数Enemy1がオニオンインスタンスになります。引数x, yはマップを読み込む際にスライムが読み込まれたタイミングでのx, y の値となります。
例)x座標が3, y座標が5のタイミングでスライムが読み込まれた際にスライムのx, y座標もx=3,y=5となり、マップに表示されます。
また、flag関数を用いることによって、モンスターが出現しているかどうかの判定を行い、モンスターが出現しなかった場合でもプログラムが正常に動作するようにしています。
391行目以降では、マップ上の値が「1」(何も置いていない床)であるときの移動に関するプログラムを書いています。
393行目のif文では敵が左側を向いているかつ左側に壁がある場合のプログラムです。
このプログラムは敵が永遠に壁側に進もうとして画面上で停止してるように見えてしまうことを防ぐために作りました。
394~397行目では左側(壁側)以外にランダムに進むようにプログラムを作成しました。
この時、強制的に右側の通路に入らせるようにするプログラムです。
この状況になったときに439行目によりx座標を1加えるだけで強制的に右側に移動させます。
このプログラムは、敵にマップ間の移動を促す目的で作成しています。このプログラムがない状態でゲームを行うとモンスターがなかなか通路に入らず、マップの一つの区画にとどまってしまいます。そのような状態はゲーム性に問題があると考え、このプログラムを作成しました。
同じようなプログラムを上、下、右、左に通路があった場合を想定して作成しました。
513行目のtick関数にEnemyインスタンスのmoveメソッドを実行し、モンスターの移動先を決めるようにしています。
ここでは、flagがtrueとなり、出現しているモンスターに対してのみmoveメソッドを実行するようにしています。
以上がモンスターをランダムに出現させるプログラムでした。
次に、少し改良した部分を解説します。
マップを描画する際にアイテムをランダムに生成するプログラムです。
主に改良した点は256~263行目です。
ここでは一つのマップに生成するアイテム数の上限を決めています。
257~263行目ではアイテム「seed」の出現数を指定しています。
257行目のif文で変数seedの値が変数rndよりも低い場合にマップ上にアイテム「seed」を描画できるようにしています。変数rndは243行目にあり、マップを読み込む際にランダムで1~4の値が決定されます。変数seedの値が変数rndと同等になった時、261行目のelse文を実行するようにし、アイテムを生成しないようにしています。
258行目でマップ上にアイテムを生成するようにし、259行目で変数seedの値をインクリメントしています。
以上が、今回改良したプログラムの解説になります。
おわり
今回はモンスターの配置と移動に関するプログラムを作成しました。実はこのプログラムを作成し始めてから2カ月ほど経っているため覚えているか不安でしたが、作成したプログラムを眺めていくうちに機能を思い出すことができて安心しました。
今まで忙しい日々が続いていたのですが、それも一段落し何とかゲームの製作に集中できそうです。
今後はモンスターと戦うプログラムを作成しようと思います。ターン性で交互に戦うプログラムを書きたいけどうまく書くことができるでしょうか。。。
通路に入らせるプログラム面白いです👏
返信削除モンスター同士が同じマスを通るとき
スルーしてしまうのが気になりました!!
コメントありがとうございます!
削除確かにスルーしちゃうとゲームとして変ですよね、、、
改善の参考になります!!