您的位置:首页 > 移动开发 > Cocos引擎

cocos2dx 处理精灵触摸事件

2014-05-16 19:12 246 查看
要使精灵能够接收到触摸事件,无非要做三件事。

注册触摸事件;

接收触摸事件;

处理触摸事件。

下面就从这三点出发,来了解一下精灵如何响应触摸事件。

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));

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: