ダメージタイルに関するパズルを作成中で、少し助けが必要です。
簡単に言うと、岩を毒タイルに押して、それが橋タイルに変化し、その後ダメージを受けずに渡れるようにするパズルを作りたいのです。しかし、どのように試しても、キャラクターがその上を渡るときにダメージを受けてしまいます。
これを回避する方法に関するチュートリアルを探しましたが、見つかったもののほとんどが私のやりたいことと合いません。どなたかお手伝いいただけないでしょうか?
ダメージタイルに関するパズルを作成中で、少し助けが必要です。
簡単に言うと、岩を毒タイルに押して、それが橋タイルに変化し、その後ダメージを受けずに渡れるようにするパズルを作りたいのです。しかし、どのように試しても、キャラクターがその上を渡るときにダメージを受けてしまいます。
これを回避する方法に関するチュートリアルを探しましたが、見つかったもののほとんどが私のやりたいことと合いません。どなたかお手伝いいただけないでしょうか?
rpg_objects.js の5987行目。これは修正方法を検討する必要があるコードです。
Game_Map.prototype.isDamageFloor = function(x, y) {
return this.isValid(x, y) && this.checkLayeredTilesFlags(x, y, 0x100);
};
上記の内容を .js ファイルとして保存し、プラグインとしてインストールすることで、プラグイン内で記述した内容で通常の機能が上書きされます。
さて、問題はどのようにしてゲームに「この毒タイルはもはや毒タイルではない」と伝えるかです。タイルの下にイベントがあるかどうかをチェックする方法は、毒タイルの上に配置されているカットシーンイベントと競合する可能性があります。もちろん、毒タイルの上にイベントを配置しないことで、この問題を回避することもできます。
そのため、「毒タイル上にイベントがあれば、それはもはや毒タイルではない」という動作をゲームにさせたい場合は、以下のコードを .js ファイルとして保存し、プラグインとしてインストールしてください。ただし、イベント数が非常に多いマップでは、ゲームのパフォーマンスに悪影響(ラグ)を与える可能性があることにご注意ください。
_aliasIsDamageFloor = Game_Map.prototype.isDamageFloor;
Game_Map.prototype.isDamageFloor = function(x, y) {
return _aliasIsDamageFloor.call(this, x, y) && this.eventsXy(x, y).length == 0;
};
ダメージタイルの代わりとしてイベントで擬似的なダメージ処理をすることが多いです。VXAce以降では、特定のリージョン上にいるかをチェックし、該当する場合はダメージを与えるようなイベントを作成できます。また、橋を落とす箇所については、橋のロジックの一部として処理します。橋が設置されている場合はダメージを与えず、設置されていない場合はダメージを与えるようにします。
コードでより良い方法があるのは確かですが、急ぎで簡易的な解決策が必要な場合は、上記のような手法をよく使います。
これは少し誤解を招く表現だと思います。技術的には正しいですが、シーンが頻繁にリフレッシュされるわけではありません。私が知る限り、別のシーンに移動して戻った場合(戦闘、メニュー開閉など)のみです。
実務的にこれが意味するのは、後から橋をダメージタイルに戻す必要がある場合、正常に機能しない可能性があるということです。ただし、一方向の変換で済むのであれば、このアプローチで問題ないはずです。