よくスマホゲームって、タッチした場所にアニメーションを入れてエフェクトかけてるじゃないですか。
あれを実装して見たいと思います。
今回もフリー素材のぴぽや倉庫さんから素材を拝借しました。
すでに、タッチ処理のやり方もアニメーションのやり方も知っているので、これを組み合わせます。
コードはこうなりました。
bool HelloWorld::init()
{
中略
auto listener1 = EventListenerTouchOneByOne::create();
listener1->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, this);
return true;
}
bool HelloWorld::onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event)
{
auto anime = Sprite::create("pipo-btleffect007.png");
if (anime == nullptr)
{
problemLoading("'pipo-btleffect007.png'");
}
else
{
this->addChild(anime, 0);
}
float frameHeight = anime->getContentSize().height;
float frameWidth = anime->getContentSize().width / 14.0;
Vector<SpriteFrame*> animFrames;
animFrames.reserve(14);
for(int i = 0; i < 14; i++) {
animFrames.pushBack(SpriteFrame::create("pipo-btleffect007.png", Rect(frameWidth * i,0,frameHeight,frameWidth)));
}
Animation* animation = Animation::createWithSpriteFrames(animFrames, 0.02f);
Animate* animate = Animate::create(animation);
anime->setPosition(touch->getLocation().x, touch->getLocation().y);
anime->runAction(animate);
return true;
}
前回のタッチ処理でラムダ式を使いましたが、
C++のラムダ式は思った以上に使いづらいので、
普通にコールバックとして関数を定義し、マクロで登録する形にしました。
アニメーション画像は14枚横に並んでいるので、この画像を横に14等分割にクリッピングして使用しています。
あとはアニメーション画像の位置をタップ位置に設定してアニメーションを実行します。
前回はanimateをforever(無限ループ)していましたが、今回は1回きりのアニメーションなので、animateをそのまま使用しています。
どちらも親クラスがActionクラスなので、問題ありません。