C++ Cocos2d-x和触摸事件的处理
我有我的精灵在屏幕上,我有一个存储每个精灵的向量 CCSprite*能处理触摸事件吗?还是仅仅是CCLayer* 决定触摸了什么雪碧的最佳方法是什么?我是否应该存储精灵在精灵类中的位置坐标,当我获取事件时,通过查看向量并获取每个精灵的当前坐标,查看用户触摸的位置是否是精灵所在的位置? 更新:I子类CCSprite: 类字段:public cocos2d::CCSprite,public cocos2d::CCTargetedTouchDelegate 我执行以下功能:C++ Cocos2d-x和触摸事件的处理,c++,cocos2d-iphone,cocos2d-x,multi-touch,C++,Cocos2d Iphone,Cocos2d X,Multi Touch,我有我的精灵在屏幕上,我有一个存储每个精灵的向量 CCSprite*能处理触摸事件吗?还是仅仅是CCLayer* 决定触摸了什么雪碧的最佳方法是什么?我是否应该存储精灵在精灵类中的位置坐标,当我获取事件时,通过查看向量并获取每个精灵的当前坐标,查看用户触摸的位置是否是精灵所在的位置? 更新:I子类CCSprite: 类字段:public cocos2d::CCSprite,public cocos2d::CCTargetedTouchDelegate 我执行以下功能: cocos2d::
cocos2d::CCRect rect();
virtual void onEnter();
virtual void onExit();
bool containsTouchLocation(cocos2d::CCTouch* touch);
virtual bool ccTouchBegan(cocos2d::CCTouch* touch, cocos2d::CCEvent* event);
virtual void ccTouchMoved(cocos2d::CCTouch* touch, cocos2d::CCEvent* event);
virtual void ccTouchEnded(cocos2d::CCTouch* touch, cocos2d::CCEvent* event);
virtual void touchDelegateRetain();
virtual void touchDelegateRelease();
我把CCLOG语句放在每一条语句中,我不点击它们
当我触摸CCLayer时,这个精灵是打开的,尽管我确实点击了实现该层的类中的那些精灵,并将这些精灵放在该层上
更新:我一直在尝试的代码:
Field* Field::createWithLocation(cocos2d::CCPoint p)
{
Field* f = new Field();
f->autorelease();
f->initWithLocation(p);
return f;
}
void Field::initWithLocation(cocos2d::CCPoint p)
{
setFieldCenterPoint(p);
setFieldGraphicName(FIELD::fieldIconFileName);
setFieldSprite(cocos2d::CCSprite::create(getFieldGraphicName().c_str()));
getFieldSprite()->setPosition(ccp(getFieldCenterPoint().x, getFieldCenterPoint().y));
setFieldSize(getFieldSprite()->getContentSize());
}
cocos2d::CCRect Field::rect()
{
cocos2d::CCSize s = getFieldSprite()->getTexture()->getContentSize();
return cocos2d::CCRectMake(-s.width / 2, -s.height / 2, s.width, s.height);
}
void Field::onEnter()
{
CCLOG("In onEnter");
cocos2d::CCDirector* pDirector = cocos2d::CCDirector::sharedDirector();
pDirector->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
//_dir->Instance()->getDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
cocos2d::CCSprite::onEnter();
}
void Field::onExit()
{
CCLOG("In onExit");
cocos2d::CCDirector* pDirector = cocos2d::CCDirector::sharedDirector();
pDirector->getTouchDispatcher()->removeDelegate(this);
//_dir->Instance()->getDirector()->getTouchDispatcher()->removeDelegate(this);
cocos2d::CCSprite::onExit();
}
bool Field::containsTouchLocation(cocos2d::CCTouch* touch)
{
return rect().containsPoint(convertTouchToNodeSpaceAR(touch));
}
bool Field::ccTouchBegan(cocos2d::CCTouch* touch, cocos2d::CCEvent* event)
{
CCLOG("In ccTouchBegan");
return true;
}
void Field::ccTouchMoved(cocos2d::CCTouch* touch, cocos2d::CCEvent* event)
{
CCLOG("In ccTouchMoved");
}
void Field::ccTouchEnded(cocos2d::CCTouch* touch, cocos2d::CCEvent* event)
{
CCLOG("In ccTouchEnded");
}
void Field::touchDelegateRetain()
{
this->retain();
}
void Field::touchDelegateRelease()
{
this->release();
}
我以前回答过这个问题
请转到查找详细信息。我想我已经在做所有这些了。让我仔细看一下你先前的回答。我确实发现,如果我甚至在我的图层上捕捉到触感,并通过我的向量运行,那么我就可以让它工作。我只是想让每个精灵自己负责。@你错过了CCDirector::sharedDirector->getTouchDispatcher->AddTargetedElegatethis,0,true;在一内。如果您没有在TouchDispatcher上注册精灵,您的精灵如何获得触摸?别忘了注销onExit@Jason注册过程就像有人说嗨,Jason,如果系统发生触摸事件,请把它传给我,不要给任何人。我有你上面提到的getTouchDispatcher线路onEnter@Jason您能为您的Field类发布创建函数的代码吗?您在哪里创建并使用了Field对象?并确保您设置的AddTargetedElegatethis,INT_MIN,true priority高于任何其他对象。@m.ding,我已经尝试了您给出的链接中提到的解决方案,但在我的情况下它没有用。@Rv15-您在细分什么?