【解決済み】配列内の一部アクターを削除したい

返信する
アバター
ドラムカン
記事: 178
登録日時: 2019年11月04日(月) 23:02

【解決済み】配列内の一部アクターを削除したい

投稿記事 by ドラムカン »

いつもお世話になっております。

プラグインの以下のコードで定義されている配列アクターのうち、
一部をスクリプトで削除するにはどのようにしたらよいでしょうか。

コード: 全て選択

Game_Party.prototype.PScriptTest = function() {
    return this._PScript.map(function(id) {
        return $gameActors.actor(id);
    }).filter(function(battler) {
        return battler && battler.TScript();
    }).sort(function(a, b) {
        return a.testNumber() - b.testNumber();
    });
};
$gameParty.PScriptTest ()を変数に入れてconsole.logに出したデータが以下になります。
赤枠で囲っているデータを削除する方法が知りたいです。
1112121.png
以下のコールバック関数を使用して、
標的となるアクターの配列を限定することはできましたが、それを削除する方法が分かりません。

コード: 全て選択

 
 var result = $gameParty.PScriptTest().filter(function(value, index, array) {
             return value === $gameActors.actor(13)
    })
     console.log(result);
 
JSとツクールMVにお詳しい方のご教示がいただけましたら幸いです。
どうかよろしくお願いいたします。
最後に編集したユーザー ドラムカン [ 2021年1月24日(日) 17:53 ], 累計 1 回
アバター
ムノクラ
記事: 2118
登録日時: 2018年2月23日(金) 11:41
連絡する:

Re: 配列内の一部アクターを削除したい

投稿記事 by ムノクラ »

ドラムカン さんが書きました:いつもお世話になっております。

プラグインの以下のコードで定義されている配列アクターのうち、
一部をスクリプトで削除するにはどのようにしたらよいでしょうか。

コード: 全て選択

Game_Party.prototype.PScriptTest = function() {
    return this._PScript.map(function(id) {
        return $gameActors.actor(id);
    }).filter(function(battler) {
        return battler && battler.TScript();
    }).sort(function(a, b) {
        return a.testNumber() - b.testNumber();
    });
};
$gameParty.PScriptTest ()を変数に入れてconsole.logに出したデータが以下になります。
赤枠で囲っているデータを削除する方法が知りたいです。
1112121.png

以下のコールバック関数を使用して、
標的となるアクターの配列を限定することはできましたが、それを削除する方法が分かりません。

コード: 全て選択

 
 var result = $gameParty.PScriptTest().filter(function(value, index, array) {
             return value === $gameActors.actor(13)
    })
     console.log(result);
 
JSとツクールMVにお詳しい方のご教示がいただけましたら幸いです。
どうかよろしくお願いいたします。
一時的にデータ処理として削除したいということでしたら、spliceの下記の例(index 3 の位置 (4番目の要素) から一つ取り除く)でいかがでしょうか
https://developer.mozilla.org/ja/docs/W ... ray/splice

自分は、パーティから外してしまう処理をすることが多いですが…
---
JavaScriptの基本を学習せずにツクールのプラグインやスクリプトを使って横着してゲームを作ろうとしている人間です。
そのような者なので、適当な投稿をするかも知れません。
他の方の投稿を信用してください。
アバター
ドラムカン
記事: 178
登録日時: 2019年11月04日(月) 23:02

Re: 配列内の一部アクターを削除したい

投稿記事 by ドラムカン »

ムノクラ様

いつもお世話になっております。
ご回答いただき、誠にありがとうございます。

実は私もspliceは試したのですが
ゲーム内に反映されません。

$gameParty.PScriptTest().splice(1,1); //アクター2番目を削除
これをスクリプト上で実行しても削除にはなりませんでした。

コールバック関数で使用する場合は、
先に示したような、変数に格納したデータを削除しても意味がないので
$gameParty.PScriptTest()に対して行う必要があるため
以下のようにしたのですが、その場合も削除されませんでした。

コード: 全て選択

