こんにちは。
みてい さんが書きました:プレイヤーを基準に、指定した範囲内のイベントのセルフスイッチを操作したい
敵シンボルがランダムに徘徊するマップにて、使用することでそのアイテムの効果範囲内の敵だけを消すアイテムを作りたいと考えています。
具体的には下記のようなアイテムです
アイテムA:使用したとき、プレイヤーの周囲1マス内にいる敵シンボルを消す(一時消去する)
アイテムB:使用したとき、プレイヤーの前方3マス内の敵シンボルを消す(一時消去する)
また、敵を消す際は、敵シンボルの種類ごとに異なるドロップアイテムをその場に残すようにしたいと思っています(敵AはアイテムAをマップ上に残して消え、敵BはアイテムBを残すといったイメージです)
上記を実現する手段として、「操作キャラを基準に、一定範囲内を指定し、その範囲内のイベントのセルフスイッチをonにする」方法がないかを模索しております(敵シンボルのイベントを、セルフスイッチで接触で取得できるアイテムイベントに変化させようという魂胆です)。
対象のセルフスイッチを操作する方法までは調べたのですが、自身を中心とした一定範囲内のイベントのみを対象にとるやり方の検討がつかず行き詰っております。
ご助力いただけますと幸いです。
対象のセルフスイッチを操作する方法までは調べているということなので、
イベントコマンドのスクリプトから操作しなければならないということは分かっていると思います。
そのスクリプトに以下のように記述してみてください。
周囲 1 マス (プレイヤーの周りの8マス)を対象にする場合のスクリプト
コード: 全て選択
/* プレイヤーの周囲 1 マス に存在するイベントのセルフスイッチ A を ON にする */
// プレイヤーの X座標、Y座標を取得する
const playerX = $gamePlayer.x;
const playerY = $gamePlayer.y;
// プレイヤーの X座標 - 1 から X座標 + 1 までを走査する
for (let x = playerX - 1; x <= playerX + 1; x++) {
// プレイヤーの Y座標 - 1 から Y座標 + 1 までを走査する
for (let y = playerY - 1; y <= playerY + 1; y ++) {
// 走査している座標のイベント情報を取得し、それぞれに対して処理を行なう
$gameMap.eventsXy(x, y).forEach(event => {
// 現在マップのID, イベントのID、セルフスイッチの番号 をキーワードにセルフスイッチを ON にする。
$gameSelfSwitches.setValue([this._mapId, event.eventId(),'A'], true);
});
}
}
プレイヤーの前方 3 マスを対象にする場合のスクリプト
コード: 全て選択
/* プレイヤーの前方 3 マスに存在するイベントのセルフスイッチ A を ON にする*/
// プレイヤーの X座標、Y座標、向き を取得する
const playerX = $gamePlayer.x;
const playerY = $gamePlayer.y;
const direction = $gamePlayer.direction();
// プレイヤーの向きに応じて処理分け
switch (direction) {
case 2:
// プレイヤーが下向きの場合
// X はプレイヤーのX座標に固定し、
// プレイヤーの Y座標 + 1 から プレイヤーの Y座標 + 3 までを走査する
for (x = playerX, y = playerY + 1; y <= playerY + 3; y++) {
// 走査している座標のイベント情報を取得し、それぞれに対して処理を行なう
$gameMap.eventsXy(x, y).forEach(event => {
// 現在のマップのID、イベントのID、セルフスイッチの番号 をキーワードに セルフスイッチを ON にする
$gameSelfSwitches.setValue([this._mapId, event.eventId(),'A'], true);
});
}
break;
case 4:
// プレイヤーが左向きの場合
// Y はプレイヤーのY座標に固定し、
// プレイヤーの X座標 - 3 から プレイヤーの X座標 - 1 までを走査する
for (x = playerX - 3, y = playerY; x <= playerX - 1; x++) {
// 走査している座標のイベント情報を取得し、それぞれに対して処理を行なう
$gameMap.eventsXy(x, y).forEach(event => {
// 現在のマップのID、イベントのID、セルフスイッチの番号 をキーワードに セルフスイッチを ON にする
$gameSelfSwitches.setValue([this._mapId, event.eventId(),'A'], true);
});
}
break;
case 6:
// プレイヤーが右向きの場合
// Y はプレイヤーのY座標に固定し、
// プレイヤーの X座標 + 1 から プレイヤーの X座標 + 3 までを走査する
for (x = playerX + 1, y = playerY; x <= playerX + 3; x++) {
// 走査している座標のイベント情報を取得し、それぞれに対して処理を行なう
$gameMap.eventsXy(x, y).forEach(event => {
// 現在のマップのID、イベントのID、セルフスイッチの番号 をキーワードに セルフスイッチを ON にする
$gameSelfSwitches.setValue([this._mapId, event.eventId(),'A'], true);
});
}
break;
case 8:
// プレイヤーが下向きの場合
// X はプレイヤーの X座標に固定し、
// プレイヤーの Y座標 - 3 から プレイヤーの Y座標 - 1 までを走査する
for (x = playerX, y = playerY - 3; y <= playerY - 1; y ++) {
// 走査している座標のイベント情報を取得し、それぞれに対して処理を行なう
$gameMap.eventsXy(x, y).forEach(event => {
// 現在のマップのID、イベントのID、セルフスイッチの番号 をキーワードに セルフスイッチを ON にする
$gameSelfSwitches.setValue([this._mapId, event.eventId(),'A'], true);
});
}
break;
}
おそらく、これで希望通りの挙動になるのではないかと思います。
ご確認ください。