ページ 11

【質問】イベントを追いかけるイベント【解決】

Posted: 2019年11月05日(火) 03:09
by かになべ
特定のイベントが特定の範囲内に入ると追いかける、というよりスイッチが入るイベントを作る方法を探しています
プラグイン、コモンイベント、何でもいいので教えてくださるとありがたいです

Re: 【質問】イベントを追いかけるイベント

Posted: 2019年11月05日(火) 12:17
by ムノクラ
かになべ さんが書きました:特定のイベントが特定の範囲内に入ると追いかける、というよりスイッチが入るイベントを作る方法を探しています
プラグイン、コモンイベント、何でもいいので教えてくださるとありがたいです
▼SC Get Distance(さくらくらうど様作)
https://plugin.fungamemake.com/archives/12655
イベントとイベント、イベントと座標との距離を計算します。プラグインコマンドで呼び出して使います。

範囲内(向きなどは無視)でしたら、上記のプラグインのプラグインコマンドを並行処理で監視(距離が小さくなったらスイッチを入れるなど)を作れば実現できると思います。
※並行処理内でループを行わないように注意してくださいね。(重くなるし、無駄な処理になることが多いので)

Re: 【質問】イベントを追いかけるイベント

Posted: 2019年11月06日(水) 17:17
by かになべ
丁寧な返信ありがとうございます!
早速導入しようと思ったのですが、この仕様では壁の向こうに居ても感知されてしまいます
どうにか壁から先は範囲に入れないように出来ないでしょうか...?
あれこれと考えてはみたのですがどうにも再現は出来ず、八方塞がりです
いい案があれば教えてくださるとありがたいです

Re: 【質問】イベントを追いかけるイベント

Posted: 2019年11月06日(水) 18:17
by 虚構の城跡
かになべ さんが書きました:丁寧な返信ありがとうございます!
早速導入しようと思ったのですが、この仕様では壁の向こうに居ても感知されてしまいます
どうにか壁から先は範囲に入れないように出来ないでしょうか...?
あれこれと考えてはみたのですがどうにも再現は出来ず、八方塞がりです
いい案があれば教えてくださるとありがたいです
イベント範囲が拡大するタイプのプラグインは結構ありますが、その中でマンカインド様のプラグインを利用してみては?
http://mankind-games.blogspot.com/2016/ ... -post.html

Re: 【質問】イベントを追いかけるイベント

Posted: 2019年11月06日(水) 20:32
by かになべ
虚構の城跡様 返信ありがとうございます

自分もツクマテで質問する前にそのプラグインは見つけていて、最初はコイツが使えるか、と思ってました
しかし、これの場合視界内に入ったプレイヤーには反応しますが、イベントには反応せずあえなく断念した次第です
お手間を取らせてしまい申し訳ありません・・・!

Re: 【質問】イベントを追いかけるイベント

Posted: 2019年11月06日(水) 21:25
by ムノクラ
かになべ さんが書きました:虚構の城跡様 返信ありがとうございます

自分もツクマテで質問する前にそのプラグインは見つけていて、最初はコイツが使えるか、と思ってました
しかし、これの場合視界内に入ったプレイヤーには反応しますが、イベントには反応せずあえなく断念した次第です
お手間を取らせてしまい申し訳ありません・・・!
実現したい要件が曖昧で、提案しかねます。

かになべさんの、今までの発信で
▼想定できるもの
1.イベントに反応するイベントを作りたい(プレイヤーは関係ない?)
2.イベントが2つかそれ以上。
3.ある条件が満たされると、スイッチ等をコントロールできる仕組みを作りたい。

▼想定できないもの
1.イベントは2つ?3つ以上ではない?いくつ?
2.プレイヤーはそれには関わらない?
3.各イベントはスイッチ前後で、固定?移動する?移動するなら、それは決まったルート?ランダム?
4.条件を満たすのが「特定の範囲」であるが、その範囲は距離ではない(だけではない)らしいので、条件が全くわからない。

