ページ 1 / 1
イベントどうしのプライオリティ判定が厳しすぎる件
Posted: 2016年7月23日(土) 01:09
by yamachan
こんばんは!
ふと気がついたのですが、イベントの動作タイプを「ランダム」とか「近づく」とかして画面を動かしているとき、他のイベントを避けませんか?
例えば季節によって種類を変えたくて、プライオリティを 「通常キャラの下」 にした花のグラフィックのイベントをマップに敷き詰めた場合、上記の敵はそのエリアに入ってこないようです。
気になって調べてみると、Game_CharacterBase.prototype.isCollidedWithEvents ではちゃんとプライオリティを考慮した判定をしていますが…
わざわざサブクラスの Game_Event.prototype.isCollidedWithEvents でそれを無効化しているようなんです。
処理の簡略化でスピードアップかな?とも思ったのですが、その前後の処理を考えるとここだけ省略するのも不思議です。
わざわざ無効化している理由がわからないのですが、どなたかご存知ないでしょうか?
こんな場合があるからじゃない?などの想像話、また雑談レベルでかまいません。
Re: イベントどうしのプライオリティ判定が厳しすぎる件
Posted: 2016年7月23日(土) 06:36
by 奏ねこま
複数のイベントが同じマスにいた場合、プレイヤーが接触した際に
どちらのイベントを起動するかが曖昧になるから、とかですかね?
また、MVは実装レベルで見ても今までのツクールの仕様をそのまま引き継いでいるところがあるので、
過去に何らかの理由があってそうしていたけど、今はただそれがそのままになっているだけ、
ということもあると思います。
Re: イベントどうしのプライオリティ判定が厳しすぎる件
Posted: 2016年7月23日(土) 10:09
by やなつき
その仕様があることで、空イベントを置くことでランダムやプレイヤーに近づく等のイベントが侵入不可能な領域を手軽に作ることが可能です。
マップの境界などにイベントが居座って邪魔をするというような挙動も、この仕様を使えば回避できます。
個人的には、結構理にかなった仕様だと思ってます。
Re: イベントどうしのプライオリティ判定が厳しすぎる件
Posted: 2016年7月23日(土) 11:26
by yamachan
やなつきさん、こまさん、ありがとうございます。
シリーズで洗練されてきたゲーム構造なので、歴史的な経緯はありそうですね。
マップの境界などにイベントが居座って邪魔をするというような挙動も、この仕様を使えば回避できます。
むむ、なるほど、これは気がつきませんでした。
そういえばマップ移動もイベントなので、その位置に居座られると移動できなくてイライラしそうですね。
Re: イベントどうしのプライオリティ判定が厳しすぎる件
Posted: 2016年7月23日(土) 11:49
by yamachan
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にしていたようですが、それだと通常の壁などもすり抜けてしまいます。
このプラグインでは下に敷くほうのイベントの「すり抜け」フラグを利用することで、より設定が容易になるのではないかとおもいます。
元の関数を置き換えるように実装していますので、お気をつけください。
該当関数をフックするようなプラグインがあれば、それより前に本プラグインを読み込む必要がありそうです。
Re: イベントどうしのプライオリティ判定が厳しすぎる件
Posted: 2016年7月23日(土) 12:29
by Trb
こんにちは。
コード見させて貰いましたが、すり抜けフラグの判定はeventsXyNt(x, y)に含まれているので、下に敷くイベントのすり抜けをオンにした場合はデフォルトのままでもちゃんとすり抜けてくれるようになるはずですよー。
Re: イベントどうしのプライオリティ判定が厳しすぎる件
Posted: 2016年7月23日(土) 12:58
by yamachan
こんにちは!
Trb さん、ありがとうございます。
ご指摘のとおりでした、すみません。
コード: 全て選択
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 を修行しないと駄目ですね。 恥ずかしい…
