【解決】プレイヤーが矩形内に入っているかの監視

アバター
冷やっこ
記事: 132
登録日時: 2020年3月04日(水) 22:47

【解決】プレイヤーが矩形内に入っているかの監視

投稿記事by 冷やっこ » 2020年3月27日(金) 21:37

何時もお世話になっております。
またどうぞ宜しくお願い致します。

111.png

上記画像のようにイベントを中心に並列処理で赤のマスにプレイヤーが入っているかを監視し
プレイヤーが赤のマスに入ったらアクションを起こす、と言うイベントを製作中なのですが思うようにうまくいきません。
※赤いマスは例ですので実際には表示されません。

コード: 全て選択

◆変数の操作:#0001 イベントとの距離X = Math.abs(this.character(-1).x - this.character(0).x)
◆変数の操作:#0002 イベントとの距離Y = Math.abs(this.character(-1).y - this.character(0).y)
◆条件分岐:イベントとの距離X ≥ 3
  ◆条件分岐:イベントとの距離X ≤ 4
    ◆条件分岐:イベントとの距離Y ≤ 4
      ◆フキダシアイコンの表示:このイベント, びっくり (ウェイト)
      ◆
    :分岐終了
    ◆
  :分岐終了
  ◆
:分岐終了

プレイヤーとイベントとの距離や絶対値など、それらしいスクリプトなどを見つけて色々試行錯誤しているのですが…。
当然上記コードでは駄目です。
1マスづつ総当たりでプレイヤーが入っているかを調べる事はできるとは思うのですが効率が悪いというか…。
上記画像では赤いマスの範囲がひし形矩形3マス以上4マス未満の間を監視しているのですが
これはあくまでもとりあえずですので例えば2マス以上7マス未満とか臨機応変に対応するには総当たりでは中々大変かなと思いまして…。

ちなみにマンカインド様のプレイヤー探索プラグイン http://mankind-games.blogspot.com/2016/ ... -post.html もお借りしているのですがこちらのプラグインでは上記画像のような中抜き?の矩形の探索はできないかなと。
もし私の見落としなどでしたら申し訳ないのですが…。

どなたかお知恵をお貸し頂けたらありがたいです。
また、もしスクリプトなどを使用しても難しいようであればプラグイン製作をお願いしようかとも考えております。
それではどうぞ宜しくお願い致します。
最後に編集したユーザー 冷やっこ on 2020年3月28日(土) 08:02 [ 編集 2 回目 ]

アバター
Plasma Dark
記事: 668
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: プレイヤーが矩形内に入っているかの監視

投稿記事by Plasma Dark » 2020年3月27日(金) 22:12

当然上記コードでは駄目です。


なぜだめなのでしょう。
アプローチとしては正解に近いものだと思います。

ところで、プレイヤーと対象イベントの距離というのは、それぞれのx座標の差の絶対値とy座標の差の絶対値を合計したものだと思いますが、どうでしょうか。
アバター
冷やっこ
記事: 132
登録日時: 2020年3月04日(水) 22:47

Re: プレイヤーが矩形内に入っているかの監視

投稿記事by 冷やっこ » 2020年3月28日(土) 02:11

Plasma Dark様

返信ありがとうございます!
なぜだめなのでしょう。
アプローチとしては正解に近いものだと思います。

そうなのでしょうか?
ただただなんとなくこんな感じかなと製作していたもので…。

222.png

上記画像の中抜きの正方形ならば

コード: 全て選択

◆変数の操作:#0001 イベントとの距離X = Math.abs(this.character(-1).x - this.character(0).x)
◆変数の操作:#0002 イベントとの距離Y = Math.abs(this.character(-1).y - this.character(0).y)
◆条件分岐:イベントとの距離X ≥ 3
  ◆条件分岐:イベントとの距離X ≤ 4
    ◆条件分岐:イベントとの距離Y ≤ 4
      ◆フキダシアイコンの表示:このイベント, びっくり (ウェイト)
      ◆
    :分岐終了
    ◆
  :分岐終了
  ◆
