「全て消去する」処理

アバター
BumbleB
記事: 11
登録日時: 2017年2月27日(月) 05:28

「全て消去する」処理

投稿記事by BumbleB » 2018年6月25日(月) 01:33

いつもお世話になっています。
ツクールのエディターではスキルやアイテムを一括して全て覚えるor忘れる、取得するor破棄する
というようなイベント設定がないのですが、皆さんはどのように処理されていますか?自分は

スクリプト例:パーティー全員がタイプId1のスキルを全て忘れる
$gameParty.members().forEach(function(actor){
var actorSkills = actor._skills;
var actorSkills2 = actorSkills.concat();
//参照渡しのままだとforEachの処理中に止まるので、新しい配列に固定
actorSkills2.forEach(function(skill){
if($dataSkills[skill].stypeId === 1){
$gameActors.actor(actor._actorId).forgetSkill(skill);
}
});
});

としたのですが、もっとシンプルな方法があるでしょうか?javascriptはまだ見よう見まねの勉強という
状態なので、知恵をいただければ助かります。

奏ねこま
記事: 702
登録日時: 2016年1月20日(水) 20:04

Re: 「全て消去する」処理

投稿記事by 奏ねこま » 2018年6月25日(月) 02:52

この程度の内容なら多少書き方を変えても見た目が変わるだけで処理的にはあまり影響はなさそうですが…
ご提示のスクリプトに指摘を加えるなら、$gameActors.actor(actor._actorId)は結局actorと同じでは?
ということくらいでしょうか。actor.forgetSkill(skill)で良いと思います。

短くする意味はあまりありませんが、参考までに短いコードを書いてみるなら、

コード: 全て選択

$gameParty.members().forEach(function(actor) {
    actor._skills = actor._skills.filter(function(skillId) {
        return $dataSkills[skillId].stypeId !== 1;
    });
});

こんな感じで。
filterは条件に一致した要素だけを取り出した新しい配列を作る関数です。
styleIdが1ではないものだけを抽出した配列を作り、それを_skillsに入れています。
forgetSkill関数を使っていませんが、これは_skillsから指定のIDを削除するだけの関数なので
結果的には同じことになります。
アバター
BumbleB
記事: 11
登録日時: 2017年2月27日(月) 05:28

Re: 「全て消去する」処理

投稿記事by BumbleB » 2018年6月25日(月) 03:49

おぉ、ありがとうございます!
filter()メソッドから直接所持スキルの配列を書き換えられるのですね。
いちいちforgetSkill()を呼ぶものだと思っていました。
スマートなコード、参考にさせていただきます!

“MV:質問” へ戻る