Go&Ebitengineでマルチタッチ入力を考える
はじめに
マルチタッチはかつてGoogleがNexus7を出したときに買って、JavaでAndroidアプリを試して以来である。2012年だからずいぶん前だ。
その頃にぼんやり考えていたタッチ入力のイメージは、「タッチされるたびに新規タッチオブジェクトが生成されて、移動に合わせて座標を更新、離されたらお亡くなりになって更新されなくなるから捨てる」という感じだった。実際にはIDで管理されていてIDは使いまわされるのでイメージと違ったのだが。
当時Androidのタッチ入力のインターフェースは座標と縦横サイズ、回転角度を持った円、つまり回転した楕円の情報を持っていて、指って楕円なんだ、という衝撃と、衝突判定めちゃくちゃ面倒じゃねって思ったことを覚えている。
今回はマルチタッチネタということで、前回のタッチ入力を整理してからの続きとなる。
Githubに置く
毎度コードの存在が前提である。動くコードが出せない豚はただの豚だ。
実行はこちらで。
コードはこちら。
マルチタッチできるので動かしてみたい人はぜひタッチ可能なデバイスでどうぞ。マウス操作だと挙動に変化はないので。
これは何か
四角が2個あるんだからマルチタッチで同時に動かせてもいいよね?って思ったので対応してみた。
マウス操作はタッチの中の1つという扱いで、マルチタッチ用にコードを書けば自然とマウス入力もできるようになっている。
なお、マルチタッチできるけどシングルタッチでいいならマウスでも操作できるよ、っていう処理が実際に有用なのかはここでは問わない。
内容
単純に、タッチIDという使いまわされるプラットフォームから直通の値がアプリまで出てくるのが個人的に気に入らない。概念的に隠蔽しておきたい。
ということでdragMapというmapをGame構造体に追加して、タッチとRectの対応付けをする。
input.goからAllTouches()でTouchInfoインターフェースのスライスをもらって、タッチしたRectをmapに入れておき、入ってるものは継続してタッチ中として扱う。
input.goのほうはちょっと激しくコードを追加していて、タッチとマウスを統合して扱うためにTouchInfoインターフェースを作って対応したタッチとマウスの構造体を作成。
Input_Update()の最後でタッチの情報を作る。
AllTouches()でタッチとマウスの情報を混ぜて返す。
これでユーザ側からは区別することなく使える、はず、ということだ。
Goのインターフェースはポインタなのか実体なのか見た目でよくわからんので、とりあえず動いてはいるがそのあたりの挙動は少し自信が無い。ちょっと整理して勉強しないといかん気がする。
おしまい
勉強不足が露呈したところで逃げるように終了。
回が進んでも見た目が変わっていかないところは芸風なので許してほしい。
Discussion