【解決済み】新人です。スキルやアイテム画面を直接呼び出したいです

無名のぬ
記事: 9
登録日時: 2022年9月24日(土) 15:27

【解決済み】新人です。スキルやアイテム画面を直接呼び出したいです

投稿記事by 無名のぬ » 2022年9月24日(土) 15:46

新人です。
SceneManager.push(Scene_Item);とか
SceneManager.push(Scene_Skill);でアイテムやスキルを直接呼び出せるスクリプトまでは分かりました。

そこから発展して直接キーアイテムや特定のスキル(いきなり魔法系のスキル)を呼び出すイベントを作りたいですがどうにも先に進めません。欲しい情報は主に2つで
①過去ログを調べて入手したキーアイテムを直接呼び出すスクリプト

SceneManager.push(Scene_Item);
SceneManager.update();
SceneManager._scene._categoryWindow.select(3);
SceneManager._scene.onCategoryOk();
SceneManager._scene._categoryWindow.deactivate();

を入力するとエラーが出て何が悪いのか良く分からない。(MV時代の質問だからMZだとダメ?)

②SceneManager.push(Scene_ItemかSkill);
から↑↓決定キーを組み合わせたスクリプトを使えれば色々出来そうだと思ったけれど○○キーを押す系のスクリプトが分からないのでもしあったら教えて欲しいです。

理解力はあまりないですが何卒よろしくお願い申し上げます。
最後に編集したユーザー 無名のぬ on 2022年9月25日(日) 14:58 [ 編集 1 回目 ]

アバター
しぐれん
記事: 973
登録日時: 2017年3月28日(火) 22:22
連絡を取る:

Re: 新人です。スキルやアイテム画面を直接呼び出したいです

投稿記事by しぐれん » 2022年9月24日(土) 18:48

機能的にはマップ上で特定のスキルやアイテムを使いたいという事だと思います。
マップ上で使うスキルやアイテムの種類は何種類ぐらいを想定しているのでしょうか?
数によっては、より遊びやすい別の方法が考えられると思います。
現在、プラグイン依頼はお休み中です。
無名のぬ
記事: 9
登録日時: 2022年9月24日(土) 15:27

Re: 新人です。スキルやアイテム画面を直接呼び出したいです

投稿記事by 無名のぬ » 2022年9月24日(土) 19:15

お返事ありがとうございます。
マップ上(自作戦闘)で使うので種類はかなり多いです。
MZド新人ですが昔(2000時代)は戦闘が自作できるくらいに作ってたので知識技術はMZ的には歪に充実してるって感じです。
一応は質問後に、仮処置で主人公の職業を変更して魔法(表記上はガッツスキルって名前ですが)しか使えないタイプにし実質いきなり魔法画面を開くっぽいものが出来ました。またアイテムはアイテム選択の処理でキーアイテムを開いてるっぽくは出来ました。
ただこのやり方だとイベントの開き方が違って一見うまくいってそうだけど問題がありそうなので可能ならば直接画面を開きたいといった所です。
アバター
しぐれん
記事: 973
登録日時: 2017年3月28日(火) 22:22
連絡を取る:

Re: 新人です。スキルやアイテム画面を直接呼び出したいです

投稿記事by しぐれん » 2022年9月24日(土) 19:54

ツクール2000で自作戦闘を組んだ経験があるのであれば、プラグインの自作に手を出しておくと、後々便利です。
下記のプラグインで要件を満たせると思いますが、いかがでしょうか?
https://github.com/sevenspice/ItemSlot
現在、プラグイン依頼はお休み中です。
無名のぬ
記事: 9
登録日時: 2022年9月24日(土) 15:27

Re: 新人です。スキルやアイテム画面を直接呼び出したいです

投稿記事by 無名のぬ » 2022年9月24日(土) 22:42

ご指導ありがとうございます。
この回答からすると簡単そうに見えてもちょっとしたスクリプトで直接出すことはできないという事でしょうか。
必要個数がエグい(大事なもの枠だけで12+スキル)のでメニュー自作系はちょっと厳しいですね。プランとしては自作戦闘をやりつつもメニュー画面はそのまま使うことで作業量を軽くするという発想なので。
一応の仮処置で進めながら地道にスクリプトやプラグイン(はハードル高いか)を覚えていくことにします。

お付き合いいただきありがとうございました。
名無し蛙
記事: 302
登録日時: 2015年11月23日(月) 02:46

Re: 新人です。スキルやアイテム画面を直接呼び出したいです

投稿記事by 名無し蛙 » 2022年9月25日(日) 13:00

質問にだけ答えるならこういう感じの事がしたいんですか?
特異メソッドの応用でJSでもこういったコーディングが可能なはず。

1.アイテム画面を「大事なもの」から開き、アイテムキャンセル時は直接マップ画面に移行する

コード: 全て選択

SceneManager.push(Scene_Item);

SceneManager._nextScene._oldStart = SceneManager._nextScene.start;
SceneManager._nextScene.start = function() {
    this._oldStart.apply(this, arguments);
    this._categoryWindow.select(3); // カテゴリ欄4番目「大事なもの」を指定
    this.onCategoryOk();
    this._categoryWindow.deactivate();   
}
SceneManager._nextScene.onItemCancel = function() {
    this.popScene();
}

2.スキル画面をスキルタイプ2番目から開き、スキルキャンセル時は直接マップ画面に移行する

コード: 全て選択

SceneManager.push(Scene_Skill);

SceneManager._nextScene._oldStart = SceneManager._nextScene.start;
SceneManager._nextScene.start = function() {
    this._oldStart.apply(this, arguments);
    this._skillTypeWindow.select(1); //スキルタイプ2番目を指定
    this.commandSkill();
    this._skillTypeWindow.deactivate();   
}
SceneManager._nextScene.onItemCancel = function() {
    this.popScene();
}

