前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为精灵添加触摸事件

为精灵添加触摸事件

作者头像
古时的风筝
发布2022-05-11 11:36:37
5770
发布2022-05-11 11:36:37
举报
文章被收录于专栏:古时的风筝

  这可能是游戏中最普通的场景了:点击某个精灵,触发此精灵的一系列动作。比如:精灵是一块石头,触摸石头后,让石头从A点移动到B点。

  由于精灵(CCSprite)类没有点击、触摸事件,所以要用其他的方法为精灵添加触摸事件。

  首先在场景的头文件中声明触摸所需的方法,主要包括ccTouchEnded、ccTouchBegan、registerWithTouchDispatcher。

如代码:

代码语言:javascript
复制
 virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
 virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); 
 void registerWithTouchDispatcher();

  然后在CPP文件中实现这3个方法:

代码语言:javascript
复制
//声明全局石头精灵类
CCSprite* stone;

///注册触摸代理支持
///其中第二个参数为触摸的响应等级 值越小 响应等级越高
void HelloWorld::registerWithTouchDispatcher()
{
	CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,-120,true);
}

//判断是否点击的范围为精灵 如果是则执行动作
void HelloWorld::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
	CCPoint touchPoint = convertTouchToNodeSpace(pTouch);
	if(stone->boundingBox().containsPoint(touchPoint))
	{
		CCMessageBox("点击了我","提示信息");
	}
}

//返回true表示支持触摸 返回false表示忽略 
//也可在此方法中判断是否要为某些其它元素适时忽略触摸事件
bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
	return true;
}

  最后在HelloWorld::init()方法中加上如下代码:this->setTouchEnabled(true);

  到此为止,可以实现精灵的触摸(点击)事件了,但是,我们如果在场景中存在其他的比如菜单、按钮之类的元素,会发现这些元素触摸(点击)无响应了。没错,我们只判断了当触摸范围在指定精灵上时,才触发动作。

  这个时候的解决办法:

  我们上边有这句代码:CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,-120,true);

  其中第二个参数为响应等级,数越小,等级越高,所以我们只要为其它的元素指定比-120小的整数,其它元素就会优先响应自身的触摸事件。

  例如:如下代码为cocos2d-x默认的退出按钮,这里设置了按钮的TouchPriority为-127,所以此按钮的响应等级高于精灵的-120的响应等级。

代码语言:javascript
复制
CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
			"CloseNormal.png",
			"CloseSelected.png",
			this,
			menu_selector(CatchBirdScene::menuCloseCallback));
CC_BREAK_IF(! pCloseItem);
CCSize size = CCDirector::sharedDirector()->getWinSize();
// Place the menu item bottom-right conner.
pCloseItem->setPosition(ccp(size.width - 20, 20));

// Create a menu with the "close" menu item, it's an auto release object.
CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
pMenu->setTouchPriority(-127);
pMenu->setPosition(CCPointZero);
CC_BREAK_IF(! pMenu);

// Add the menu to HelloWorld layer as a child layer.
this->addChild(pMenu, 1);

  到这里,基本可以实现一个场景的触摸响应了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2013-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档