【解決済】メニューコマンドのカーソル移動
Posted: 2023年9月01日(金) 23:07
久しぶりに書き込ませていただきます。
今回は「コマンド選択時におけるカーソル移動」のスクリプトについてお尋ねしたいことがあり訪れました。
<質問概要>
デフォでは1列に表示に表示される「メニューコマンド」を2列にしたい。
カーソル移動で縦横の頭とお尻でループするようにしたい。
奇数個ではなるが偶数個ではできない。何故?
<質問内容>
概要で述べてますが「メニューコマンド」をいじるのが目的です。
下記のとおり“Window_MenuCommand”の『桁数の取得』を追加して2列にすることは成功しました。
続いて“Window_Selectable”にて手を加えたところとりあえず“ほぼ”思い通りの挙動が実装できました。
しかし、選択するコマンドの数が奇数の場合は問題ないのですが、偶数だと2列目にカーソルが行かない不具合が起きてしまいます。
この理由が知りたくお邪魔しました。
具体的に示すなら
AA BB
CC DD
EE
とあるとします。「AA」などはコマンド名です。
この場合はAAから「→」を押すと「BB→CC→DD→EE」と動き、AAに戻ります。逆(←)は「AA→EE→DD」と問題なく動きます。
「↓」を押下すると「CC→EE→BB→DD」となり、「↑」の入力で「DD→BB→EE」です。
これは思い通りなので何も問題はないのですが、これを偶数にすると
AA BB
CC DD
ですね。この形にすると、縦回転が「AA→CC」「BB→DD」間でしか行われないのです。言い換えるなら「AA→DD」「BB→CC」間が連動(?)していない状態です。
何故このようになるのか、理解が足りず悩んでおります。どなたかお手すきでしたら易しく、できれば優しくご教示いただけますと幸いです。
尚、データ的に足りない場合は仰っていただければUP 致しますので、申付けください。
宜しくお願い致します。
<変更箇所>
■ Window_Selectable(再定義)
● カーソルを下に移動
def cursor_down(wrap = false)
if index < item_max - col_max || (wrap && col_max == 2) ※1を2に変更
select((index + col_max) % item_max)
end
end
● カーソルを上に移動
def cursor_up(wrap = false)
if index >= col_max || (wrap && col_max == 2) ※1を2に変更
select((index - col_max + item_max) % item_max)
end
end
● カーソルを右に移動
def cursor_right(wrap = false) ※↓の「item_max - 1」をitem_maxに変更
if col_max >= 2 && (index < item_max || (wrap && horizontal?))
select((index + 1) % item_max)
end
end
● カーソルを左に移動
def cursor_left(wrap = false)
if col_max >= 2 && (index > -1 || (wrap && horizontal?))※0を-1に変更
select((index - 1 + item_max) % item_max)
end
end
end
■ Window_MenuCommand(再定義)
● ウィンドウ幅の取得
def window_width(再定義)
return 260 #160から変更
end
● ウィンドウ高さの取得(追加定義)※項目量からこのサイズにしました。
def window_height
return 135
● 表示行数の取得(追加定義)※はじめは1列分が半分になるので、これでピッタリサイズになりました。
def visible_line_number
item_max#/2#/2を追加
end
● 項目数の取得(追加定義)
def item_max
@list.size
end
● 桁数の取得(追加定義)
def col_max
return 2
end
<9/2追記>
使用ソフトはACEです。書きそびれていたので追記します。ごめんなさい。
今回は「コマンド選択時におけるカーソル移動」のスクリプトについてお尋ねしたいことがあり訪れました。
<質問概要>
デフォでは1列に表示に表示される「メニューコマンド」を2列にしたい。
カーソル移動で縦横の頭とお尻でループするようにしたい。
奇数個ではなるが偶数個ではできない。何故?
<質問内容>
概要で述べてますが「メニューコマンド」をいじるのが目的です。
下記のとおり“Window_MenuCommand”の『桁数の取得』を追加して2列にすることは成功しました。
続いて“Window_Selectable”にて手を加えたところとりあえず“ほぼ”思い通りの挙動が実装できました。
しかし、選択するコマンドの数が奇数の場合は問題ないのですが、偶数だと2列目にカーソルが行かない不具合が起きてしまいます。
この理由が知りたくお邪魔しました。
具体的に示すなら
AA BB
CC DD
EE
とあるとします。「AA」などはコマンド名です。
この場合はAAから「→」を押すと「BB→CC→DD→EE」と動き、AAに戻ります。逆(←)は「AA→EE→DD」と問題なく動きます。
「↓」を押下すると「CC→EE→BB→DD」となり、「↑」の入力で「DD→BB→EE」です。
これは思い通りなので何も問題はないのですが、これを偶数にすると
AA BB
CC DD
ですね。この形にすると、縦回転が「AA→CC」「BB→DD」間でしか行われないのです。言い換えるなら「AA→DD」「BB→CC」間が連動(?)していない状態です。
何故このようになるのか、理解が足りず悩んでおります。どなたかお手すきでしたら易しく、できれば優しくご教示いただけますと幸いです。
尚、データ的に足りない場合は仰っていただければUP 致しますので、申付けください。
宜しくお願い致します。
<変更箇所>
■ Window_Selectable(再定義)
● カーソルを下に移動
def cursor_down(wrap = false)
if index < item_max - col_max || (wrap && col_max == 2) ※1を2に変更
select((index + col_max) % item_max)
end
end
● カーソルを上に移動
def cursor_up(wrap = false)
if index >= col_max || (wrap && col_max == 2) ※1を2に変更
select((index - col_max + item_max) % item_max)
end
end
● カーソルを右に移動
def cursor_right(wrap = false) ※↓の「item_max - 1」をitem_maxに変更
if col_max >= 2 && (index < item_max || (wrap && horizontal?))
select((index + 1) % item_max)
end
end
● カーソルを左に移動
def cursor_left(wrap = false)
if col_max >= 2 && (index > -1 || (wrap && horizontal?))※0を-1に変更
select((index - 1 + item_max) % item_max)
end
end
end
■ Window_MenuCommand(再定義)
● ウィンドウ幅の取得
def window_width(再定義)
return 260 #160から変更
end
● ウィンドウ高さの取得(追加定義)※項目量からこのサイズにしました。
def window_height
return 135
● 表示行数の取得(追加定義)※はじめは1列分が半分になるので、これでピッタリサイズになりました。
def visible_line_number
item_max#/2#/2を追加
end
● 項目数の取得(追加定義)
def item_max
@list.size
end
● 桁数の取得(追加定義)
def col_max
return 2
end
<9/2追記>
使用ソフトはACEです。書きそびれていたので追記します。ごめんなさい。