私はcocos2d(-x)の世界に不慣れです。
スプライトへのタッチを検出したいのですが、チュートリアル/例では、レイヤーを使用してタッチを検出し、バウンディングボックスを備えた適切なスプライトを見つけることを提案しているようです。
タッチ検出を可能にするためにスプライトをサブクラス化することは一般的に悪い考えですか?
私はcocos2d(-x)の世界に不慣れです。
スプライトへのタッチを検出したいのですが、チュートリアル/例では、レイヤーを使用してタッチを検出し、バウンディングボックスを備えた適切なスプライトを見つけることを提案しているようです。
タッチ検出を可能にするためにスプライトをサブクラス化することは一般的に悪い考えですか?
注: この回答は古くなっている可能性があります。私は2012年にこれに答えました。
それは悪い考えではありません。これが私がそれを行う方法です:
ヘッダファイル:
#include "cocos2d.h"
using namespace cocos2d;
class TouchableSprite : public cocos2d::CCSprite, public CCTargetedTouchDelegate {
public:
virtual void onEnter();
virtual void onExit();
virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
virtual void ccTouchMoved(CCTouch* touch, CCEvent* event);
virtual void ccTouchEnded(CCTouch* touch, CCEvent* event);
};
cpp ファイル:
#include "TouchableSprite.h"
void TouchableSprite::onEnter(){
// before 2.0:
// CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, 0, true);
// since 2.0:
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
CCSprite::onEnter();
}
void TouchableSprite::onExit(){
// before 2.0:
// CCTouchDispatcher::sharedDispatcher()->removeDelegate(this);
// since 2.0:
CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
CCSprite::onExit();
}
bool TouchableSprite::ccTouchBegan(CCTouch* touch, CCEvent* event){
//do whatever you want here
return true;
}
void TouchableSprite::ccTouchMoved(CCTouch* touch, CCEvent* event){
//do what you want
}
void TouchableSprite::ccTouchEnded(CCTouch* touch, CCEvent* event){
//do your job here
}
cocos2d-x 3.0 alpha では、これを試すことができます:
auto listener = EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);
listener->onTouchBegan = [&](Touch* touch, Event* event){
if (this->getBoundingBox().containsPoint(this->convertTouchToNodeSpace(touch))) {
return true;
}
return false;
};
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);
タッチを 1 か所で処理する方が適切で、はるかに明確です。しかし、誰もあなたがこれを行うことを妨げることはできないと思います
タッチを検出するためにスプライトをサブクラス化する必要はありません。
ここで、このリンクに従ってください。Cocos2d を始めるのに最適な場所です。