Обнаружение касания Cocos2d-x
Я использую Cocos2d-x и пытаюсь обнаружить прикосновения в моем проекте HelloWorld. Хотя мне не везет.
.h
class HelloWorld : public CCLayer{
private:
CCSpriteBatchNode * _batchNode;
CCSprite *_turkey;
virtual void ccTouchesBegan(cocos2d::CCSet* touches, cocos2d::CCEvent* event);
.КПК
void HelloWorld::ccTouchesBegan(cocos2d::CCSet* touches, cocos2d::CCEvent* event){
CCLog("this");
}
но дело в том, что, когда я нажмите на экран, " это " никогда не появляется в журнале. Я что-то упускаю?
спасибо!
редактировать
im, используя этот учебник. http://www.raywenderlich.com/11338/cocos2d-x-for-ios-and-android-space-game
6 ответов
вы должны зарегистрироваться в CCTouchDispatcher, чтобы получить прикосновения:
напишите это в своем init()
метод для того, чтобы получить прикосновения:
CCTouchDispatcher::sharedDispatcher()->addStandardDelegate(this, 0);
также я рекомендую вам получать сенсорное событие с помощью целевых методов делегата касания:
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
для того, чтобы эти методы были вызваны, вы должны зарегистрироваться в touch dispatcher немного иначе:
CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, 0, true);
редактировать
в новой версии cocos CCTouchDispatcher
is расположен в CCDirector
:
это должно выглядеть примерно так:
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
'this' never shows up in the log
подсказки возможно, вы используете другую версию библиотеки Cocos2D. Пожалуйста, перейдите в cocos2d.h
на вашем проекте и подтвердите. (образец был написан на 1.0.1). Если вы находитесь в другой версии, (гадание) можно использовать разные ccTouchesBegan
подпись и / или исправить больше, чем просто setIsTouchEnabled
чтобы заставить его работать. Я только что загрузил образец, и ccTouchesBegan
call работает идеально-без каких-либо изменений.
здесь, в методе ниже, я применяю touch на Sprite, если вы хотите применить событие touch на TextField, Node , Background или в любом компоненте, просто передайте этот ComponentType в этот метод, и он будет работать ....
OK ДАВАЙТЕ НАЧНЕМ!!!!
void YourClassName::YourListnerMethodName(cocos2d::Sprite* object)
{
auto listener = cocos2d::EventListenerTouchOneByOne::create();
listener->setSwallowTouches(false);
listener->onTouchBegan = [=](cocos2d::Touch* touch, cocos2d::Event* event)
{
auto target = event->getCurrentTarget();
Point locationInNode = target->convertToNodeSpace(touch->getLocation());
// Suppose your sprite or any component is inside in any parent object then use this line instead of above line ...
//just uncomment below line and it will work fine in this case
//Point locationInNode = target->getParent()->convertToNodeSpace(touch->getLocation());
if (target->getBoundingBox().containsPoint(locationInNode)) {
// CODE FOR RESPONSE AFTER TOUCH
return true;
}
return false;
};
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, object);
}
здесь целью является ваш компонент, где вы хотите применить прикосновение к нему
просто не забудьте вызвать этот метод из ctor или в любом месте в соответствии с вашим требованием
this->setTouchEnabled(true);
работает лучше, чем CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, 0, true);
к сожалению, мой ccTouchMoved ничего не берет... :(
для cocos2d-x v3.0..
записать это в свой '.ч' файл
{bool onTouchBegan (cocos2d::Touch * touch, cocos2d::Event * event);}
записать это в свой 'init()' function
..
{
auto listner = EventListenerTouchOneByOne::create();
listner->setSwallowTouches(true);
listner->onTouchBegan = CC_CALLBACK_2(Gameplay::onTouchBegan, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listner, this);
}
и запишите это в '.файл cpp'..
bool "YOURCLASSNAME"::onTouchBegan(cocos2d::Touch* touch, cocos2dEvent* event)
{
CCLOG("this");
return true;
}