cocos2dx中精灵点击事件处理的两种方式——Sprite和ImageView

14 篇文章 0 订阅
10 篇文章 0 订阅
1. ImageView 的方式:封装的Widget组件ImageVIew实现了类似按钮的监听事件,所以处理起来很方便直接
ImageView*		_pPokerImageView;

_pPokerImageView = ImageView::create(tmpStr);
		_pPokerImageView->setAnchorPoint(Vec2(0, 0));
		_pPokerImageView->setTouchEnabled(true);
		addChild(_pPokerImageView);
		_pPokerImageView->addTouchEventListener([this](Ref* pSender,Widget::TouchEventType type)
		{
			if (type == Widget::TouchEventType::ENDED)
			{
				PokerEventStatus tmpStatus = (getStatusValue() == SelectedStatus) ? NormalStatus : SelectedStatus;
				updateSelectedSigned(tmpStatus);

				if (getStatusValue() == SelectedStatus)
				{
					updateSelectedSigned(SelectedStatus);
				}
				else
				{
					updateSelectedSigned(NormalStatus);
				}
			}
2.Sprite的方式:需要手动实现监听事件代码,而且需要根据坐标,size去做精灵点击区域判断,写起来稍微复杂点,不过条条道路通罗马,多点方式,多种选择
</pre><pre name="code" class="cpp">EventListenerTouchOneByOne* _spriteListener;
Sprite*		_pPokerSprite;
/* 添加事件监听 */
			_spriteListener = EventListenerTouchOneByOne::create();
			
			_spriteListener->onTouchBegan = [this](Touch* touch, Event* event) -> bool {

				/* 获取事件所绑定的 target */
				auto target = event->getCurrentTarget();

				/* 获取当前点击点所在相对按钮的位置坐标 */
				Vec2 locationInNode = target->convertToNodeSpace(touch->getLocation());
				Size targetSize = target->getContentSize();
				Rect rect = Rect(_pPokerSprite->getPositionX(), _pPokerSprite->getPositionY(), COCOSNODE_WIDTH(_pPokerSprite), COCOSNODE_HEIGHT(_pPokerSprite));

				bool isClicked = rect.containsPoint(locationInNode);
				/* 点击范围判断 */
				if (isClicked)
				{
					PokerEventStatus tmpStatus = (getStatusValue() == SelectedStatus) ? NormalStatus : SelectedStatus;
					updateSelectedSigned(tmpStatus);

					if (getStatusValue() == SelectedStatus)
					{
						updateSelectedSigned(SelectedStatus);
					}
					else
					{
						updateSelectedSigned(NormalStatus);
					}
				}

				/* 此处一定要动态设置事件吞噬,否则层只会响应最后一张加入精灵的事件 */
				_spriteListener->setSwallowTouches(isClicked);

				return isClicked;
			};


在init时同时初始化精灵,加入层
 
 
_pPokerSprite = Sprite::createWithTexture(pChessTexture, tmpRect);
		_pPokerSprite->setAnchorPoint(Vec2(0, 0));
		addChild(_pPokerSprite);

然后在onEnter里加入监听:

void TBBullFightPoker::onEnter(void)
	{
		Node::onEnter();


		do 
		{
			CC_BREAK_IF(!_pPokerSprite);


			_eventDispatcher->addEventListenerWithSceneGraphPriority(_spriteListener, _pPokerSprite);


		} while (0);
	}
同样在onExit里删除监听:

void TBBullFightPoker::onExit(void)
	{
		_eventDispatcher->removeEventListener(_spriteListener);


		Node::onExit();
	}


  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值