オプション項目の結果を反映させる記述

アバター
sairi
記事: 105
登録日時: 2016年2月05日(金) 16:37
連絡を取る:

オプション項目の結果を反映させる記述

投稿記事by sairi » 2016年3月06日(日) 21:47

http://triacontane.blogspot.jp/2016/01/blog-post.html
こちらのプラグインをお借りして一つ変数を操作する項目をつけました。
それで、変更項目が決定された後、変数1の場合や2の場合と言った風にif文をつけて
それぞれに対応したアイコンが表示されるという事をしてみたかったのですが、
取り敢えず動作確認がてらこういう記述をしてみたのですが動かず、
エラーすら吐かないもんで何が悪いのか全く分からないです…。
宜しければお知恵を貸して下さいませ。

コード: 全て選択

Window_Options.prototype.changeValue = function(symbol, value) {
    var lastValue = this.getConfigValue(symbol);
    if (lastValue !== value) {
//追記if文の例(ゲーム変数)--------------------------
        if($gameVariables.value(1)){
        this.drawText('文字出ろ' , 0, 0, 100);
        }
//---------------------------------------------------------
        this.setConfigValue(symbol, value);
        this.redrawItem(this.findSymbol(symbol));
        SoundManager.playCursor();
    }
};


アバター
Trb
記事: 151
登録日時: 2015年11月15日(日) 19:26
連絡を取る:

Re: オプション項目の結果を反映させる記述

投稿記事by Trb » 2016年3月06日(日) 22:09

とりあえずそのままコピペして試してみたところ、このように表示されるのが確認できました。
tes.png

ちゃんと『文字出ろ』というテキストが重なって表示されてます。
(コピペしただけで、スクリプトには一切手を加えてません)


