2012-06-21 17 views
6

Używam Cocos2d-x i próbuję wykryć dotknięcia w moim projekcie HelloWorld. Chociaż nie mam szczęścia.Wykryj dotyk 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"); 
} 

ale jest to, że po kliknięciu na ekranie 'to' nigdy nie pojawia się w dzienniku. Czego tu mi brakuje?

dziękuję!

Edycja

Im przy użyciu tego samouczka. http://www.raywenderlich.com/11338/cocos2d-x-for-ios-and-android-space-game

Odpowiedz

20

Musisz zarejestrować się CCTouchDispatcher w celu uzyskania poprawki:

napisać to w sposób init() w celu uzyskania poprawki:

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

Również polecam otrzymywać dotykowy zdarzenie poprzez ukierunkowane metody delegowania dotykowego:

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

Aby te metody mogły być wykonane alled trzeba zarejestrować się dotykowym dyspozytora nieco inaczej:

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

EDIT

w Nowym cocos wersji CCTouchDispatcher znajduje sie w CCDirector:

To powinno wyglądać mniej więcej tak:

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

hmmm ja dostaję error 'Brak memeber o nazwie 'sharedDispatcher'' w' cocos2d :: CCTouchDispatcher ', gdy reklamuję go do mojego init(), w HelloWorld.cpp –

+0

@JamesDunay: z jakiej wersji kokosowej korzystasz? – Andrew

+0

@JamesDunay: proszę, zobacz moją edycję – Andrew

7

Coś super prostego, po prostu dodano

this->setIsTouchEnabled(true);

do mojego init(); funkcjonować.

2
'this' never shows up in the log 

podpowiedzi być może używasz innej wersji biblioteki Cocos2d. Przejdź do cocos2d.h w swoim projekcie i potwierdź. (próbka została napisana 1.0.1). Jeśli używasz innej wersji, (zgadywanie), być może będziesz musiał użyć innego podpisu ccTouchesBegan i/lub naprawić więcej niż tylko setIsTouchEnabled, aby działał. Właśnie pobrałem próbkę, a wywołanie ccTouchesBegan działa idealnie - bez żadnych zmian.

-1

this->setTouchEnabled(true); działa lepiej niż CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, 0, true); niestety moja ccTouchMoved niczego nie podnosząc ... :(

-1

dla cocos2d-x v3.0 ..

napisać to w swojej”.'File

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

napisać to w swoim 'h init()' function ..

{ 
auto listner = EventListenerTouchOneByOne::create(); 

listner->setSwallowTouches(true);  

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

_eventDispatcher->addEventListenerWithSceneGraphPriority(listner, this); 
} 

i napisać to w'' pliku .cpp ..

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

Tutaj w sposób poniżej jestem stosowania dotknij Sprite, Jeśli chcesz zastosować zdarzenie dotykowe na TextField, Węzeł, Tło lub w dowolnym komponencie, po prostu Przekaż ten typ Component do tej metody i zadziała ....

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

Tutaj cel jest komponent, gdzie chcesz zastosować akcent na nim

Tylko nie zapomnij, aby wywołać tę metodę z ctor lub gdziekolwiek w zależności od zapotrzebowania