Обнаружение касания 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->setIsTouchEnabled(true);

к моему init (); функция.


'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;
}