2012-06-21 10 views
6

Uso Cocos2d-x e intento detectar toques en mi proyecto HelloWorld. Aunque no estoy teniendo suerte.Detectar contacto 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"); 
} 

pero la cosa es que cuando hago clic en la pantalla de 'esto' nunca aparece en el registro. que me estoy perdiendo aqui?

gracias!

Editar,

Im utilizando este tutorial. http://www.raywenderlich.com/11338/cocos2d-x-for-ios-and-android-space-game

Respuesta

20

Usted tiene que registrarse con CCTouchDispatcher el fin de recibir toques:

escribir esto en su método de init() el fin de recibir toques:

CCTouchDispatcher::sharedDispatcher()->addStandardDelegate(this, 0); 

También os recomiendo para recibir eventos contacto a través método de delegado táctil:

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); 

Para que estos métodos sean c alled hay que registrarse con el despachador toque un poco diferente:

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

EDITAR

En la nueva versión cocos CCTouchDispatcher se encuentra en CCDirector:

Debe ser algo como esto:

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

hmmm consigo el error 'Ningún memeber llamado 'sharedDispatcher'' en' cocos2d :: CCTouchDispatcher 'cuando lo adhiero a mi init(), en HelloWorld.cpp –

+0

@JamesDunay: ¿qué versión de Cocos usas? – Andrew

+0

@JamesDunay: por favor, vea mi edición – Andrew

7

Así que algo super simple, acaba de agregar

this->setIsTouchEnabled(true);

a mi init(); función.

2
'this' never shows up in the log 

consejos Puede que esté utilizando una versión diferente de la biblioteca Cocos2D. Vaya a cocos2d.h en su proyecto y confirme. (la muestra fue escrita en 1.0.1). Si está en una versión diferente, (adivinando), es posible que deba usar una firma diferente de ccTouchesBegan y/o corregir algo más que setIsTouchEnabled para que funcione. Acabo de descargar la muestra y la llamada ccTouchesBegan funciona perfectamente, sin ningún cambio.

-1

this->setTouchEnabled(true); funciona mejor que CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, 0, true); por desgracia mi ccTouchMoved es no elegir cualquier cosa para arriba ... :(

-1

para cocos2d-x v3.0 ..

escribir esto en su'.'Archivo

{bool onTouchBegan (cocos2d::Touch * touch, cocos2d::Event * event);} 

escribir esto en su 'h .. init()' function

{ 
auto listner = EventListenerTouchOneByOne::create(); 

listner->setSwallowTouches(true);  

listner->onTouchBegan = CC_CALLBACK_2(Gameplay::onTouchBegan, this); 

_eventDispatcher->addEventListenerWithSceneGraphPriority(listner, this); 
} 

y escribir esto en el archivo' .cpp' ..

bool "YOURCLASSNAME"::onTouchBegan(cocos2d::Touch* touch, cocos2dEvent* event) 
{ 
     CCLOG("this"); 
      return true; 
} 
0

Aquí en el método de abajo Me estoy aplicando toque en Sprite, si desea aplicar el evento táctil en TextField, Node, Background o en cualquier componente simplemente pase ese ComponentType a este método y Funcionará ...

OK ¡COMIENCE A COMENZAR !!!!

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

Aquí el objetivo es su componente, en la que desea aplicar toque en él

Eso sí, no se olvide de llamar a este método de Héctor o en cualquier lugar de acuerdo a su requerimiento