stepismのブログ

ゲームだったりそれ以外だったり。色々やってるプログラマです。

【考察】ボタンの押せる、押せないの判定方法について

      2016/09/11

ゲームの画面、とくにUIを見眺めるとそこかしこに押せるボタンというものが存在しています。ボタンは通常押せるものですが、シーンの繊維中やローディング中など、押せてはいけないケースが結構あります。今回はこのボタンについて、押せる/押せないの判定方法を考えてみます。

その場限りの対応。何も考えずに実装したケース

連打禁止対応としてよく見るコードです。一度押されたらフラグを追って、フラグの折れている間は受け付けない。一定の処理を終えたらフラグを立てる。これは修正が一か所だけなら問題なさそうに見えますが、対応箇所が複数存在するとどうでしょうか。ボタン操作する箇所全てで同様の変数を定義しなければいけませんし、何より抜けが発生し不具合のもとになります。

フラグを外に出しどこでも参照できる様にしたケース

フラグを外に出してみました。単純なことですが変数が一つで済む様になりますしローカル変数が消せます。また、今後同様の対応を行う場合はButtonStateクラスを操作すれば良いのだなと自然とルール付けされます。

基底クラスを用意する場合

「ボタン」単位でクラスを用意しておいて、Baseでシーンの切り替わりなど共通のチェックを通してしまう。
Updateがprotectedになっているのは継承を前提としており

とすることで個別対応が可能になります。ボタンの数が何百とある場合は毎フレーム更新するのは負荷的に難しい場合もありますが、仮にその様な場合はグループ分け(レイヤー管理)すれば良いです。

まとめ

身近にあるボタンひとつでも色々あるよ。という話でした。この辺の基本的な設計を怠っているとバグまみれになります。特に連打系は意図しない動作を招くので、できるだけ慎重に考える必要があります。

スポンサーリンク

スポンサーリンク

 - プログラミング