イベントどうしのプライオリティ判定が厳しすぎる件

アバター
yamachan
記事: 107
登録日時: 2016年6月19日(日) 22:34

イベントどうしのプライオリティ判定が厳しすぎる件

投稿記事by yamachan » 2016年7月23日(土) 01:09

こんばんは! :D

ふと気がついたのですが、イベントの動作タイプを「ランダム」とか「近づく」とかして画面を動かしているとき、他のイベントを避けませんか?
例えば季節によって種類を変えたくて、プライオリティを 「通常キャラの下」 にした花のグラフィックのイベントをマップに敷き詰めた場合、上記の敵はそのエリアに入ってこないようです。

気になって調べてみると、Game_CharacterBase.prototype.isCollidedWithEvents ではちゃんとプライオリティを考慮した判定をしていますが…
わざわざサブクラスの Game_Event.prototype.isCollidedWithEvents でそれを無効化しているようなんです。

処理の簡略化でスピードアップかな?とも思ったのですが、その前後の処理を考えるとここだけ省略するのも不思議です。

わざわざ無効化している理由がわからないのですが、どなたかご存知ないでしょうか?
こんな場合があるからじゃない?などの想像話、また雑談レベルでかまいません。

Toshio Yamashita (yamachan)
Plugin https://github.com/yamachan/jgss-hack/blob/master/README.ja.md
Twitter https://twitter.com/yamachan360

私が作成して本サイトに投稿したコードは著作権を放棄し、利用・改変・配布など全て自由です。
ただし同じ投降内に制限を明記している場合はそちらが優先します。
奏ねこま
記事: 702
登録日時: 2016年1月20日(水) 20:04

Re: イベントどうしのプライオリティ判定が厳しすぎる件

投稿記事by 奏ねこま » 2016年7月23日(土) 06:36

複数のイベントが同じマスにいた場合、プレイヤーが接触した際に
どちらのイベントを起動するかが曖昧になるから、とかですかね?

また、MVは実装レベルで見ても今までのツクールの仕様をそのまま引き継いでいるところがあるので、
過去に何らかの理由があってそうしていたけど、今はただそれがそのままになっているだけ、
ということもあると思います。
アバター
やなつき
記事: 38
登録日時: 2016年3月31日(木) 12:39

Re: イベントどうしのプライオリティ判定が厳しすぎる件

投稿記事by やなつき » 2016年7月23日(土) 10:09

その仕様があることで、空イベントを置くことでランダムやプレイヤーに近づく等のイベントが侵入不可能な領域を手軽に作ることが可能です。
マップの境界などにイベントが居座って邪魔をするというような挙動も、この仕様を使えば回避できます。

個人的には、結構理にかなった仕様だと思ってます。
----------------------------------------------------------------------------
Twitter: https://twitter.com/yanatsuki_
アバター
yamachan
記事: 107
登録日時: 2016年6月19日(日) 22:34

Re: イベントどうしのプライオリティ判定が厳しすぎる件

投稿記事by yamachan » 2016年7月23日(土) 11:26

やなつきさん、こまさん、ありがとうございます。

シリーズで洗練されてきたゲーム構造なので、歴史的な経緯はありそうですね。

マップの境界などにイベントが居座って邪魔をするというような挙動も、この仕様を使えば回避できます。

むむ、なるほど、これは気がつきませんでした。
そういえばマップ移動もイベントなので、その位置に居座られると移動できなくてイライラしそうですね。
Toshio Yamashita (yamachan)
Plugin https://github.com/yamachan/jgss-hack/blob/master/README.ja.md
Twitter https://twitter.com/yamachan360

私が作成して本サイトに投稿したコードは著作権を放棄し、利用・改変・配布など全て自由です。
ただし同じ投降内に制限を明記している場合はそちらが優先します。
アバター
yamachan
記事: 107
登録日時: 2016年6月19日(日) 22:34

Re: イベントどうしのプライオリティ判定が厳しすぎる件

投稿記事by yamachan » 2016年7月23日(土) 11:49

twitter のほうでイベントの「すり抜け」フラグを教えていただきました。
これをうまく使えるような気がしたので、プラグインを作成してみました。

コード: 全て選択

/*:
 * @plugindesc イベントの移動時に「すり抜け」が設定されたイベントをすり抜ける
 */

(function(_global) {
   Game_Event.prototype.isCollidedWithEvents = function(x, y) {
      var events = $gameMap.eventsXyNt(x, y);
      return events.some(function(event) {
         return !event.isThrough();
      });
   };
})(this);


最初に書きました「背景としてプライオリティを通常より下にして配置したイベント」などで、そのイベントの「すり抜け」フラグをONにしておくと、移動するイベントがその上を通るようになります。

これまでは移動するほうのイベントの「すり抜け」をONにしていたようですが、それだと通常の壁などもすり抜けてしまいます。
このプラグインでは下に敷くほうのイベントの「すり抜け」フラグを利用することで、より設定が容易になるのではないかとおもいます。

元の関数を置き換えるように実装していますので、お気をつけください。
該当関数をフックするようなプラグインがあれば、それより前に本プラグインを読み込む必要がありそうです。
添付ファイル
RTK_Test.js
(724 バイト) ダウンロード数: 17 回
Toshio Yamashita (yamachan)
Plugin https://github.com/yamachan/jgss-hack/blob/master/README.ja.md
Twitter https://twitter.com/yamachan360

私が作成して本サイトに投稿したコードは著作権を放棄し、利用・改変・配布など全て自由です。
ただし同じ投降内に制限を明記している場合はそちらが優先します。
アバター
Trb
記事: 151
登録日時: 2015年11月15日(日) 19:26
連絡を取る:

Re: イベントどうしのプライオリティ判定が厳しすぎる件

投稿記事by Trb » 2016年7月23日(土) 12:29

こんにちは。
コード見させて貰いましたが、すり抜けフラグの判定はeventsXyNt(x, y)に含まれているので、下に敷くイベントのすり抜けをオンにした場合はデフォルトのままでもちゃんとすり抜けてくれるようになるはずですよー。
アバター
yamachan
記事: 107
登録日時: 2016年6月19日(日) 22:34

Re: イベントどうしのプライオリティ判定が厳しすぎる件

投稿記事by yamachan » 2016年7月23日(土) 12:58

こんにちは! :D

Trb さん、ありがとうございます。
ご指摘のとおりでした、すみません。 :oops:

コード: 全て選択

Game_Map.prototype.eventsXyNt = function(x, y) {
    return this.events().filter(function(event) {
        return event.posNt(x, y);
    });
};
Game_CharacterBase.prototype.posNt = function(x, y) {
    // No through
    return this.pos(x, y) && !this.isThrough();
};


eventsXyNt が単純に filter してたので、その先の posNt までチェックしていませんでした。。
テストも十分ではありませんでした。。

もっと JavaScript を修行しないと駄目ですね。 恥ずかしい… :oops:
Toshio Yamashita (yamachan)
Plugin https://github.com/yamachan/jgss-hack/blob/master/README.ja.md
Twitter https://twitter.com/yamachan360

私が作成して本サイトに投稿したコードは著作権を放棄し、利用・改変・配布など全て自由です。
ただし同じ投降内に制限を明記している場合はそちらが優先します。

“MV:質問” へ戻る