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

4

6 回答 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);
于 2012-06-21T15:11:58.030 回答
8

所以一些超级简单的东西,刚刚添加

this->setIsTouchEnabled(true);

到我的 init(); 功能。

于 2012-06-21T16:38:06.483 回答
2
'this' never shows up in the log

提示您可能正在使用不同版本的 Cocos2D 库。请转到cocos2d.h您的项目并确认。(样本写在 1.0.1 上)。如果您使用的是不同的版本,(猜测)您可能必须使用不同的ccTouchesBegan签名和/或修复更多内容,而不仅仅是setIsTouchEnabled使其工作。我刚刚下载了示例,ccTouchesBegan通话效果很好 - 没有任何更改。

于 2012-07-27T00:04:11.387 回答
0

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

于 2013-04-17T14:53:10.147 回答
0

cocos2d-x v3.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;
}
于 2015-06-19T13:39:30.563 回答
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 或任何地方调用此方法

于 2017-06-05T01:22:49.470 回答