cocos2dx中精灵点击事件处理的两种方式——Sprite和ImageView
2016-04-13 09:57
507 查看
1. ImageView 的方式:封装的Widget组件ImageVIew实现了类似按钮的监听事件,所以处理起来很方便直接
在init时同时初始化精灵,加入层
然后在onEnter里加入监听:
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(); }
相关文章推荐
- Mac下cocoapods使用说明(2016版)
- Cocos2.2.6创建项目cd tools/project-creator/
- Cocos2d 控件:创建一个label
- Cocos2d 创建一个精灵
- Cocos2d 导入CocoStudio生成的csb文件
- Cocos2d 控件:创建一个按钮
- Cocos2d 图片拉伸不变形的9妹
- Cocos2d 播放音乐
- Cocos2d触摸:多点触摸
- Cocos2d触摸:单点触摸
- Cocos2d动作: 动作监听
- Cocos2d动作: 创建组合动作对象
- Cocos2d动作: 创建重复性动作
- Cocos2d动作:贝塞尔曲线运动
- Cocos2d动作:移动、变形、闪烁
- cocos2dx-lua的spine局部换装
- Cocos2dx 报错:Error: Program "make" is not found in PATH
- Cocos2dx:用Photoshop自动创建CocosStudio.csd文件——cocos3.10
- Cocos2dx 3.x 新建项目编译很慢的解决方案
- 半年收入超2亿RMB 独立游戏开发者的艰苦创业路