2012-06-21 174 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"); 
} 

但事情是,当我点击屏幕 '这个' 从来没有在日志中显示出来。我在这里错过了什么?

谢谢!

编辑,

我正在使用本教程。 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); 

为了使这些方法成为c alled你有联系调度员注册一个有点不同:

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

编辑

在新科科斯版本CCTouchDispatcher位于CCDirector

它应该是这个样子:

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

嗯我得到的错误'不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-X 3.0 ..

写在你的”。H '文件

{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

在这里,在下面的方法,我申请触摸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); 
} 

这里的目标是你的组件,要在其上应用触摸

只是不要忘记调用根据您的要求,从构造函数这种方法或任何