そちらのif文
if($gameVariables.value(1)){
の部分ですが、この書き方だと変数1が存在してる時(0以外の時)という条件になっているので
変数1に適当な数字を入れた後オプション項目を操作すれば文字が表示される動作が確認できるはずです。
アバター
sairi
記事: 105
登録日時: 2016年2月05日(金) 16:37
連絡を取る:

Re: オプション項目の結果を反映させる記述

投稿記事by sairi » 2016年3月06日(日) 23:03

Trb様、何時もお世話になっております、早期のご返信有難いです!

変数による分岐の記述はまだ手をつけたことがないので、書き方がよく分かっていないのですが
if($gameVariables.value(1) == 1){
で多分変数1が1の時、という条件分岐になるのでしょうか…?
if($gameVariables.value(1)==1){
this.drawText('文字出ろ' , 0, 0, 100);
}
if($gameVariables.value(1)==2){
this.drawText('切り替われ' , 0, 0, 100);
}
という風に追記してみた所、変数1を弄る項目だけを決定(操作として選択箇所をずらすしか出来ませんが)
しても反映されないのでいずれにせよ望んでた動きではないのが問題です…。
他の所の項目を触らないと反映しない上、ifを追加した所で変わらないっていう…。
そもそも此処に記述するべきではないのかも知れません。
オプションはちょっと動きが特殊ですよね。
ともあれ引き続きやれるだけやってみます。有難う御座いました!
アバター
Trb
記事: 151
登録日時: 2015年11月15日(日) 19:26
連絡を取る:

Re: オプション項目の結果を反映させる記述

投稿記事by Trb » 2016年3月06日(日) 23:40

なるほどなるほど、オプション項目を弄った時じゃなくて常に表示したいということなんですね。
それでしたらまず追加したい部分を新しいメソッドとして定義しておきます。

例としてはこんな感じ。(メソッド名は好きなようにしてください)

コード: 全て選択

Window_Options.prototype.originalText = function() {
//追記if文の例(ゲーム変数)--------------------------
    if($gameVariables.value(1)){
        this.drawText('文字出ろ' , 0, 0, 100);
    }
//---------------------------------------------------------
};


そしたら、Window_Options.prototype.drawItem が常に呼ばれているので
こいつの中でそのメソッドを呼ぶようにしたらいいと思います。

こんな感じ。

コード: 全て選択

var w_o_drawItem = Window_Options.prototype.drawItem;

Window_Options.prototype.drawItem = function(index) {
    w_o_drawItem.call(this,index);
    this.originalText();
}


たぶんこれでサイリ様がやりたいような形になるかなと。


(すみません、書いている内にレスを編集されたようで、
 ↑は編集前のレスに対する返答になります。
 変数1が1の時、の書き方はそれで合ってます。)
アバター
sairi
記事: 105
登録日時: 2016年2月05日(金) 16:37
連絡を取る:

Re: オプション項目の結果を反映させる記述

投稿記事by sairi » 2016年3月08日(火) 02:46

Trb様
何時もお付き合い有難う御座います :D
コード試させて頂きました、そんで大分近くなってきたと思って
自分でも色々追加したりしてみてたんですが、
この動きだとオプション画面を閉じた時に反映されるようで、
もう一度開いた時にそれが分かるっていう感じで…
リアルタイムに「1」から「2」へ切り替えた時に動くっていうのと、
戴いたこれを組み合わせたら理想の形なのですが
(メニューの説明みたいな感じですね、並列処理にあたると思いますが)
左右だけでなく、決定キーすら数値を動かす要素になってる妙な操作性なので、
私一人だとホントお手上げ案件でして…
正しく読めないから推測ですが、そもそも左右で動かしてる数字はただのポーズで
実際変数として反映してないからじゃないかなとかも思い始めました。
終了時に反映させる形だからこうなったのかなと…。
プラグインに加筆でなく、もう項目自体を作ったのが良いんじゃ無いかだと
作り方がさっぱりなので無理なんですけど、
取り敢えず最初に記述した箇所が使えないのは分かりましたので :D
それだけでも一歩進んだ感じです、有難う御座いました-!
アバター
midori
記事: 18
登録日時: 2015年11月10日(火) 22:31
お住まい: 惑星ゼーベス
連絡を取る:

Re: オプション項目の結果を反映させる記述

投稿記事by midori » 2016年3月08日(火) 04:59

変数の値が表示されている箇所にアイコンを表示するという解釈であってるのか分かりませんが
値変更時これでアイコン変わります。
通常はdrawTextを呼ぶ箇所で判定をかけて特定のハンドラであればdrawIconでアイコン表示してます
プラグインの真下にでも配置してもらえれば一応動くはずです
ScreenShot00200.png
ScreenShot00200.png (105.4 KiB) 閲覧数: 5700 回

コード: 全て選択

(function () {
    //再定義
    Window_Options.prototype.drawItem = function(index) {
        var rect = this.itemRectForText(index);
        var statusWidth = this.statusWidth();
        var titleWidth = rect.width - statusWidth;
        this.resetTextColor();
        this.changePaintOpacity(this.isCommandEnabled(index));
        this.drawText(this.commandName(index), rect.x, rect.y, titleWidth, 'left');
       
        //変更箇所==============
        //シンボルで判定
        if (this._list[index].symbol === 'Number1' || this._list[index].symbol === 'Number2') {
            var _num = this.statusText(index); //変数の値
            var _iconx = titleWidth + statusWidth - 45; //X座標
            this.drawIcon(this.getIcon(_num), _iconx, rect.y + 2); //drawIcon(iconIndex ,x ,y );
        } else {
            this.drawText(this.statusText(index), titleWidth, rect.y, statusWidth, 'right');
        }
        //変更箇所==============
    };
    //新規追加
    Window_Options.prototype.getIcon = function(num) {
        console.log('変数の値:' + num)//中身確認用
        //変数の値によって特定のアイコンIDを返す
        switch (num) {
            case 1:
            case 2:
              return 4; //1,2の場合
            case 3:
              return 5; //3のみ
            default: //指定した値以外は全てここ通る
              return 1;
        }
    };
})();

#====================================================
#ブログ:http://midori.wp.xdomain.jp/
#Twitter:https://twitter.com/hajimari_midori
#====================================================
アバター
sairi
記事: 105
登録日時: 2016年2月05日(金) 16:37
連絡を取る:

Re: オプション項目の結果を反映させる記述

投稿記事by sairi » 2016年3月08日(火) 23:29

翠さん
何時もお付き合い有難う御座います!
あ、そうそうこの動きです!
これって別のウインドウに表示させる事が出来ますか?
実はアイコンといっても、特殊サイズアイコンを使おうと思ってまして
(そのコードは戴いてます)変数自体を変えちゃうと場所が
狭すぎて何も出来なくなっちゃうので…。
難しいならなんとかレイアウトを組もうと思いますけども。

やりたい事がtrbさんと翠さんの丁度中間なんですよね…!
お二人には本当にお手間かけて済みません。orz
アバター
midori
記事: 18
登録日時: 2015年11月10日(火) 22:31
お住まい: 惑星ゼーベス
連絡を取る:

Re: オプション項目の結果を反映させる記述

投稿記事by midori » 2016年3月09日(水) 01:08

別ウィンドウに対して表示を行うの場合、リスト形式などしないのなら
デフォルトのWindow_Helpをまるまる持ってきて少し改変すると楽です。
今回のは$gameTemp.xxxxに値を突っ込んで、そのが値が変化したら再描画を行う簡易的な物です。

画像の読み込みが終わる前に処理が走るとbitmapのwidthが0になり表示されなくなることがあります
下記のは擬似的にリフレッシュがかかった場合、もう一度再描画させてるのでTitleとMenuで画像読み込んでやるのが
一番良いです

コード: 全て選択

(function(){
    //============================================================
    //■Window_Options
    //============================================================
    var Mtest_Window_Options_drawItem = Window_Options.prototype.drawItem;
    Window_Options.prototype.drawItem = function(index) {
        Mtest_Window_Options_drawItem.call(this,index);
        //シンボルで判定
        if (this._list[index].symbol === 'Number1') {
            //オプション画面内では$gameVariablesの値が変動しないので
            //簡単に済ませる為に$gameTempに変数を作成して、変数の値を代入
            $gameTemp._testVal = this.statusText(index);
        }
    };
    //============================================================
    //■Window_TestOptions  新規追加Window
    //============================================================
    function Window_TestOptions() {
        this.initialize.apply(this, arguments);
    }
    Window_TestOptions.prototype = Object.create(Window_Base.prototype);
    Window_TestOptions.prototype.constructor = Window_TestOptions;

    Window_TestOptions.prototype.initialize = function(numLines) {
        var width = 400;
        var height = 100;
        Window_Base.prototype.initialize.call(this, 0, 0, width, height);
        //this.opacity = 0;
        this._text = '';
        this._count = 0; //簡易bitmap.width === 0 回避用
    };
    //リフレッシュ
    Window_TestOptions.prototype.refresh = function() {
        this.contents.clear();
        this._text = $gameTemp._testVal;
        this.drawImage();
        this.drawIcon($gameTemp._testVal, 0, 0); //drawIcon(iconIndex ,x ,y );
        this.drawText(this._text, 0, 38, 100, 'left');
    };
    //画像読み込み
    Window_TestOptions.prototype.drawImage = function() {
        var bitmap = ImageManager.loadSystem('Loading');
        this.contents.blt(bitmap, 0, 0, 400, 100, 0, 0);
        this._count++;
    };
    //フレーム更新
    Window_TestOptions.prototype.update = function() {
        Window_Base.prototype.update.call(this);
        if (this._text != $gameTemp._testVal) this.refresh();
        if (this._count === 1) {
            this.refresh();
            this._count--;
        }
    };
    //============================================================
    //■Scene_Options
    //============================================================
    var Mtest_Scene_Options_create = Scene_Options.prototype.create;
    Scene_Options.prototype.create = function() {
        Mtest_Scene_Options_create.call(this);
        this.createTestWindow();
    };
    //新規追加
    Scene_Options.prototype.createTestWindow = function() {
        this._optionsTestWindow = new Window_TestOptions();
        this.addWindow(this._optionsTestWindow);
    };
})();

ScreenShot00202.png
ScreenShot00202.png (414.61 KiB) 閲覧数: 5633 回

#====================================================
#ブログ:http://midori.wp.xdomain.jp/
#Twitter:https://twitter.com/hajimari_midori
#====================================================
アバター
sairi
記事: 105
登録日時: 2016年2月05日(金) 16:37
連絡を取る:

Re: オプション項目の結果を反映させる記述

投稿記事by sairi » 2016年3月10日(木) 16:09

翠様
有難う御座います-!正にこれです!! :D
もー無理かなと思って居ただけにめっちゃ感動しました、
後々使えそうな記述も戴いて、毎度ながら凄い助かります。
そしてお返事遅れて申し訳ないです、
私にもお手伝い出来そうな事がありましたら何時でも仰って下さいませ!

“MV:質問” へ戻る