cocos2dx 给精灵实现一个触摸事件方法:
让精灵类继承CCsprite和CCTargetedTouchDelegate两个类,然后实现CCTargetedTouchDelegate的几个虚函数如下:
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
// optional
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
给精灵增加触摸事件的方式:
1.在精灵类初始化的时候调用
2.在进入场景的时候调用,如果在进入场景的时候调用,则需要精灵类需要实现两外的两个方法
virtual void onEnter();//进入时注册
virtual void onExit();//出场景时删除
注册方法:
void SelfCard::onEnter()
{
CCLog("sprite enter scene");
CCSprite::onEnter();
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,-127,true);
//这一步是关键
}
现在问题来了 通过以上方法加入到触摸事件的时候,不知道是不是全局的触摸事件,只要触摸然后精灵类就有会有反应,按我的理解就是我在精灵类上注册了触摸事件,那我触摸这个精灵的时候,才会有触摸相应的,但是实际中不是,所以我的理解就是 CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,-127,true);
这个方法是所有的触摸事件的集合,只要有触摸的事件,就会相应所有被注册的事件,所以在每个触摸的事件里面自己要单独处理有没有被触摸到:
/*触摸开始*/
bool SelfCard::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent){
CCPoint point=pTouch->getLocation();
if(!isTouch(point))
return false;
CCSprite *prite = CCSprite::create("dong.png");
prite->setPosition(ccp(this->getPositionX(),this->getPositionY()+50));
this->getParent()->addChild(prite,0,1001);
this->setVisible(false);
return true;
}
/*判断是否被触摸到*/
bool SelfCard::isTouch(CCPoint point)
{
CCPoint nodePoint=this->convertToNodeSpace(point);
CCSize size=this->getContentSize();
if(nodePoint.x>size.width ||nodePoint.x<0 ||nodePoint.y>size.height ||nodePoint.y<0 )
return false;
return true;
}