ウディタでローグライク開発第14弾。
今回はアイテムを投げる処理を実装しました。
竜の迷宮ver1において「矢を撃つ」処理は、障害物の有無を考慮せず、壁を貫通していました。
それに対して、今回実装したアイテムを投げる処理は、壁をちゃんと考慮し、壁に当たった場合は、地面に投げたアイテムが落ちるようにしています。
矢を撃つ処理も、このアイテム投げの処理を利用して実装し直しました。
そして、アイテムが地面に落ちる位置に、すでに別のアイテムがあった場合、それを避けて地面に落ちるようにもしています。
1マスに複数のアイテムを置くことができるようにしてもいいのですが、そのためにはアイテム管理の仕様をいじらないといけないので、やめました。
具体的に、アイテム投げの処理は、「アイテムを投げる処理」→「アイテムを指定した位置に落とす処理」に分けて実装しています。
2つの処理に分けたのは、「アイテムを指定した位置に落とす処理」を、そのままモンスターのアイテムドロップ処理に使うためです。
「アイテムを投げる処理」では、アイテムが飛んでいく飛距離を設定しておき、投げるキャラの正面方向に壁や他のキャラの有無を検索していきます。
最初に見つけた障害物の位置で検索をやめ、障害物が壁だった場合はその手前の位置にアイテムを落とし、他のキャラの場合は投げたアイテムを消去してダメージを与えます。
障害物がなにも見つからなかった場合は、投げた位置から飛距離分だけ飛んでいった位置にアイテムを落とします。
ここまでの処理の実装は簡単だったのですが、「アイテムを指定した位置に落とす処理」において、アイテムを避ける処理を考えるのに苦労しました。
とりあえず、あるアルゴリズムを参考に、図の処理で実装しています。
ここで、「キュー」という言葉ができきますが、これは簡単に言うと、「中に入っているデータを、入れた順番に取り出すことができる、データの入れ物」という感じです。
詳しく知りたい人は、調べてみると勉強になるかもです。
このような処理をすることで、アイテムを落とす予定位置を中心にして、放射状に落とす位置を検索し、適切な位置にアイテムを落としてくれます。
ただ、問題がいくつかあります。
以下の動画を見てください。アイテムを連続して投げている様子です。
動画で確認できる通り、壁をまたいでアイテムが落ちてしまう場合があります。
また、すでに調べ終わった位置を再び調べてしまう場合があり、けっこう無駄があります。
現状でも十分なんですが、まだまだ不安なところがあるので、いずれ処理を調整してみようと思います。
最後に、アイテムを避ける処理は、以上の説明でもわかりづらいと思いますので、サンプルのゲームをアップしておきます。
暗号化してないので、エディターを突っ込めば中身を見られます。
アイテムを避ける処理のサンプルゲーム
今回はアイテムを投げる処理を実装しました。
竜の迷宮ver1において「矢を撃つ」処理は、障害物の有無を考慮せず、壁を貫通していました。
それに対して、今回実装したアイテムを投げる処理は、壁をちゃんと考慮し、壁に当たった場合は、地面に投げたアイテムが落ちるようにしています。
矢を撃つ処理も、このアイテム投げの処理を利用して実装し直しました。
そして、アイテムが地面に落ちる位置に、すでに別のアイテムがあった場合、それを避けて地面に落ちるようにもしています。
1マスに複数のアイテムを置くことができるようにしてもいいのですが、そのためにはアイテム管理の仕様をいじらないといけないので、やめました。
具体的に、アイテム投げの処理は、「アイテムを投げる処理」→「アイテムを指定した位置に落とす処理」に分けて実装しています。
2つの処理に分けたのは、「アイテムを指定した位置に落とす処理」を、そのままモンスターのアイテムドロップ処理に使うためです。
「アイテムを投げる処理」では、アイテムが飛んでいく飛距離を設定しておき、投げるキャラの正面方向に壁や他のキャラの有無を検索していきます。
最初に見つけた障害物の位置で検索をやめ、障害物が壁だった場合はその手前の位置にアイテムを落とし、他のキャラの場合は投げたアイテムを消去してダメージを与えます。
障害物がなにも見つからなかった場合は、投げた位置から飛距離分だけ飛んでいった位置にアイテムを落とします。
ここまでの処理の実装は簡単だったのですが、「アイテムを指定した位置に落とす処理」において、アイテムを避ける処理を考えるのに苦労しました。
とりあえず、あるアルゴリズムを参考に、図の処理で実装しています。
ここで、「キュー」という言葉ができきますが、これは簡単に言うと、「中に入っているデータを、入れた順番に取り出すことができる、データの入れ物」という感じです。
詳しく知りたい人は、調べてみると勉強になるかもです。
このような処理をすることで、アイテムを落とす予定位置を中心にして、放射状に落とす位置を検索し、適切な位置にアイテムを落としてくれます。
ただ、問題がいくつかあります。
以下の動画を見てください。アイテムを連続して投げている様子です。
動画で確認できる通り、壁をまたいでアイテムが落ちてしまう場合があります。
また、すでに調べ終わった位置を再び調べてしまう場合があり、けっこう無駄があります。
現状でも十分なんですが、まだまだ不安なところがあるので、いずれ処理を調整してみようと思います。
最後に、アイテムを避ける処理は、以上の説明でもわかりづらいと思いますので、サンプルのゲームをアップしておきます。
暗号化してないので、エディターを突っ込めば中身を見られます。
アイテムを避ける処理のサンプルゲーム
自分が見つかったら追い掛けてくるやつ。
それだけなら自分が作れる範囲だけどね、
戦闘処理は無理。
自分はどうやって作るかな?
想像中・・・
難しそうだけどね。
システムのイメージとしてはそんな感じです。
倒した相手を仲間にする、という機能は作成中のゲームに実装する予定はありませんが、いずれは作ってみたいですね~。