[cocos2d]如何实现模态对话框

简介: 问题描述:      在显示一些类似于模态对话框的窗口时,我们可能需要屏蔽touch事件,不让在弹出框下面的界面响应touch事件。      而弹出框上某些区域,或者按钮可以响应touch事件。 解决方案:       1> 给弹出框添加带吞噬能力的touch代理功能。 [[CCTouchDispatcher sharedDispatcher] addTargetedDe
问题描述:
     在显示一些类似于模态对话框的窗口时,我们可能需要屏蔽touch事件,不让在弹出框下面的界面响应touch事件。

     而弹出框上某些区域,或者按钮可以响应touch事件。

解决方案:

      1> 给弹出框添加带吞噬能力的touch代理功能。

[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:kCCMenuTouchPriority + 1 swallowsTouches:YES];

     

注意:
     a>:代理是会被retain的。所以使用完后务必要移出。
[[CCTouchDispatcher sharedDispatcher] removeDelegate:self];
     b>:priority其值越小,越是会优先响应touch事件。
               这里使用kCCMenuTouchPriority + 1 既该界面的响应优先级比菜单按钮优先级低。如果你希望又最高的优先级最好使用INT32_MIN+1

     2> 实现代理方法ccTouchBegan:返回YES表示吞噬touch事件,则其他代理都不收到该事件了。
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    /**override to what you like*/
    return YES;
}
     如果需要在某个区域内可以响应touch事件,则可以添加如下代码
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
     CGRect aRect = CGRectMake(50, 50, 50, 50);
    CGPoint touchpoint = [touch locationInView:[touch view]];
    touchpoint = [[CCDirectorsharedDirector] convertToGL: touchpoint];
    return !CGRectContainsPoint(aRect, touchpoint);
}
     如果你希望除了菜单按钮以外的区域都不响应touch事件你也可以这样写:
  - (BOOL)ccTouchBegan:(UITouch *)touch 
  withEvent:(UIEvent *)event
{
CCMenu *menu = 
(CCMenu *)[selfgetChildByTag:kMenuItemLayerTag];
if ([menu itemForTouch:touch])
{
returnNO;
}
    
returnYES;
}
     注意:其中itemForTouch:方法的使用有点技巧,提示这个方法是ccmenu的私有方法

     当然除了使用这种暴力方式以外,也可以用优先级来实现,如上面提到的priority:kCCMenuTouchPriority + 1。这种方式就需要大家能良好的执行约定。同时用优先级来控制有个问题,如果与下层的按钮重叠的时候,是那个执行那?
目录
相关文章
|
Java 程序员
Java 异常处理与正则表达式详解,实例演练及最佳实践
在 Java 代码执行期间,可能会发生各种错误,包括程序员编码错误、用户输入错误以及其他不可预料的状况。 当错误发生时,Java 通常会停止并生成错误消息,这个过程称为抛出异常。 try...catch 语句 try 语句允许您定义一段代码块,并在其中测试是否发生错误。 catch 语句允许您定义一段代码块,当 try 块中发生错误时执行该代码块。 try 和 catch 关键字成对使用,语法如下:
235 0
|
域名解析 应用服务中间件 Linux
【服务器】使用域名解析服务器的IP地址并配置SSL证书
【服务器】使用域名解析服务器的IP地址并配置SSL证书
2411 0
|
Python
Python中的异步编程:理解并使用asyncio和aiohttp
【8月更文挑战第24天】在Python中,异步编程是一个强大的工具,它可以帮助我们编写出高性能的网络应用。本文将介绍Python的异步编程库asyncio和aiohttp,并通过示例代码展示如何使用它们来创建一个简单的HTTP服务器。我们将看到,通过使用这些库,我们可以在不阻塞主线程的情况下处理大量的并发请求。
230 1
|
人工智能 API C#
SimpleRAG:基于WPF与Semantic Kernel实现的一个简单的RAG应用
SimpleRAG是一款基于WPF与Semantic Kernel的RAG应用,支持OpenAI兼容的AI聊天与文本嵌入模型,演示了RAG技术在提升回答质量上的作用。可通过GitHub获取源码,配置所需模型API密钥后,在VS2022中以.NET 8环境编译运行。应用内置Sqlite数据库存储向量数据,便于离线使用与自定义扩展。如感兴趣,请支持并反馈使用体验。
224 1
SimpleRAG:基于WPF与Semantic Kernel实现的一个简单的RAG应用
|
数据可视化 数据挖掘 定位技术
Python中利用Bokeh创建动态数据可视化
【10月更文挑战第14天】本文介绍了如何使用 Bokeh 库在 Python 中创建动态数据可视化。Bokeh 是一个强大的开源可视化工具,支持交互式图表和大规模数据集的可视化。文章从安装 Bokeh 开始,逐步讲解了如何创建动态折线图,并添加了交互式控件如按钮、滑块和下拉菜单,以实现数据更新频率的调节和颜色选择。通过这些示例,读者可以掌握 Bokeh 的基本用法,进一步探索其丰富功能,创建更具吸引力和实用性的动态数据可视化。
|
安全 Ubuntu 网络协议
在Linux中,如何配置DHCP服务器?
在Linux中,如何配置DHCP服务器?
|
Linux 知识图谱 Docker
知识图谱(Knowledge Graph)- Neo4j 5.10.0 Docker 安装
知识图谱(Knowledge Graph)- Neo4j 5.10.0 Docker 安装
393 0
|
JavaScript
JS利用函数求任意两个数之间的累加和
JS利用函数求任意两个数之间的累加和
JS利用函数求任意两个数之间的累加和
|
Java 应用服务中间件 Maven
从零玩转之SpringBoot3-核心原理1
从零玩转之SpringBoot3-核心原理
503 0
|
JSON 前端开发 安全
CORS跨域请求出现问题
1、问题描述 Access to XMLHttpRequest at ‘http://localhost:8080/user/register’ from origin ‘http://localhost:8002’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: The value of the ‘Access-Control-Allow-Origin’ header in the response must not be the wildcar