質問をどこまで具体的に書けるかで、解決できるかの8割が決まると思ってください。
今のままだと、まず解決できません。
条件を箇条書きに可能な限り書き出したり、図にしたり、工夫してみてください。

Re: 【質問】イベントを追いかけるイベント

Posted: 2019年11月09日(土) 22:59
by ジャングル
ちょっと興味があったので調べてみました

こういうことでしょうか?
https://www.youtube.com/watch?v=QFFz3P6Gv1I
特定イベントが、他の特定イベントの侵入を検知します
(壁があると検知しません。10歩以上離れていても検知しません)

※ハロルドの前方縦横5マスが視界範囲です


▼このコードをプラグインにしてjs/pluginsに入れてONにしてください(ただし別途ライブラリが必要です)

コード: 全て選択

(function(_global) {

	// マップID、侵入時にオンするスイッチ番号、主体イベントID、対象イベントID
	var mapId = 2, switchNumber = 7, subjectEventId = 16, targetEventId = 20;//★
	
	// 主体イベントの視界
	var checkRange = 5;
	// 追跡可能歩数(これ以上離れている場合は、壁で隔たれていると判断してスイッチを入れない)
	var traceRange = 10;
	// その他
	var astar = _global.astar, 
		Graph = _global.Graph, 
		graph,
		checkWaitCount = 60;
		
	// 対象イベントを赤くする処理
	var BlendRed = {
		reslis: [],
		addRed: function(res) {
			this.reslis[this.reslis.length] = SceneManager._scene._spriteset._characterSprites[res - 1];
			if (this.reslis[this.reslis.length - 1]) {
				this.reslis[this.reslis.length - 1].setBlendColor([255, 0, 0, 200]);
			}
		},
		eraseRed: function() {
			this.reslis.forEach(function(res) { res._blendColor = []; });
			this.reslis = [];
		},
		alert: function(ev) {
			ev.requestBalloon(1);
			AudioManager.playSe({"name":"Shot2","volume":90,"pitch":100,"pan":0});
		}
	};

	//============================================================
	// AStar関係の処理
	//============================================================
	Object.defineProperty(Scene_Map.prototype, "createGraph", {
		value: function() {
			var g = [];
			for (var x=0, len2=$gameMap.width(); x<len2; x++) {
				g[g.length] = [];
				for (var y=0, len=$gameMap.height(); y<len; y++) {
					g[x][y] = $gameMap.isPassable(x, y) ? 1 : 0;
				}
			}
			graph = new Graph(g);
		}
	});
	var _Scene_Map_start = Scene_Map.prototype.start;
	Scene_Map.prototype.start = function() {
		_Scene_Map_start.call(this);
		if (!graph) {
			this.createGraph();
		}
	};
	Object.defineProperty(Game_Event.prototype, "traceTarget", {
		value: function(res) {
			var start = graph.grid[this.x][this.y];
			var end = graph.grid[$gameMap.event(res).x][$gameMap.event(res).y];
			var options = {};
			return astar.search(graph, start, end, options);
		}
	});
	
	//============================================================
	// 主体イベント
	//============================================================
	var _Game_Event_initialize = Game_Event.prototype.initialize;
	Game_Event.prototype.initialize = function(mapId, eventId) {
		this._checkCountX = 0;
		this._checkCountY = 0;
		this._checkWaitCount = checkWaitCount;
	  	_Game_Event_initialize.apply(this, arguments);	
	};
	Game_Event.prototype.checkOtherEvent = function() {
		var id = 0, direction = this._direction, dx = 1, dy = 1;
		if (direction === 4) { dx *= -1; }
		if (direction === 8) { dy *= -1; }
		for (var i = 0, l = checkRange ** 2; i < l; i++) {
			var n = this._checkCountY % checkRange;
			if (n === checkRange - 1) { this._checkCountX++; }
			if (direction === 2 || direction === 8) {
				var x = this.x + this._checkCountX % checkRange - Math.floor(checkRange / 2);
				var y = this.y + n * dy + 1 * dy;
			} else {
				var x = this.x + this._checkCountX % checkRange * dx + 1 * dx;
				var y = this.y + this._checkCountY % checkRange - Math.floor(checkRange / 2);
			}
			id = $gameMap.eventIdXy(x, y);
			if (targetEventId) {
				if (id === targetEventId) { break; }
			} else {
				if (id) { break; }
			}
			this._checkCountY++;
		}
		return id;
	};
	var _Game_Event_update = Game_Event.prototype.update;
	Game_Event.prototype.update = function() {
		if (this._eventId === subjectEventId && this._mapId === mapId) {
			if (this._checkWaitCount <= 0) {
				this._checkWaitCount = 0;
				BlendRed.eraseRed();
			} else {
				this._checkWaitCount--;
			}
			var res = this.checkOtherEvent();
			if (res) {
				if (targetEventId && res !== targetEventId) { return; }
				var route = this.traceTarget(res);
				if (route.length !== 0 && route.length <= traceRange) {
				//console.log(route);
					if (this._checkWaitCount === 0) {
						$gameSwitches.setValue(switchNumber, true);
						//console.log("in " + res);
						console.log($gameSwitches.value(switchNumber));
						BlendRed.alert(this);
						BlendRed.addRed(res);
						BlendRed.eraseRed();
						if (this._checkWaitCount === 0) { this._checkWaitCount = checkWaitCount; }
					}
				}
			} else {
				if ($gameSwitches.value(switchNumber)) {
					$gameSwitches.setValue(switchNumber, false);
					//console.log("out");
					console.log($gameSwitches.value(switchNumber));
				}
			}
		}
		_Game_Event_update.call(this);
	};
})(this);
このコードは、他者様が書いたAStarライブラリを使用しています
MITライセンスで公開されているので、このコードの上に配してONすれば機能します
https://github.com/bgrins/javascript-as ... 5/astar.js

