Iphone 检测触摸Cocos2d-x
我正在使用Cocos2d-x,并试图在HelloWorld项目中检测触摸。虽然我运气不好 h .ccp 但问题是,当我点击屏幕时,“这”永远不会出现在日志中。我错过了什么 谢谢 编辑 我正在使用这个教程。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:
您必须向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);
}