【解決】選択シーンのスクロールマージン

やまQ
記事: 32
登録日時: 2017年6月26日(月) 14:26

【解決】選択シーンのスクロールマージン

投稿記事by やまQ » 2022年5月14日(土) 15:15

アイテム選択・装備変更・アクター選択・選択肢などで、
カーソルがウインドウの端の項目にあるとき、
先行でスクロールして、先の項目が見えるようにする
スクロールマージンを調整できるプラグインを探しています。

先行する行列数を調整できるとありがたいです。

よろしくお願いします。


---
追記:文章だけでは伝わりにくいので、画像を付けて説明します。


例)
[図1] 『アイテム選択』で図のような状態の時、下キーを入れると──
ss1.png


[図2] 下図のようにスクロールせず、カーソル移動のみになります。
ss2.png


[図3] それを、一つ先まで見えるように、スクロールしてほしいのです。
ss3.png
先が見えると、目的のものを見つけやすい気がします。
これは主観なので、客観的に見ても良くない点を一つ紹介します。

[図2] 下図の状態で、下に1つ項目(道具)があっても、下キーではスクロールしてくれません。
ss2.png
プレイヤーが気を付けてくれれば最後の項目を見逃すことはありませんが、とても不親切です。


---
無駄なあがきとわかりつつも、自分でできないかとコアスクリプトの中を覗きました。
ずっと睨めっこして、rmmz_windows.jsに目星をつけました。

コード: 全て選択

Window_Selectable.prototype.scrollmargin = function() {
    return 0;
}

こんな感じで、調整する値があると思ったのですが見つけられませんでした。

そもそも、そのような機能が無い場合は、お手上げです。
私はスクリプトは組めません。
数値を調整する程度までしかできません。


このような調整ができるプラグインを知っている方、
もしくは、作れる方がいましたらお力添えのほどよろしくお願いします。


---
ここから少し余談になります。

スクロールマージンとは。

正しい名称が分かりません。スクロールオフセットと呼んだりもするようです。
テキストエディタなどでカーソルの位置の前後が見えるように先行してスクロールさせる機能のことです。
マップシーンのプレイヤーキャラクターが画面の中央付近にくるようにスクロールするのと同じです。
テキストの前後が把握しやすくなるのでとても便利な機能です。
私の使用しているサクラエディタでは、
下は4行、上は2行、左右は2列分、先が見えるようにスクロールします。

選択時に1行列先が見えるとぐっと快適に感じるはずです。
最後に編集したユーザー やまQ on 2022年5月17日(火) 07:32 [ 編集 1 回目 ]

やまQ
記事: 32
登録日時: 2017年6月26日(月) 14:26

Re: 選択シーンのスクロールマージン

投稿記事by やまQ » 2022年5月17日(火) 03:53

それっぽく出来たので、報告します。

rmmz_windows.js内のそれっぽい所を切り出し
YQ_ensureCursorVisible.jsとしてプラグイン化しました。
以下、その内容

コード: 全て選択

Window_Selectable.prototype.ensureCursorVisible = function(smooth) {
    if (this._cursorAll) {
        this.scrollTo(0, 0);
    } else if (this.innerHeight > 0 && this.row() >= 0) {
        const scrollY = this.scrollY();
        const itemHeight = this.itemHeight(); //♪ 追加
        const itemTop = this.row() * this.itemHeight();
        const itemBottom = itemTop + this.itemHeight();
        const scrollMin = itemBottom - this.innerHeight;
        console.log(scrollMin); //♪ ケスクセ
        if (scrollY > itemTop - itemHeight) { //♪ 一行分手前からスクロールさせる
            if (smooth) {
                this.smoothScrollTo(0, itemTop - itemHeight) ; //♪ 一項目分前
            } else {
                this.scrollTo(0, itemTop - itemHeight); //♪ 一項目分前
            }
        } else if (scrollY < scrollMin + itemHeight) { //♪ 一行分手前からスクロールさせる
            if (smooth) {
                this.smoothScrollTo(0, scrollMin + itemHeight); //♪ 一項目分先
            } else {
                this.scrollTo(0, scrollMin + itemHeight); //♪ 一項目分先
            }
        }
    }
};

元のコードから改変した箇所にはコメントを入れています。
/♪で検索すれば全部辿れるようにしました。

一通り動作確認して、エラーは出ていません。今のところは。
左右スクロールはチェックしていません。
"ターゲットが上端・下端の場合はスクロールしない"
というような条件文を付け加えていないのですが何故かうまくいっています。
大丈夫でしょうか?


一応、解決としますが、半信半疑です。
詳しい方のお墨付き、アドバイスなどを頂けると助かります。
よろしくお願いします。

“MZ:プラグイン素材のリクエスト” へ戻る