つまり、次のような構成で使用します
astar.js
上のコード.js

※このAStarライブラリで、壁の向こうに行けるかどうかを判定しています


※特定の対象を指定しない場合はこうなります
https://www.youtube.com/watch?v=OEsguyr25AA

その場合はコード内の★の行を次のようにします

コード: 全て選択

var mapId = 2, switchNumber = 7, subjectEventId = 16, targetEventId;//★
※仕事の合間に書いたので、あまりきちんとしたコードではないかもしれません
※しばらく忙しくなるので対応などは不可能だと思いますが、まあ参考までにしてください

Re: 【質問】イベントを追いかけるイベント

Posted: 2019年11月10日(日) 02:33
by かになべ
>ムノクラ様
返信遅くなってしまって申し訳ありません!
曖昧ですか・・・説明不足でした 申し訳ありません。
それでは分からないといわれた部分に対して返答をしたいと思います

1.イベントは2つ?3つ以上ではない?いくつ?
出来ることなら三つ以上にも対応出来るといいですね
しかし、イベントの複雑さがあがると比例してバグや処理などに問題が出そうでもあるので難しいところです

2.プレイヤーはそれには関わらない?
これも出来ることなら、プレイヤーもイベントの一つとして関わらせられないかなと思っています

3.各イベントはスイッチ前後で、固定?移動する?移動するなら、それは決まったルート?ランダム?
移動させたいです 今作っているのが見つけたイベントを追いかけるイベントなので
しかし、これについてはイベントページとセルフスイッチを使った処理で代用が出来ると思っています

4.条件を満たすのが「特定の範囲」であるが、その範囲は距離ではない(だけではない)らしいので、条件が全くわからない。
説明不足でしたね・・・ 言うならば上で出していただいた「プレイヤー探索プラグイン」のように壁や障害物に視界が邪魔される扇型の範囲ってのが私の頭の中の理想ですね

>ジャングル様
おお、これは凄いですね!
少し触らせていただきます。
わざわざありがとうございました!