:分岐終了
◆条件分岐:イベントとの距離Y ≥ 3
  ◆条件分岐:イベントとの距離Y ≤ 4
    ◆条件分岐:イベントとの距離X ≤ 4
      ◆フキダシアイコンの表示:このイベント, びっくり (ウェイト)
      ◆
    :分岐終了
    ◆
  :分岐終了
  ◆
:分岐終了

これでプレイヤーが赤いマスに入っているかを監視する事ができました。
ただこの正方形からひし形の矩形の監視をどのようにすればよいのかがなんだかよくわからなくて…。

ところで、プレイヤーと対象イベントの距離というのは、それぞれのx座標の差の絶対値とy座標の差の絶対値を合計したものだと思いますが、どうでしょうか。

そういう事も実際はよくわかってないんです…。
それらしいスクリプトやら色々と検索をして組み合わせてたらこのような形になった、という感じです…。
アバター
Plasma Dark
記事: 668
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: プレイヤーが矩形内に入っているかの監視

投稿記事by Plasma Dark » 2020年3月28日(土) 06:41

要件から仕様を明らかにしようとする場合、まず手元で1つずつ計算してみることをオススメします。

幸い、プレイヤーと対象イベントの位置関係でアクションが発生してほしいマスを画像でよくわかるようにされているので、まずそれぞれの赤マスについてプレイヤーの座標とイベントの座標の関係を書き出してみてください。

プレイヤーの座標を (Px, Py) とし、イベントの座標を (Ex, Ey) としたとき、両者の間にどういう関係が成り立っている時にアクションさせたいか、を数式化できれば、そこからどういう処理を書けばよいか自ずとわかります。

こんな関係が成り立つ際にアクションさせたいのだと思います。
4 >= |Px - Ex| + |Py - Ey| >= 3

念の為プログラム的な意味を説明しておくと
this.character(-1).x はプレイヤーのx座標、
this.character(0).x は実行中のイベントのx座標を表します。

コード: 全て選択

Math.abs(this.character(-1).x - this.character(0).x)


このコードでは、プレイヤーとイベントのx座標の差の絶対値、つまりx座標でどれだけ離れているかを計算しています。
さっきの式で言えば、 |Px - Ex| の部分です。
これをy座標についても計算しているようでしたので、それらの合計がどの範囲にあるか、という分岐さえ書けば目的は果たせるのではないかと。
アバター
冷やっこ
記事: 132
登録日時: 2020年3月04日(水) 22:47

Re: プレイヤーが矩形内に入っているかの監視

投稿記事by 冷やっこ » 2020年3月28日(土) 07:46

Plasma Dark様
返信ありがとうございます!

4 >= |Px - Ex| + |Py - Ey| >= 3

この数式を元にプレイヤーとイベントの座標の関係を求めていったらわかってきてスッキリできました!
そしてこの数式を元に

コード: 全て選択

◆変数の操作:#0001 イベントとの距離X = Math.abs(this.character(-1).x - this.character(0).x)
◆変数の操作:#0002 イベントとの距離Y = Math.abs(this.character(-1).y - this.character(0).y)
◆変数の操作:#0003 距離Xと距離Yの合計 = $gameVariables.value(1) + $gameVariables.value(2)
◆条件分岐:距離Xと距離Yの合計 ≥ 3
  ◆条件分岐:距離Xと距離Yの合計 ≤ 4
    ◆フキダシアイコンの表示:このイベント, びっくり (ウェイト)
    ◆
  :分岐終了
  ◆
:分岐終了

上記のようにイベントを製作したところ無事にひし形矩形の監視ができるようになりました!
これなら汎用性も十二分ですし本当にありがたいです!
私の力だけでは上記の数式にたどり着く事ができませんでした…。
それにしてもこの様な短いコードで求める事ができるのですね…。
考え方などもとても参考にもなりました。
Plasma Dark様、この度はお世話になり本当にありがとうございました!

“MV:質問” へ戻る