zoukankan      html  css  js  c++  java
  • 关于cocos2dx中CCScrollView和CCMenu触摸优先级的解决方案

      最近使用cocos2d-x写一款跨平台的游戏,有这样一个功能需求,手机屏幕的某块区域可上下滚动,滚动区域的内容又是可点击的按钮。首先想到在CCScrollView里面添加CCMenu。恰好这个CCMenu是一张张图片,即CCItemImage,当图片布满整个滚动区域的时候,你会发现CCScrollView滑动不了了。原因很简单,是CCMenu的触摸事件吃掉了CCScrollView的触摸事件,因为CCMenu的默认触摸优先级是最高的。于是就有两套解决方案,一是改变CCScrollView的优先级,使之比CCMenu还高,CCMenu的默认优先级是-128,CCScrollView的默认优先级是0,cocos2d-x中数值越低,优先级越高。二是改变CCMenu的优先级,使之比CCScrollView低就行了。

      接下来如何改还是个问题,我们知道CCMenu和CCScrollView都是继承CCLayer的,CCLayer有一个虚方法registerWithTouchDispatcher,在此方法中用如下代码CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, kCCMenuTouchPriority, true);控制此Layer的优先级。而CCMenu和CCScrollView都复写了此方法。我们只需要在复写的方法中修改优先级就可以了。我们最好不要改动cocos2d的源码,所以我们可以写一个自己的menu来继承CCMenu,并复写registerWithTouchDispatcher方法,代码如下:

    1 class MyMenu : public CCMenu{
    2     virtual void registerWithTouchDispatcher(){
    3         //这里优先级设为1,只要比CCScrollView低就可以
    4         CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, 1, true);
    5     }
    6 }

    接下来用MyMenu替换原来的CCMenu就行了,这样它会先响应CCScrollView的滑动,再响应CCMenu的点击。

    (在不断的尝试中总结经验,以帮助后面的人更快的上路,http://zhs.guohe.in/)

  • 相关阅读:
    C# 使用PictureBox控件--点击切换图片
    C# 点击窗口任意位置拖动
    File类
    Path类
    ArrayList集合-[习题]--C#
    ArrayList集合-[长度问题]--C#
    ArrayList集合--C#
    c# winform 弹出确认消息框判断是否删除?
    C# 文件与目录的基本操作(System.IO)
    SQL Server事务处理
  • 原文地址:https://www.cnblogs.com/yeshanghai/p/2797111.html
Copyright © 2011-2022 走看看