如何在cocos2d x中屏蔽层之间的按键响应

主题 : [已解决]jsb如何屏蔽指定层之下所有层的触摸事件?
级别: 侠客
可可豆: 230 CB
威望: 231 点
在线时间: 326(时)
发自: Web Page
[已解决]jsb如何屏蔽指定层之下所有层的触摸事件?&&&
新弹出一个层,屏蔽这个新弹出层以下所有层(包括子级层)所有的触摸事件?[ 此帖被lishujun在 22:20重新编辑 ]
级别: 侠客
可可豆: 230 CB
威望: 231 点
在线时间: 326(时)
发自: Web Page
cc.registerTargetedDelegate(cc.MENU_HANDLER_PRIORITY-1, true, 弹出层对象);弹出层对象.onTouchBegan = function(){};试了这样,但是变成了所有的事件都不响应了,包括弹出层对象上面的层。然后试着把弹出层上面的层也:cc.registerTargetedDelegate(cc.MENU_HANDLER_PRIORITY-10, false, 弹出层对象上面的层对象);还是不行,就算这样设置优先级也没有用。
级别: 新手上路
可可豆: 264 CB
威望: 264 点
在线时间: 81(时)
发自: Web Page
不行就出绝招引擎这功能似乎不完美弹出上层后,把下层所有的button setEnabled(false)
级别: 骑士
UID: 327398
可可豆: 711 CB
威望: 646 点
在线时间: 152(时)
发自: Web Page
无脑顶我来帮你们涨KPI,哈哈哈哈。
大道至简,其民好径
级别: 新手上路
UID: 312544
可可豆: 82 CB
威望: 67 点
在线时间: 21(时)
发自: Web Page
var MaskLayer = cc.LayerColor.extend({&&&&_listener: null,&&&&_fixedPriority: 0,&&&&ctor: function () {&&&&&&&&this._super();&&&&&&&&this._fixedPriority = -129;&&&&},&&&&init: function () {&&&&&&&&var bRet =&&&&&&&&if (this._super()) {&&&&&&&&&&&&bRet =&&&&&&&&}&&&&&&&&return bR&&&&},&&&&onEnter: function () {&&&&&&&&this._super();&&&&&&&&this.setColor(cc.color.BLACK);&&&&&&&&this.setOpacity(160);&&&&&&&&var listener = cc.EventListener.create({&&&&&&&&&&&&event: cc.EventListener.TOUCH_ONE_BY_ONE,&&&&&&&&&&&&swallowTouches: true,&&&&&&&&&&&&onTouchBegan: function (touch, event) {&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&});&&&&&&&&cc.eventManager.addListener(listener, this);&&&&&&&&this._listener =&&&&},&&&&onExit: function () {&&&&&&&&cc.eventManager.removeListener(this._listener);&&&&&&&&this._super();&&&&}});MaskLayer.create = function () {&&&&var sg = new MaskLayer();&&&&if (sg && sg.init()) {&&&&&&&&&&&&}&&&&};
级别: 新手上路
可可豆: 36 CB
威望: 36 点
在线时间: 12(时)
发自: Web Page
cc.eventManager.pauseTarget(this, true);可以试试这个,下层的所有都暂停,然后你关闭你的最上层的时候cc.eventManager.resumeTarget(this._this,true);当然,这是在不同的layer中,同一个layer的话,我觉得需要setTouchEnabled
级别: 侠客
可可豆: 230 CB
威望: 231 点
在线时间: 326(时)
发自: Web Page
回 4楼(greaguo) 的帖子
试过了,你的方法可行,谢谢!
级别: 精灵王
可可豆: 4925 CB
威望: 4875 点
在线时间: 1605(时)
发自: Web Page
回 4楼(greaguo) 的帖子
非常感谢您的分享,解决了我遇到的一个难题。
关注本帖(如果有新回复会站内信通知您)
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 关注CVP公众号
扫一扫 浏览移动版Cocos2dx 关于层的屏蔽
当我们在用cocos2d-x引擎进行游戏设计时,很多时候有这样一种情况
我们需要创建一个层A,覆盖住层B,当我们在层A上进行触摸操作时,可能会对层B进行操作。所以我们需要做的是
当层A覆盖住层B时,屏蔽层B的touch事件
摘自某文章
layer屏蔽touch事件
此处有个问题,在popLayer层上触摸,你会发现底层的GameScene会响应。这就需要对popLayer进行touch事件处理屏蔽,不应该传递到底层。
在inin方法中注册touch事件监听
touchListener = EventListenerTouchOneByOne::create();
touchListener->onTouchBegan
= CC_CALLBACK_2(PopLayer::onTouchBegan, this);
touchListener->onTouchMoved
= CC_CALLBACK_2(PopLayer::onTouchMoved, this);
touchListener->onTouchEnded
= CC_CALLBACK_2(PopLayer::onTouchEnded, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener,
touchListener->setSwallowTouches(true);
空实现touch事件的监听函数
GameOverLayer::onTouchBegan(Touch* touch, Event* event)
GameOverLayer::onTouchMoved(Touch* touch, Event* event)
GameOverLayer::onTouchEnded(Touch* touch, Event* event)cocos2d-x防止按钮穿透怎么搞?_百度知道
cocos2d-x防止按钮穿透怎么搞?
我有更好的答案
你是要吞掉触摸消息吗?cctouchebegin返回值,和加入触摸的参数配合,可以做到。
采纳率:66%
提高当前层的优先级
为您推荐:
其他类似问题
cocos2d的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
键盘的按下或者松开事件都是可以单独检测的,目前代码
bool HelloWorld::init(){
auto listenerKeyboard = EventListenerKeyboard::create();
listenerKeyboard-&onKeyPressed = CC_CALLBACK_2(HelloWorld::onKeyPressed, this);
listenerKeyboard-&onKeyReleased = CC_CALLBACK_2(HelloWorld::onKeyReleased, this);
_eventDispatcher-&addEventListenerWithSceneGraphPriority(listenerKeyboard, this);
void HelloWorld::onKeyPressed(EventKeyboard::KeyCode keyCode, Event* event)
差不多这样一个情况,我放置了一个sprite,onKeyPressed里面实现的是按下方向键sprite会向一个方向移动10个单位
问题是如果按住方向键的话只有一次onKeyPressed能触发,如果让Sprite保持移动需要不停的按方向键
向各位大牛求教,有木有什么方法可以检测到按住或者实现类似的机理?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
一个简单地笨办法就是:
用一个 bool keyState 来记录这个键的按下状态,如果 true 代表按下否则代表没按下。
然后监听事件:按下的时候设置这个 keyState 为 true,弹起的时候设置为 false。那么也就是说如果为 true 的话,这个键就是处于按下状态。
最后,自己可以实现这么一整套机制,然后弄出一个全局的按键状态表。
至于 Cocos2dx 原生有没有实现方法,我不知道——因为我不是写 Cocos2dx 的啊。
希望能够抛砖引玉。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
你可以在update里面检测这个按键,如果按下就setposition,就能达到你的效果
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
写了一篇博文,专门解决这个问题。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
在按键的onKeyPressed事件里创建一个定时器按照时间间隔delta*speed来改变sprite的坐标。然后在onKeyReleased事件里注销这个定时器。
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。09:00:29 UTC
实现的效果:在当前scene中点击一个按钮的时候,弹出自定义的layer,点击这层layer是不会关闭的,点击的事件也不会传递到下面的scene上。
在这个layer上面加ccmenu,点击选项弹出新的对话框
求各位大神帮忙看一下,大概解释
网上找了很多教程没太看懂:
09:28:26 UTC
在弹出的自定义layer里,重写下面两个函数
virtual void registerWithTouchDispatcher(void);bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
void YourLayer::registerWithTouchDispatcher(){
// 这里的触摸优先级设置为 -128 这保证了,屏蔽下方的触摸
CCDirector::sharedDirector()-&getTouchDispatcher()-&addTargetedDelegate(this, -128, true);}bool YourLayer::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent){
当然YourLayer里要setTouchEnable(true);
这是2.X的方法
09:32:32 UTC
我就是用的2.x版本
弹出的自定义Layer应该放在哪里,是回调函数里面吗?
09:38:37 UTC
--- Begin quote from ____
在当前scene中点击一个按钮的时候
--- End quote
就在按钮的回调里create自定义Layer并add进来
13:12:25 UTC
求给个代码
01:15:24 UTC
大早上起来刷个存在感,继续努力
03:22:08 UTC
继续努力刷存在感

我要回帖

更多关于 cocos2d 层事件派发 的文章

 

随机推荐