$gameParty.PScriptTest().filter(function(value, index, array) {
             return array.splice(1,1);
    })
     console.log($gameParty.PScriptTest());
それとも、記述に誤りがありますでしょうか?
ご教示いただけますと幸いです。
ecf5DTTzl6h6lJj02
記事: 752
登録日時: 2018年12月23日(日) 13:55

Re: 配列内の一部アクターを削除したい

投稿記事 by ecf5DTTzl6h6lJj02 »

こんにちは。
ドラムカン さんが書きました:いつもお世話になっております。

プラグインの以下のコードで定義されている配列アクターのうち、
一部をスクリプトで削除するにはどのようにしたらよいでしょうか。

コード: 全て選択

Game_Party.prototype.PScriptTest = function() {
    return this._PScript.map(function(id) {
        return $gameActors.actor(id);
    }).filter(function(battler) {
        return battler && battler.TScript();
    }).sort(function(a, b) {
        return a.testNumber() - b.testNumber();
    });
};
$gameParty.PScriptTest ()を変数に入れてconsole.logに出したデータが以下になります。
赤枠で囲っているデータを削除する方法が知りたいです。
1112121.png

以下のコールバック関数を使用して、
標的となるアクターの配列を限定することはできましたが、それを削除する方法が分かりません。

コード: 全て選択

 
 var result = $gameParty.PScriptTest().filter(function(value, index, array) {
             return value === $gameActors.actor(13)
    })
     console.log(result);
 
JSとツクールMVにお詳しい方のご教示がいただけましたら幸いです。
どうかよろしくお願いいたします。
質問内容は、イベントで

コード: 全て選択

◆変数の操作:#0362 = $gameParty.PScriptTest()
などとして、$gameParty.PScriptTest()の結果を変数ID:0362に格納すると、
変数ID:0362 に、いらないアクター13番のデータが入っているので、
変数ID:0362 の内容にアクター 13番のデータが含まれないようにしたい。
ということでよろしいでしょうか。

コード: 全て選択

 
 var result = $gameParty.PScriptTest().filter(function(value, index, array) {
             return value === $gameActors.actor(13)
    })
     console.log(result);
 
この処理をかけているのなら、答えにたどり着きそうなのですが、
この内容、filter 関数がどういう処理をしているか把握できているでしょうか。
filter 関数は、配列のそれぞれの要素に対して、
指定されたコールバック関数を実行し、true を返してきた要素を抽出した配列を返却するという関数です。
上記の場合、配列の要素が $gameActors.actor(13) (アクター13番のゲーム中のデータ)と一致するものを抽出して取得しています。
なので、この処理を $gameActors.actor(13) と一致しないものを抽出するように変更すれば、アクター13番の情報が含まれない配列を取得できるはずです。
なので、変数に格納するときに filter 関数で、 この内容のフィルタをかければよいのではないでしょうか。

質問内容を読み間違えていたらすみません。
アバター
ドラムカン
記事: 178
登録日時: 2019年11月04日(月) 23:02

Re: 配列内の一部アクターを削除したい

投稿記事 by ドラムカン »

ecf5DTTzl6h6lJj02 様

いつもお世話になっております。
ecf5DTTzl6h6lJj02 様のお支えによって
開発が円滑に進んでおりますこと、心より感謝申し上げます。

私の書き方がとても紛らわしかったため
誤解されたことと思います、申し訳ございません。

変数に入れる方法は、$gameActors.actor(13)を除外した配列を取れば実現できるのですが
やりたいことは、
$gameParty.PScriptTest()のobjectから、
特定のアクターを削除したいと考えております。

特定の仲間が加入した時点で、$gameParty.PScriptTest()に
そのアクターの情報が配列として保存されてしまうため
今のままでは、途中で特定のアクターを除外したい場面が出てきたら、対応できなくなります。

$gameParty.PScriptTest()にアクター情報が保存されること自体はシステムに必須なので、
ゲームの途中にプレイヤーの任意によって削除が行えるようにする流れを想定しています。

