【解決済み】控えメンバーのスキルをメインメンバーのスキルに引き継ぐ方法

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

【解決済み】控えメンバーのスキルをメインメンバーのスキルに引き継ぐ方法

投稿記事by ドラムカン » 2021年6月02日(水) 00:38

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

実際に具現化したいこととは少し違うのですが
タイトルどおりのことができれば、結果的には実現できる内容となっております。

具体的に申し上げますと
「変身」という独自のシステムを実装しておりまして
これは戦闘中に控えのアクターと差し替えているのですが、
変身前のキャラと同一人物ですから、スキルも共有化したいと考えております。

元のキャラのアクターIDは1で、変身後は10、
両方ともに「魔法」というスキル(スキルタイプID1)を持っています。

Window_ActorCommandクラス内の
this.addSkillCommands();で、スキルコマンドを追加していますので
「this」を、アクターのオブジェクトに差し替えてみましたものの、うまくいきませんでした。

そもそも、this自体にどういった情報が入っているのか分かっておらず
クラス内でconsole.logを使い、thisを参照しても、nullというか、何も入っていませんでした。

アクター.addSkillCommands();といった指定はできないものなのでしょうか?

かなり遠回りなご説明となってしまい申し訳ございません。
どうかご教示のほど、よろしくお願いいたします。
最後に編集したユーザー ドラムカン on 2021年6月02日(水) 18:49 [ 編集 1 回目 ]

アバター
WTR
記事: 559
登録日時: 2015年12月22日(火) 19:14

Re: 控えメンバーのスキルをメインメンバーのスキルに引き継ぐ方法

投稿記事by WTR » 2021年6月02日(水) 10:16

タイトル通りスキルを引き継げばいいのでしょうか。
本文中の試行錯誤の内容とあまり噛み合っていないような気がしますが
とりあえずそのまま受け取るとすると

コード: 全て選択

const actorIdA = 1;
const actorIdB = 10;
const actorA = $gameActors.actor(actorIdA);
const actorB = $gameActors.actor(actorIdB);
actorA._skills.forEach(skillId => actorB.learnSkill(skillId));

こんな感じでアクターAのスキルをアクターBに覚えさせることが可能です。
ただし特徴によって追加されたスキルはスルーされます。

Window_ActorCommand クラス内の this.addSkillCommands()
この this は Window_ActorCommand です。ウィンドウそのものを指しています。

ウィンドウの機能にアクターにスキルを覚えさせるものがあったら嫌じゃないですか?
ウィンドウはアクターの覚えているスキルをただ参照して表示する機能でないと。
スキルを覚えるという処理はアクターの機能のほうにあるべきで、実際そうなっています。

もっとも Window_ActorCommand はそもそもスキルを表示するウィンドウではなく
アクターコマンドを表示するウィンドウなので this.addSkillCommands() も
スキルの表示ではなく、スキルタイプの表示を追加するものですけどね。
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 控えメンバーのスキルをメインメンバーのスキルに引き継ぐ方法

投稿記事by Plasma Dark » 2021年6月02日(水) 10:57

そもそも、this自体にどういった情報が入っているのか分かっておらず
クラス内でconsole.logを使い、thisを参照しても、nullというか、何も入っていませんでした。


thisについて理解するためにはクラスとインスタンスを知っておく必要があります。
https://jsprimer.net/basic/class/

ツクールMVのコードにおいては、上記ページの「関数でのクラス表現」を用いてクラスを定義しています。

Window_ActorCommand クラスのメソッド内で this と書いてあったら、それは Window_ActorCommand クラスのインスタンスを指します。
(厳密に言うのであれば、thisにはもう少し複雑な仕様がありますが、今はこれで十分です)

何も入っていないというのはコンソールの見方を間違えたか、そもそも console.log の処理を通っていないかではないかと思います。

アクター.addSkillCommands();といった指定はできないものなのでしょうか?


