さて、今回はタッチ処理を試してみたいと思います。
タッチ処理はスマホ専用の処理なので、Windowsでは動かないので、スマホで動作確認します。
で、タッチした座標を画面に表示させたいと思います。
auto listener1 = EventListenerTouchOneByOne::create();
listener1->onTouchBegan = [this](Touch* touch, Event* event)->bool
{
auto str = String();
str.appendWithFormat("Touch (%f %f)", touch->getLocation().x, touch->getLocation().y);
label->setString(str.getCString());
return true;
};
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, this);
タッチ処理はイベントリスナーを使用するのですが、
EventListenerTouchOneByOneとEventListenerTouchAllAtOnceがあるのですが、前者はシングルタッチ、後者はマルチタッチのようです。
使用するハンドラ名が若干違うようです。
今回はシングルタッチを使用します。
で、今回初めてC++のラムダ式を使ったのですが、
[]はキャプチャといって、ラムダ式内に持っていく変数を指定するみたいなんですよね。
座標を表示するラベルなんですが、
ローカルにLabelオブジェクトを定義して[&label]って書いてもエラーで動かなかったので、
今回はサンプルコードに従って、labelはprivate変数に定義し、キャプチャには[this]とします。
こうすることでprivateのlabelオブジェクトを使用することができました。
あとは、引数touchからx,y座標をラベルに表示させる。
スマホだからか、画像のクリッピング処理がWindowsとは動きが違ってたんですよね。
ちょっとここは要調査ですわ。
もしかしたら、Windows用とスマホ用に画像を2種類用意しないといけないかもしれん。