去年のAdvent Calendarもカスタムボタンを作ったのですが、Cocos2d-xの3系が盛り上がっているので、今回はCocos2d-x 3.2を使ってカスタムボタンを作りました。
https://gist.github.com/t-kashima/0c6c51c90d3df02f2631
ここではそのポイントを紹介します。
まずは以下のコードでタッチのリスナーを作ります。
CustomButton.cpp
auto listener = EventListenerTouchOneByOne::create();
次にそれぞれのタッチの状況に応じて、タッチされた時のコールバックを設定します。
「onTouchBegan」-> タッチされた時
「onTouchMoved」-> タッチが動いた時
「onTouchEnded」-> タッチが離された時
ラムダ式が使えるのでとても簡単にコールバックが書けますね。
CustomButton.cpp
listener->onTouchBegan = [this](Touch *touch, Event *event) {
log("onTouchBegan");
// タッチされた場所を取得する
Vec2 touchPos = touch->getLocation();
// このオブジェクトがタッチされているかの判定
bool isTouchInSide = this->getBoundingBox().containsPoint(touchPos);
if (isTouchInSide) {
// タッチされた時に縮めて小さくする
this->setScale(0.9f);
this->setColor(Color3B::GRAY);
return true;
}
return false;
};
listener->onTouchMoved = [this](Touch *touch, Event *event) {
log("onTouchMoved");
};
listener->onTouchEnded = [this](Touch *touch, Event *event) {
log("onTouchEnded");
// タッチが離れた時に元に戻す
this->setScale(1.0f);
this->setColor(Color3B::WHITE);
};
「onTouchBegan」の中では自分自身がタッチされているかを判定して、タッチされている場合は、少し小さくしてグレーにしています。「onTouchEnded」で元の大きさと色に戻しています。
最後にさきほど作ったタッチのリスナーを登録します。
CustomButton.cpp
getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);
これで最低限ではありますが、ボタンとして機能すると思います!