2012-06-21 13 views
6

Sto utilizzando Cocos2d-x e sto cercando di rilevare i tocchi nel mio progetto HelloWorld. Anche se non sto avendo fortuna.Rileva tocco 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"); 
} 

ma il fatto è che quando scatto la schermata di 'questo' non compare nel registro. Cosa mi manca qui?

grazie!

Modifica,

Sto usando questo tutorial. http://www.raywenderlich.com/11338/cocos2d-x-for-ios-and-android-space-game

risposta

20

Devi registrarti con CCTouchDispatcher al fine di ricevere tocchi:

Scrivi questo nel metodo init() al fine di ricevere tocchi:

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

Inoltre vi consiglio di ricevere evento di tocco via metodi delegati al tocco mirati:

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

Per questi metodi essere c alled è necessario registrarsi con un tocco dispatcher un po 'diverso:

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

EDIT

Nella nuova versione cocos CCTouchDispatcher si trova a CCDirector:

Dovrebbe essere qualcosa di simile:

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

hmmm io ottenere il error 'Nessun memeber chiamato 'sharedDispatcher'' in' cocos2d :: CCTouchDispatcher 'quando lo annuncio sul mio init(), in HelloWorld.cpp –

+0

@JamesDunay: quale versione di cocos usi? – Andrew

+0

@JamesDunay: per favore, vedere la mia modifica – Andrew

7

Quindi qualcosa di super semplice, appena aggiunto

this->setIsTouchEnabled(true);

alla mia init(); funzione.

2
'this' never shows up in the log 

suggerimenti si potrebbero utilizzare una versione diversa della libreria Cocos2d. Vai al cocos2d.h sul tuo progetto e conferma. (il campione è stato scritto su 1.0.1). Se si utilizza una versione diversa (indovinando), potrebbe essere necessario utilizzare diversa firma ccTouchesBegan e/o correggere più di per farlo funzionare. Ho appena scaricato l'esempio e la chiamata ccTouchesBegan funziona perfettamente, senza alcuna modifica.

-1

this->setTouchEnabled(true); funziona meglio di CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, 0, true); purtroppo il mio ccTouchMoved non raccoglie nulla fino ... :(

-1

per cocos2d-x v3.0 ..

scrivere questo nel vostro'.h 'file di

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

scrivere questo nella vostra 'init()' function ..

{ 
auto listner = EventListenerTouchOneByOne::create(); 

listner->setSwallowTouches(true);  

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

_eventDispatcher->addEventListenerWithSceneGraphPriority(listner, this); 
} 

e scrivere questo file' cpp' ..

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

Qui nel metodo seguito Mi candido tocca su Sprite, se vuoi applicare un evento touch su TextField, Node, Background o in qualsiasi componente, passa a ComponentType in questo metodo e funzionerà ...

OK INIZIAMO !!!!

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

Qui l'obiettivo è il componente, in cui si desidera applicare tocco su di esso

Basta non dimenticare di chiamare questo metodo da ctor o dovunque secondo il vostro requisito

Problemi correlati