2012-06-21 3 views
6

Я использую Cocos2d-x и пытаюсь обнаружить штрихи в моем проекте HelloWorld. Хотя мне не повезло.Обнаружение касания Cocos2d-x

.h

class HelloWorld : public CCLayer{ 

private: 
    CCSpriteBatchNode * _batchNode; 
    CCSprite *_turkey; 
    virtual void ccTouchesBegan(cocos2d::CCSet* touches, cocos2d::CCEvent* event); 

.ccp

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

ответ

20

Вы должны зарегистрироваться 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); 

Чтобы эти методы чтобы назвать вы должны зарегистрироваться с сенсорным диспетчером немного отличается:

CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, 0, true); 

EDIT

В новых Кокосовых версиях CCTouchDispatcher находится в CCDirector:

Это должно выглядеть примерно так:

CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true); 
+0

хммм я получаю error 'Нет memeber с именем 'sharedDispatcher'' в' cocos2d :: CCTouchDispatcher ', когда я объявляю его в свой init(), в HelloWorld.cpp –

+0

@JamesDunay: какую версию кокоса вы используете? – Andrew

+0

@JamesDunay: см. Мое редактирование – Andrew

7

Итак, что-то супер простое, только что добавлено

this->setIsTouchEnabled(true);

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

2
'this' never shows up in the log 

намеки Вы можете использовать другую версию библиотеки cocos2d. Пожалуйста, перейдите к cocos2d.h по вашему проекту и подтвердите. (образец был написан на 1.0.1). Если вы находитесь на другой версии, (угадывая), вам, возможно, придется использовать другую подпись ccTouchesBegan и/или исправить больше, чем просто setIsTouchEnabled, чтобы она работала. Я просто скачал образец, и звонок ccTouchesBegan работает отлично - без каких-либо изменений.

-1

this->setTouchEnabled(true); работает лучше, чем CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, 0, true);, к сожалению, мой ccTouchMoved не собирание ничего до ... :(

-1

для cocos2d-х 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; 
} 
0

Здесь в ниже метод, который я подаю touch на Sprite. Если вы хотите применить событие касания на TextField, Node, Background или в любом компоненте, просто передайте этот ComponentType в этот метод, и он будет работать ...

OK LETS BEGIN !!!!

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 или в любом месте по вашему требованию

Смежные вопросы