ダメージタイルに関するパズルを作成中で、少し助けが必要です。
簡単に言うと、岩を毒タイルに押して、それが橋タイルに変化し、その後ダメージを受けずに渡れるようにするパズルを作りたいのです。しかし、どのように試しても、キャラクターがその上を渡るときにダメージを受けてしまいます。
これを回避する方法に関するチュートリアルを探しましたが、見つかったもののほとんどが私のやりたいことと合いません。どなたかお手伝いいただけないでしょうか?
ダメージタイルに関するパズルを作成中で、少し助けが必要です。
簡単に言うと、岩を毒タイルに押して、それが橋タイルに変化し、その後ダメージを受けずに渡れるようにするパズルを作りたいのです。しかし、どのように試しても、キャラクターがその上を渡るときにダメージを受けてしまいます。
これを回避する方法に関するチュートリアルを探しましたが、見つかったもののほとんどが私のやりたいことと合いません。どなたかお手伝いいただけないでしょうか?
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以降では、特定のリージョン上にいるかをチェックし、該当する場合はダメージを与えるようなイベントを作成できます。また、橋を落とす箇所については、橋のロジックの一部として処理します。橋が設置されている場合はダメージを与えず、設置されていない場合はダメージを与えるようにします。
コードでより良い方法があるのは確かですが、急ぎで簡易的な解決策が必要な場合は、上記のような手法をよく使います。
橋や岩、あるいはそれに類するイベントにカスタムの移動経路を設定します。岩が設置されている際にイベントページで使用する経路です。頻度は最高に設定してください。
移動経路に以下のスクリプト呼び出しをコピーして貼り付けてください:
$dataMap.data[(0 * $dataMap.height + this.y) * $dataMap.width + this.x] = this._tileId
これはイベントの位置のマップタイルを別のタイルに変更します。この例では、イベントのタイルIDは橋のタイル(80)ですが、ダメージフラグのない任意のタイルIDを使用できます。参考までに、イベントのグラフィックがタイルグラフィック以外のものに設定されている場合、「this._tileId」は「0」になり、通行不可能になる可能性があります。ダメージのあるタイルが下にあると仮定しています。これが変更されるタイルです。
$dataMapのタイルを変更するのは一時的なものです。シーンを更新したりリフレッシュしたりした場合(メニューを開いたり、プレイヤーを転送したりするなど)、タイルは元の状態に戻ります。このため、イベントの移動経路は継続的にタイルを変更します。頻度を最高に設定している場合、イベントの移動によってタイルIDが再び置き換えられるまでの遅延は1〜2フレーム程度になるはずです。
これは少し誤解を招く表現だと思います。技術的には正しいですが、シーンが頻繁にリフレッシュされるわけではありません。私が知る限り、別のシーンに移動して戻った場合(戦闘、メニュー開閉など)のみです。
実務的にこれが意味するのは、後から橋をダメージタイルに戻す必要がある場合、正常に機能しない可能性があるということです。ただし、一方向の変換で済むのであれば、このアプローチで問題ないはずです。
マップを再読み込みする可能性のあるプラグインや並列プロセスについては考慮できません。主なポイントは、プレイヤーがセーブしてゲームを終了し、再度ロードした際に、イベントが乗っているダメージタイルが上書きされるように移動経路が保証されることです。
タイルを押し出して $dataMap を初期状態に戻したい場合、最も簡単な方法は移動コマンド(フェードなしで移動先なし)を使用することです。これによりマップタイルも再読み込みされます。ただし、パーティのフォロワーがいる場合、彼らはプレイヤーの位置に収束するため、多少の不具合が生じます。