ページ 11

<解決済み>フォーカスについて

Posted: 2024年10月11日(金) 13:39
by メロンパン子さん
トリアコンタン様のカスタムメニュー作成プラグインで、別のウインドウにフォーカスを移したとき、前のウインドウで選択されているカーソル?(選択状態の枠)が消えないのですが、消す方法はありますか?

[元ウインドウ選択解除]というものが、それにあたるのかなと思って色んなイベントのトリガーに設置しましたが、効果がありませんでした。

私が実装したのは、ボタンイベントでして、十字キーが押されたときカーソルインデックスが2の位置の場合、フォーカスを別のウインドウに移す、ということをやっています。

//変数1はカーソルインデックス格納変数
if($gameVariables.value(1)==2){SceneManager.changeWindowFocus('next_window');}

ただ、この組み方ですと、ボタンイベントの[元ウインドウ選択解除]をtrueにできない(カーソルインデックスが2ではない場合に、「TypeError: Cannot read property 'deselect' of undefined」というエラーが出る)ので、ボタンイベントではなくカーソルイベントに設置するか、フォーカス移動先のウインドウのボタンイベントに設置するほかなく、そもそも[元ウインドウ選択解除]というものの使い方が違うのかなとも思っています。

とにかく、別のウインドウにフォーカスが移った際、前のウインドウのカーソル枠を消す方法があれば、教えていただけますとありがたいです。
どうかよろしくお願いいたします。

Re: 別のウインドウにフォーカスを移したあと前のウインドウの選択状態を解除したいです

Posted: 2024年10月16日(水) 21:21
by ecf5DTTzl6h6lJj02
こんにちは。
メロンパン子さん さんが書きました:トリアコンタン様のカスタムメニュー作成プラグインで、別のウインドウにフォーカスを移したとき、前のウインドウで選択されているカーソル?(選択状態の枠)が消えないのですが、消す方法はありますか?

[元ウインドウ選択解除]というものが、それにあたるのかなと思って色んなイベントのトリガーに設置しましたが、効果がありませんでした。

私が実装したのは、ボタンイベントでして、十字キーが押されたときカーソルインデックスが2の位置の場合、フォーカスを別のウインドウに移す、ということをやっています。

//変数1はカーソルインデックス格納変数
if($gameVariables.value(1)==2){SceneManager.changeWindowFocus('next_window');}

ただ、この組み方ですと、ボタンイベントの[元ウインドウ選択解除]をtrueにできない(カーソルインデックスが2ではない場合に、「TypeError: Cannot read property 'deselect' of undefined」というエラーが出る)ので、ボタンイベントではなくカーソルイベントに設置するか、フォーカス移動先のウインドウのボタンイベントに設置するほかなく、そもそも[元ウインドウ選択解除]というものの使い方が違うのかなとも思っています。

とにかく、別のウインドウにフォーカスが移った際、前のウインドウのカーソル枠を消す方法があれば、教えていただけますとありがたいです。
どうかよろしくお願いいたします。
元ウィンドウ選択解除の項目を使うのではなく、スクリプト内で選択を解除する処理を書く必要があるかと思います。

スクリプトで、選択を解除する場合、

コード: 全て選択

SceneManager.changeWindowIndex('ウィンドウの識別子', -1);
で行うことができます。
changeWindowIndex は、ウィンドウ識別子(1番目の引数)で指定したカスタムメニューのウィンドウのインデックスを、2番目の引数で指定したインデックス番号に変更するメソッドですが、
インデックスとして -1 を指定すれば、選択を解除したのと同じ挙動になります。

これを、changeWindowFocus でウィンドウのフォーカスを変更した後に実行してやればいいのですが、
ただ、

コード: 全て選択

SceneManager.changeWindowFocus('遷移したいウィンドウの識別子');  SceneManager.changeWindowIndex('ウィンドウの識別子', -1);
としてしまうと、
changeWindowIndex の処理が、changeWindowFocus の処理が終わる前に食い込んでしまって、
結果、カーソルの位置が変になってしまいます。
changeWindowIndex の処理が changeWindowFocus の処理が終わってからになるようにするため、
setTimeout メソッドを使って、処理タイミングをずらすようにします。

setTimeout メソッドについては 以下のリンクをご参照ください。
https://developer.mozilla.org/ja/docs/W ... setTimeout

また、changeWindowFocus でフォーカスを移動して、changeWindowIndex で選択を解除するまでの間に、
カーソル移動の処理が入ってしまい、カーソルが移動してしまうので、
(スクリプトの実行には影響がありませんが)
最初に、Input.clear() を実行して、キーボードなどからの入力を空にしておきます。

上記をまとめると、条件分岐内の処理内容は、以下のようなコードになるかと思います。

コード: 全て選択

Input.clear(); SceneManager.changeForcus('遷移したいウィンドウの識別子'); setTimeout(() => SceneManager.changeWindowIndex('選択解除したいウィンドウの識別子', -1));
以上、ご確認ください。

Re: 別のウインドウにフォーカスを移したあと前のウインドウの選択状態を解除したいです

Posted: 2024年10月22日(火) 11:40
by メロンパン子さん
ecf5DTTzl6h6lJj02 様

詳細な解説とともに解決策をご提示していただいてありがとうございます。
示していただいた通りにやってみましたら、無事にやりたいことが実現できました。
本当にありがとうございます。

「TypeError: Cannot read property 'deselect' of undefined」というエラーについては
トリアコンタン様にマシュマロを投げて修正していただきました。