進んだような、そうでもないような
フォーカス(グループ)の一意化の進展
一応は予定していた方向性で、意図した動作ができるようにはなりました。
変更前のコードではフォーカス判定の為にstateのupdateを回す必要があったのだが、stateを更新は前のフレームも影響する仕様のため、判定の為に回すと更新が重複し、内部的に2フレーム以上の更新扱いになる恐れがありました。
そこで、updateを
現フレームの状態を取得する(conditionのupdate)と
そのconditionを元にstateの更新する(stateのupdate)
のような形に分割することに。
conditionはheldの意図があり、ボタンで言えば「押されている」に当たる、
ON/OFFの単純な構造の為、conditionの更新は同じフレーム内に複数回まわしても、基本的に問題はないし、意図的に上書きする運用もできる。
一方のstateも「押されている」という情報を保持しているが、
stateはconditionを元に「押された」「離された」「押されている」「押されていた」といった複数の情報を一緒に管理しています。
conditionがtrueで「押されていた」がfalseなら「押された」と判定できるし、
conditionがfalseで「押されていた」がtrueなら「離された」と判定できます。
そのため、今のstate(更新を実行する前)を更新するのはフレーム中に必ず1回である必要があります。
フォーカスの一意化には現在の状態(condition)の判定で十分と判断したため、
updateをconditionとstateで分離し、先にconditionを更新して判定、後でstateの更新を一括で行う。その様な方向で調整しました。
今はまだ方向性通りに「意図した動作をする」という所に止まりで、コードの纏まりがなんとも言えない感じ。
後で困らないよう、きちんとした実装にはまだ少し掛かりそうです。
細かい部分が思ったより厄介でした。