ページ 11

メニューの項目の順番について(スクリプト)(解決済)

Posted: 2016年2月10日(水) 00:43
by yuu
はじめまして。
現在プラグイン開発の勉強中でして、とりあえず簡単そうなところから、ということで、
メニュー画面にある「ゲーム終了」のコマンドの選択肢に、「シャットダウン」を追加しようとしております。

コマンドを追加し、シャットダウンさせること自体はできたのですが、「やめる」の下に「シャットダウン」があるのが気になります。
そこでコマンドの表示順を入れ替えたいと思うのですが、何かスマートな方法はありませんでしょうか?

一応、以下のコードで目的の表示自体は出来るのですが、元ファイルを書き換えてしまうのは競合の原因になりそうですし、出来るかぎり避けたいのです。

コード: 全て選択

// rpg_windows.js 5790行目~
Window_GameEnd.prototype.makeCommandList = function() {
    this.addCommand(TextManager.toTitle, 'toTitle');
    //this.addCommand(TextManager.cancel,  'cancel');    <- コメントアウト
};

コード: 全て選択

// 自作コードの該当部
var _Window_GameEnd_makeCommandList = 
    Window_GameEnd.prototype.makeCommandList;
Window_GameEnd.prototype.makeCommandList = function() {
    _Window_GameEnd_makeCommandList.call(this);
    
    this.addCommand(exitText, 'exit');
    //自作のシャットダウンのコマンドの後に移動
    this.addCommand(TextManager.cancel,  'cancel');

Re: メニューの項目の順番について(スクリプト)

Posted: 2016年2月10日(水) 00:59
by トリアコンタン
はじめまして。
開発の勉強中ということなので指針のみをご提案します。
addCommandを実行すると「_list」という配列の末尾にコマンド情報が追加されます。(rpg_windows.js 1334行目)
既存の二項目が追加された後で、新規コマンドを途中に挿入したい場合、以下の二つの方法があります。

1. 既存処理で追加されたcancelコマンドを「this._list.pop();」で取り除き、新規コマンドを追加した後でcancelコマンドを再度追加する。

2. 「this._list.splice()」というメソッド(下記参照)を実行して、配列の途中に新規コマンドを挿入する。

https://developer.mozilla.org/ja/docs/W ... ray/splice

Re: メニューの項目の順番について(スクリプト)

Posted: 2016年2月10日(水) 02:09
by yuu
>トリアコンタンさん
迅速なご回答ありがとうございます、助かりました!

他のメニュー画面への拡張性を考えると、任意の場所にメニューコマンドを入れようと思ったらpopだと必要な操作が多くなりそうなので、spliceで実装しました。

このような形で追加の関数を作ってみました。
同じようなことで悩んでる方がいた時のために置いておきます。

コード: 全て選択

/**
 * Window_Command.prototype.addCommandInOrder
 * args : name, symbol, order, enabled, ext
 * return : nothing
 * desc : order番目にコマンドを追加 (order < 0なら後ろからorder番目に追加)
 */
Window_Command.prototype.addCommandInOrder = 
    function(name, symbol, order, enabled, ext) {
    if (enabled === undefined) {
        enabled = true;
    }
    if (ext === undefined) {
        ext = null;
    }
    
    Number(order);    // orderを数値に変換
    if(order == 0 || Math.abs(order) > this._list.length + 1 || order % 1 != 0){
        // orderの値が正しくない場合
        console.log("addCommandInOrder : order is invalid number.");
        this._list.push({ name: name, symbol: symbol, 
                            enabled: enabled, ext: ext});
    }else if(order > 0){
        this._list.splice(order - 1, 0, 
            { name: name, symbol: symbol, enabled: enabled, ext: ext});
    }else if(order < 0){
        // 後ろからorder番目
        this._list.splice( this._list.length + order - 1, 0, 
            { name: name, symbol: symbol, enabled: enabled, ext: ext});
    }
    
}