检测触摸 Cocos2d-x

6

我正在使用Cocos2d-x,并尝试在HelloWorld项目中检测触摸事件,但是一直没有成功。

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

但是问题在于,当我点击屏幕时,“this”从未在日志中显示。我在这里漏掉了什么吗?
谢谢!
编辑:
我正在使用这个教程。 http://www.raywenderlich.com/11338/cocos2d-x-for-ios-and-android-space-game
6个回答

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

编辑

在新版的cocos中,CCTouchDispatcher被移动到了CCDirector中:

应该长这个样子:

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

在HelloWorld.cpp的init()中添加后,我收到了“cocos2d :: CCTouchDispatcher”中没有名为“sharedDispatcher”的成员的错误。 - James Dunay
@JamesDunay:你使用的是哪个版本的Cocos? - Andrew
2
现在我收到了一个错误,断言失败:(false),函数ccTouchBegan,文件/Iphone/SDK/Eyes/Eyes C++/Eyes C++/libs/cocos2dx/layers_scenes_transitions_nodes/CCLayer.cpp,第292行。 - James Dunay
我发布了我正在使用的教程,似乎没有提到任何“getTouchDispatcher”或“CCTouchDispatcher”,但我能够在他的方法中记录结果。 - James Dunay
1
当该层被移除时,您是否负责移除目标委托? - user153275

8
所以,非常简单的事情,只需在我的init()函数中添加以下代码:

this->setIsTouchEnabled(true);


2
'this' never shows up in the log
您可能正在使用不同版本的Cocos2D库。请前往项目中的并确认。(示例是在1.0.1上编写的)。如果您使用的是不同版本,(猜测)您可能需要使用不同的签名和/或修复更多问题,而不仅仅是才能使其正常工作。我刚刚下载了示例,调用完美无误 - 没有任何更改。

0

对于cocos2d-x v3.0..

请在您的'.h'文件中编写此代码

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

在你的 'init()' 函数中写入以下代码..

{
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传递到此方法中,它将起作用....
好的,让我们开始吧!
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 或任何地方调用此方法即可


0

this->setTouchEnabled(true);CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, 0, true);更好用,但不幸的是我的ccTouchMoved没有捕捉到任何东西... :(


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接