Nullや
Nothingや
''や
$gameParty.removeActor($gameParty._actors[0]);
などで、パーティーから外そうとしても
$gameParty.PScriptTest()に格納されているアクター情報が削除できずに困っております。

何か解決策がありましたら、
どうかよろしくお願いいたします。
ecf5DTTzl6h6lJj02
記事: 752
登録日時: 2018年12月23日(日) 13:55

Re: 配列内の一部アクターを削除したい

投稿記事 by ecf5DTTzl6h6lJj02 »

コード: 全て選択

Game_Party.prototype.PScriptTest = function() {
    return this._PScript.map(function(id) {
        return $gameActors.actor(id);
    }).filter(function(battler) {
        return battler && battler.TScript();
    }).sort(function(a, b) {
        return a.testNumber() - b.testNumber();
    });
};
このスクリプトは、$gamePaty._PScript をもとに、 配列を作成して返却するので、
$gameParty._PScript から、アクター 13番の内容を消さないといけないと思います。
スクリプトの内容を見ると限り、この変数($gameParty._PScript)は、アクターIDの配列のようなので、
削除したいアクターのIDが配列の何番目にあるかを調べて、削除するという処理をすればいいと思います。

コード: 全て選択

let index = $gameParty._PScript.findIndex(actorId => actorId === x);    // xは削除したいアクターのID
if(index >= 0){
$gameParty._PScript.splice(index, 1);
}
で、削除できるか、試してください。
未検証です。ご了承ください。

追記
すいません、コードに抜けてる処理があったので修正しました。
アバター
ドラムカン
記事: 178
登録日時: 2019年11月04日(月) 23:02

Re: 配列内の一部アクターを削除したい

投稿記事 by ドラムカン »

ecf5DTTzl6h6lJj02 様

ご回答いただき、ありがとうございます。

本当に素晴らしいですね!
削除することができました!

いただいたスクリプトの条件式部分でエラーが出たため
試しに
$gameParty._PScript.splice(1, 1);
のみを実行しましたら、見事に削除することができました!

spliceの引数は、変数を使用しますし
コールバック関数不要で削除できることが分かりましたので
それだけで十分すぎるご回答でございます。


てっきり
$gameParty.PScriptTest()から削除するものとばかり思っておりましたので
本当に助かりました。
ecf5DTTzl6h6lJj02 様の助言がなければ、
来週も再来週も、そのまた次の週も、ずっとこの部分に頭を抱えていたかもしれません。

再現環境がないにもかかわらず、的を射たご回答を賜りまして
心から感謝申し上げます。
今後とも、どうかよろしくお願いいたします。


追記:
  赤字で示した部分は誤った情報です。
最後に編集したユーザー ドラムカン [ 2021年1月24日(日) 18:18 ], 累計 5 回
アバター
ドラムカン
記事: 178
登録日時: 2019年11月04日(月) 23:02

Re: 【解決済み】配列内の一部アクターを削除したい

投稿記事 by ドラムカン »

ecf5DTTzl6h6lJj02 様

訂正です。
すみません、こちらの勘違いで
誤った解決法を掲載してしまいました。

$gameParty._PScript.splice(index, 1);
のみで削除できたと考えていたのですが
別の部分に記述していたスクリプトで削除されていたようでした。

やはりコールバック関数は必須で
いただいたスクリプトも、条件式でエラーが出ていたのは
こちら側が設定していた別のスクリプトによるものでした。
大変、失礼いたしました。

いただいたスクリプトで、正しく削除されることを確認いたしました。

コード: 全て選択

let index = $gameParty._PScript.findIndex(actorId => actorId === x);    // xは削除したいアクターのID
if(index >= 0){
$gameParty._PScript.splice(index, 1);
}
正しいスクリプトだったにもかかわらず、
こちらの確認不足によって間違った情報を載せてしまい、困惑されたことと思います。
ご無礼をどうかお許しください。
大変、申し訳ございませんでした。
返信する

“MV:質問”に戻る