本来メニューを開く時にチェックするメニュー用顔グラ読み込みを飛ばしてるので
テスト時に対象ウィンドウを開く時に違和感出るかもしれないけど実用時は問題ないはず。
また、パーティメンバー一人を想定しているので
スキル画面を開く使用アクターの選択とL/Rによるアクター遷移処理の対応を端折ってますけど
必要なら教示します。
まぁ、応急処置的な際どい処理をしているので正攻法を早めに習得した方が良いというのは確かですね。
最後に編集したユーザー 名無し蛙 on 2022年9月27日(火) 19:16 [ 編集 1 回目 ]
無名のぬ
記事: 9
登録日時: 2022年9月24日(土) 15:27

Re: 新人です。スキルやアイテム画面を直接呼び出したいです

投稿記事by 無名のぬ » 2022年9月25日(日) 14:57

名無し蛙さん

やりたかったのはコレです。ありがとうございます。
キャラの切り替えとかは少なくとも今のところは問題ないので大丈夫です。
後はあのコードを自分なりに理解したり、挙動の違うアイテム選択との比較(場合によっては使い分け)ですね。
これで知識的に必要な手札は多分集まったはず

しぐれんさん、名無し蛙さん、ありがとうございました。
無名のぬ
記事: 9
登録日時: 2022年9月24日(土) 15:27

Re: 【解決済み】新人です。スキルやアイテム画面を直接呼び出したいです

投稿記事by 無名のぬ » 2022年9月27日(火) 11:28

度々申し訳ございません。
依然教えて頂いたスキル(2番目)呼び出して他のタイプのスキルは使えないスクリプト

コード: 全て選択

SceneManager.push(Scene_Skill);

const _oldStart = SceneManager._nextScene.start;
SceneManager._nextScene.start = function() {
    _oldStart.apply(this, arguments);
    this._skillTypeWindow.select(1); //スキルタイプ2番目を指定
    this.commandSkill();
    this._skillTypeWindow.deactivate();   
}
SceneManager._nextScene.onItemCancel = function() {
    this.popScene();
}


ですがこれを改変してスキルキャンセル時かスキル使用時にも画面を閉じるように変更したいです。
最後のnextScene.onItemCancelをUseに変えればいい事までは分かったのですがCancelとUseの併用が
うまくいきませんでした。
}
SceneManager._nextScene.onItemUse = function() {
this.popScene();
}
の入れ方を教えて下さい。
名無し蛙
記事: 302
登録日時: 2015年11月23日(月) 02:46

Re: 【解決済み】新人です。スキルやアイテム画面を直接呼び出したいです

投稿記事by 名無し蛙 » 2022年9月27日(火) 19:14

スキル使用時、はまぁそのまんまの意味ですかね。

コード: 全て選択

SceneManager._nextScene._oldUseItem = SceneManager._nextScene.useItem;
SceneManager._nextScene.useItem = function() {
    this._oldUseItem.apply(this, arguments);
    this.popScene();
}
こんな感じですか。

無名のぬ さんが書きました:最後のnextScene.onItemCancelをUseに変えればいい事までは分かったのですがCancelとUseの併用が
うまくいきませんでした。
そんなメソッドは無いですよ。
JSは色々とガバいのでエラーが表示されないだけで意味を為さないコードだと思います。
自分が読んでいるのはrmmz_scenes.jsの1641行目から始まるScene_Skillのメソッド群です。
ここの処理を上書きしたり、あるいは追加しています。

例えばonItemCancelというメソッドには本来スキルウィンドウを未選択状態にして
スキルタイプウィンドウを有効化するという処理がありますが
これを上書きして直前のシーンに戻すという処理に書き換えています。

コード: 全て選択

// 1751行目
// before
Scene_Skill.prototype.onItemCancel = function() {
    this._itemWindow.deselect();
    this._skillTypeWindow.activate();
};
// after
Scene_Skill.prototype.onItemCancel = function() {
    this.popScene();
};

追加は既存の処理を変数に退避させた後に既存の処理を上書きし、内部で退避させた処理も実行しています。
これを繰り返して処理を拡張させていくのがツクールプラグインの基本です。
原理はこれと同じですね。

コード: 全て選択

let a = 10; // aに10を入れる
const b = a; // aの中身をbに移す
a = b + 20; // aの中身をbに加えて20を加算する
const c = a;
a = c + 30; // 更に30を加算する

それとついでに前回、提供したコードも含めて一点気になる点が出てきたので修正しました。
処理の退避に利用した変数はどのタイミングで解放されるのかな、と。

完全に技術者向けの話になるんですけど、JSの仕様に則ってメモリ確保が保証されているのか
あるいはコードの実行から退避処理の実行までの間にGCが起動しなかったから退避変数を使用出来たのか?
自分の知識ではどちらなのか確信が持てず、後者なら極低確率でエラー落ちする可能性が発生します。
対応策としてはローカル変数ではなくsceneインスタンスに退避変数を含めてしまえば安全でしょうと。

※追記
よくよく調べたらScene_Skill.prototype.useItemは普通に定義されてる事を見落としてました
継承のくだりは本筋から離れてるのでカットします
無名のぬ
記事: 9
登録日時: 2022年9月24日(土) 15:27

Re: 【解決済み】新人です。スキルやアイテム画面を直接呼び出したいです

投稿記事by 無名のぬ » 2022年9月27日(火) 21:34

名無し蛙様

とても丁寧な回答ありがとうございました。
自分の理解力だとわからない部分もまだ多いですがおかげ様でとっかかりが掴めそうです。

“MZ:質問” へ戻る