要件はひとまず置いて、ツクールMVのクラスが何をするものであるかを知っておくと良さそうです。

rpg_windows.js 内の Window_XXXXX クラスは、その名前の通り、ウィンドウの描画を担っています。
Window_ActorCommand は、「魔法」「防御」「アイテム」などの一段目のコマンドを表示するウィンドウです。
魔法やアイテムを選択した後の、スキルリスト、アイテムリストは別のクラスの役目です。
戦闘におけるスキルリストを表示するウィンドウは Window_BattleSkill クラスですね。

Window_BattleSkill に表示するスキル一覧を設定している箇所は、 Window_SkillList.prototype.makeItemList です。
Window_BattleSkill は Window_SkillList を継承していて、そちらに定義されたメソッドも引き継いでいます。
makeItemList メソッドで、 _data に表示すべきスキル一覧を代入しています。

Game_Actor.prototype.skills にそのスキル一覧を返す処理が書かれています。
変身している状態で本来そのアクターが覚えているのとは別のスキルを追加したい、というのであれば、この辺りをいじることになるんじゃないかと思います。
変身によってアクターのインスタンスがどうなっているか次第ではありますが。
アバター
ドラムカン
記事: 178
登録日時: 2019年11月04日(月) 23:02

Re: 控えメンバーのスキルをメインメンバーのスキルに引き継ぐ方法

投稿記事by ドラムカン » 2021年6月02日(水) 18:48

WTR様
Plasma Dark様

お二人ともとても丁寧にご解説いただき、本当にありがとうございます。

thisの正体について、複雑で実際のところまだあまり理解できてはいないのですが
今回、問題視すべき点は、
Windowを扱うクラスにGame_Actorクラスで扱うべき処理を担わせようとしていたことにあるのですね。

rpg_objects.js内にある
Game_Actor.prototype.skills を参照すると
actorが現在習得しているスキルを取得できるということは何となくですが理解できました。

コード: 全て選択

Game_Actor.prototype.skills = function() {
    var list = [];
    this._skills.concat(this.addedSkills()).forEach(function(id) {
        if (!list.contains($dataSkills[id])) {
            list.push($dataSkills[id]);
        }
    });
    return list;
};


コンストラクタや継承などjsの基礎はプロゲートでひと通り学んだはずでしたが
ツクールのコードを書こうとしても応用ができず、
こうして皆様のお力をお借りしているという情けない状態です。
きっとツクールのコードというより、jsをそもそも理解できていないことが問題であるのかもしれません。

タイトル違いではありますが、前回、Plasma Dark様にお膳立ていただいた装飾品差し替えのコードも、おかげさまで無事に完成いたしまして
この調子でツクールのプラグインを少しでも拡張できるようになればという思いです。

今回はせっかくお二人から解決の糸口をいただけたので
何とかこの情報からスキルを引き継ぐ方法を模索したいと考えておりましたものの
WTR様 からいただいたコードを、とりあえずWindow_ActorCommand クラスに書いてみましたところ
今回の要件となります動作となりましたので、このご質問はいったんこれにて解決とさせていただきます。
なぜこのコードでスキルを覚えるのかも追々、読み解いていけたらと考えております。
重ね重ね、ありがとうございます。

あとはこれを、Game_Actorクラスで扱うように
基本的なクラス管理についての理解を深めたいと思います。

この度も有益な情報をたくさん下さり、心から感謝申し上げます。
アバター
WTR
記事: 559
登録日時: 2015年12月22日(火) 19:14

Re: 【解決済み】控えメンバーのスキルをメインメンバーのスキルに引き継ぐ方法

投稿記事by WTR » 2021年6月02日(水) 19:02

イベントコマンドで事前にスキルを覚えさせておく、というつもりで書いたものでしたが…

どこに書いても動くのは動くでしょうけど
Window_ActorCommand に持たせるのはやはり違和感が…
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/

“MV:質問” へ戻る