【解決済】単一のウインドウを表示させたい

yomogi
記事: 7
登録日時: 2023年2月03日(金) 11:17

【解決済】単一のウインドウを表示させたい

投稿記事by yomogi » 2023年2月03日(金) 11:28

お世話になります。

ゲーム中に1つの大きいウインドウを表示させて操作方法やTipsのようなものを作りたいと思っています。
制作にあたって取っ掛かりが欲しく、今回ご質問させていただきました。

解法ではなく、スクリプトを勉強すればいいのか、イベントコマンドで実現可能なのか、これを使えば可能といったところだけお教え願えますでしょうか?
後は頂いた情報を元に自分で作ってみたいと思っています。

以下はやりたい事です。
・ウィンドウを生成する
・文字列を入れる
・画像を挿入する
・決定ボタン押下で次ウィンドウへページ送りする

お答え頂けますと幸いです。
最後に編集したユーザー yomogi on 2023年2月04日(土) 08:32 [ 編集 1 回目 ]

名無し蛙
記事: 304
登録日時: 2015年11月23日(月) 02:46

Re: 単一のウインドウを表示させたい

投稿記事by 名無し蛙 » 2023年2月03日(金) 21:09

プラグインの作成をオススメします。
慣れれば大して難しいものでもないと思うんですけど
まともなチュートリアルも少ないので簡単な雛形だけ置いておきます。
以下のコードを適当なテキストファイルにコピペして拡張子を.jsにして保存。
pluginsフォルダに配置してプラグインマネージャに登録してください。
コードを弄る場合はVSCode(無料)などのテキストエディタを使用した方が扱いやすいと思います。

主に弄る部分はdrawPage1、drawPage2の部分ですね。
blt(画像挿入)とdrawTextEx(テキスト追加)の扱いさえ分かればあとは難しくないかな、と。
ページを増やす場合はdrawPage2の下にdrawPage3、drawPage4と続ければ増えていきます。
勿論、その他の部分も適宜改造してくださって結構です。

コード: 全て選択

(() => {
    'use strict'

    class Scene_Tips extends Scene_MenuBase {
        create() {
            super.create();
            this._pageIndex = 0;
            this._tipsWindow = new Window_Base(0, 0, Graphics.boxWidth, Graphics.boxHeight);
            this.addWindow(this._tipsWindow);
            this.pageRefresh();
        }
        update() {
            super.update();
            if (Input.isTriggered("ok") || TouchInput.isTriggered()) this.pageIncrement();
            if (Input.isTriggered("cancel")) this.popScene();
        }
        pageIncrement() {
            this._pageIndex += 1;
            this._pageIndex %= this.drawPageNames().length;
            this.pageRefresh();
        }
        pageRefresh() {
            this._tipsWindow.contents.clear();
            const propatyName = this.drawPageNames()[this._pageIndex];
            this[propatyName]();
            this.drawPageIndex();
        }
        drawPageIndex() {
            const pageCurrent = this._pageIndex + 1;
            const pageMax = this.drawPageNames().length;
            this._tipsWindow.drawText(
                `(${pageCurrent}/${pageMax})`,
                0,
                this._tipsWindow.contents.height - this._tipsWindow.lineHeight(),
                this._tipsWindow.contents.width,
                'right'
            );
        }
        drawPageNames() {
            if (this._drawPageNames) return this._drawPageNames;
            this._drawPageNames = Object.getOwnPropertyNames(Scene_Tips.prototype)
                .filter(key => key.match(/drawPage(\d+)/))
                .sort((a, b) => Number(a.match(/\d+/)) - Number(b.match(/\d+/)));
            return this._drawPageNames;
        }
        // 画像挿入例
        drawPage1(){
            // ピクチャフォルダの画像ファイル名を指定
            const bitmap = ImageManager.loadPicture("ピクチャファイル名");
            bitmap.addLoadListener(() => {
                this._tipsWindow.contents.blt(
                    // bitmap, 画像側のx座標,y座標,幅,高さ,出力側のx座標,y座標
                    bitmap, 0, 0, 100, 100, 10, 20
                );
            });
        }
        // テキスト追加例
        drawPage2(){
            const text1 = "テスト\nてすとてすと\n\\C[4]バックスラッシュを重ねる事で\n色変え等の制御文字も使用可能です。変数1番:\\v[1]"
            // テキスト、開始位置x座標、y座標
            this._tipsWindow.drawTextEx(text1, 0, 0);
            // ``で括る事でスクリプトをテキスト中に組み込む事が可能
            const text2 = `隊列先頭のアクター名は${$gameParty.leader().name()}です`
            this._tipsWindow.drawTextEx(text2, 0, 300);
        }
    }
    // Scene_Tipsをグローバル空間に定義する
    window.Scene_Tips = Scene_Tips;
})();

作成したtipsを呼び出す場合はイベントコマンド>スクリプトから

コード: 全て選択

SceneManager.push(Scene_Tips);

ですね。
yomogi
記事: 7
登録日時: 2023年2月03日(金) 11:17

Re: 単一のウインドウを表示させたい

投稿記事by yomogi » 2023年2月04日(土) 08:30

名無し蛙様

とてもご丁寧に回答いただきありがとうございます。
また、同時にサンプルもご提示くださいまして重ねて感謝致します。
頂いたプラグインを手順通り適用しましたら、想定しておりました挙動でございました。
コメントも記載頂いているので、自分でもどう触れば良いのかよくわかりました。
こちらを触りつつ、他に何がどうなっているのか勉強させていただきます。

この度は回答にお時間を割いてくださいましてありがとうございました。
大変助かりました。

“MV:質問” へ戻る