cocos2dx 处理精灵触摸事件

要使精灵能够接收到触摸事件,无非要做三件事。
注册触摸事件;
接收触摸事件;
处理触摸事件。
下面就从这三点出发,来了解一下精灵如何响应触摸事件。
1.注册触摸事件
精灵类 SpriteNode 继承Sprite和CCTargetedTouchDelegate,并重写CCTargetedTouchDelegate的三个函数
ccTouchBegan,
ccTouchMoved,
ccTouchEnded
同时加入辅助函数rect()和containTouchPoint(CCTouch* touch)用于后面的判断。
SpriteNode.h文件:
class SpriteNode : public cocos2d::CCSprite , public cocos2d::CCTargetedTouchDelegate
{
public:
SpriteNode(void);
SpriteNode(char *img);
virtual ~SpriteNode(void);
cocos2d::CCRect rect();
virtual void onEnter();
virtual void onExit();
bool containTouchPoint( 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);
CREATE_FUNC(SpriteNode);
};
SpriteNode.cpp文件:
SpriteNode::SpriteNode(void){
}


SpriteNode::~SpriteNode(void){


}


1:事件注册
//这里需要再poker.cpp中添加具体的注册行为,onEnter和onExit函数分别是精灵创建和销毁时调用,因为可以在这两个函数中添加注册和销毁注册。
//CCNode进入场景时调用 
void SpriteNode::onEnter()
{
CCDirector* pDirector = CCDirector::sharedDirector();
pDirector->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
CCSprite::onEnter();
}


//CCNode退出场景时调用
void SpriteNode::onExit()
{
CCDirector* pDirector = CCDirector::sharedDirector();
pDirector->getTouchDispatcher()->removeDelegate(this);
CCSprite::onExit();



//以上,我们的触摸事件注册流程就完成了。
2.接收触摸事件
//接收触摸事件,实际上就是重写CCTargetedTouchDelegate的三个函数ccTouchBegan,ccTouchMoved,ccTouchEnded。
//在CCSprite内部使用convertTouchToNodeSpaceAR函数就可以将当前触摸点转化成精灵内部坐标系的点。
//判断触摸事件,并处理。
bool SpriteNode::ccTouchBegan(CCTouch *touch ,CCEvent *event)
{
int x = getPositionX();
int y = getPositionY();
if (containTouchPoint(touch))
{
setPosition(ccp(x , y + 30));
return true;
}


CCLog("Poker ccTouchBegan ");
return false;
}


void SpriteNode::ccTouchMoved(CCTouch *touch ,CCEvent *event)
{
CCLog("Poker ccTouchMoved ");
}


void SpriteNode::ccTouchEnded(CCTouch *touch ,CCEvent *event)
{
CCLog("Poker ccTouchEnded ");

//如此,接收流程已经完成,无意外的话,运行可以看到打印日志了。


3.处理触摸事件
//首先要获取当前精灵所在的矩形。
//也即是CCRect Poker::rect()需要做的事情。
//请注意,这里获取的方式的前提是,精灵使用系统默认的锚点,也即是精灵的正中央,如果改变过精灵的锚点(setAnchorPoint),那么就需要改变计算方法了。
CCRect SpriteNode::rect()
{
CCSize size = getTexture()->getContentSize();
return CCRectMake(-size.width / 2 ,-size.height / 2, size.width ,size.height);
}
//如果将当前精灵也看做一个坐标系,若精灵的长为100,宽为100,那么获取的矩形应该是x = -50 , y = -50 ,width = 100 ,height = 100
//其次,将触摸事件的点转化为当前精灵内部坐标系的点。
//(每一个继承自CCNode的结点都可以看做一个坐标系)
bool SpriteNode::containTouchPoint(CCTouch* touch)
{
return rect().containsPoint(convertTouchToNodeSpaceAR(touch));
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值