Iphone 检测触摸Cocos2d-x

Iphone 检测触摸Cocos2d-x,iphone,c++,objective-c,cocos2d-iphone,cocos2d-x,Iphone,C++,Objective C,Cocos2d Iphone,Cocos2d X,我正在使用Cocos2d-x,并试图在HelloWorld项目中检测触摸。虽然我运气不好 h .ccp 但问题是,当我点击屏幕时,“这”永远不会出现在日志中。我错过了什么 谢谢 编辑 我正在使用这个教程。 您必须向CCTouchDispatcher注册才能接收触摸: CCTouchDispatcher::sharedDispatcher()->addStandardDelegate(this, 0); 在init()方法中写入以下内容,以便接收触摸: CCTouchDispatcher:

我正在使用Cocos2d-x,并试图在HelloWorld项目中检测触摸。虽然我运气不好

h

.ccp

但问题是,当我点击屏幕时,“这”永远不会出现在日志中。我错过了什么

谢谢

编辑

我正在使用这个教程。

您必须向CCTouchDispatcher注册才能接收触摸:

CCTouchDispatcher::sharedDispatcher()->addStandardDelegate(this, 0);
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);
为了调用这些方法,您必须向touch dispatcher注册一些不同的方法:

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

在新的cocos版本中,
CCTouchDispatcher
位于
CCDirector

它应该是这样的:

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

所以一些超级简单的东西,只是补充了一下

this->setIsTouchEnabled(true)

到我的init();功能

'this' never shows up in the log

提示您可能正在使用不同版本的Cocos2D库。请访问项目的
cocos2d.h
,并确认。(样本写在1.0.1上)。如果您使用的是不同的版本,(猜测),您可能需要使用不同的
cctouchsbegind
签名和/或修复更多的内容,而不仅仅是
setIsTouchEnabled
。我刚刚下载了示例,并且
cctouchesbeated
调用工作正常-没有任何更改。

this->settoucheenabled(true)
CCTouchDispatcher::sharedDispatcher()->AddTargetedElegate(这个,0,true)工作得更好不幸的是,我的ccTouchMoved没有拾取任何东西…:(

对于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;
}

在下面的方法中,我将在Sprite上应用touch,如果您想在TextField、Node、Background或任何组件上应用touch事件,只需将该组件类型传递到该方法中,它就会工作

好的,让我们开始吧

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或任何地方调用此方法

hmmm当我在HelloWorld中将此方法添加到init()时,在“cocos2d::CCTouchDispatcher”中没有名为“sharedDispatcher”的memeber
。cpp@JamesDunay:您使用的cocos版本是什么?所以现在我得到了错误,
断言失败:(false),函数cctouchStart,文件/Iphone/SDK/Eyes/Eyes C++/Eyes C++/libs/cocos2dx/layers\u scenes\u transitions\u nodes/CCLayer.cpp,第292行。
我发布了我正在使用的教程,它似乎没有提到任何
getTouchDispatcher
CCTouchDispatcher
,但我能够用他的方法记录结果。你负责删除吗删除图层时是否删除目标代理?
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);
}