我是 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);
在一个地方处理触摸会更好,更清晰。但我想,没有人能阻止你这样做
您不需要子类化精灵来检测触摸。
在这里,关注这个LINK是开始使用 Cocos2d 的好地方