注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

熊猫正正的博客

熊猫正正的天空

 
 
 

日志

 
 

在 cocos2d 中判断互相重叠的 CCMenuItem  

2013-08-16 23:57:44|  分类: ios游戏开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

cocos2d 提供的 CCMenu、CCMenuItem、CCMenuItemImage、CCMenuItemSprite 等类是构造菜单和按钮的常用工具类。不过 cocos2d 的 CCMenu 在判断互相重叠的 CCMenuItem 时存在一点小问题。

假设有三个按钮,如下图所示:

 

当玩家点击时,如果点击位置在 PLAY 按钮和另外两个按钮重叠的地方,那么总是 PLAY 按钮生效。出现这种情况的原因是 CCMenu 按照 CCMenuItem 添加的顺序来依次判断,PLAY 是第一个添加到 CCMenu 中的 CCMenuItem 对象,所以会忽略掉重叠区域的其他按钮。

要解决这个问题,需要从 CCMenu 派生一个继承类 CCMenuEx:

CCMenuEx.h

#import "cocos2d.h"

@interface CCMenuEx : CCMenu
{
}

@end

CCMenuEx.m

#import "CCMenuEx.h"

@implementation CCMenuEx

-(CCMenuItem *) itemForTouch: (UITouch *) touch
{
    CGPoint touchLocation = [touch locationInView: [touch view]];
    touchLocation = [[CCDirector sharedDirector] convertToGL: touchLocation];

    CCMenuItem* item = nil;
    CCMenuItem* hitItem = nil;
    CCARRAY_FOREACH(children_, item){
        if ( [item visible] && [item isEnabled] ) {
            if (CGRectContainsPoint([item rect], touchLocation)) {
                if (hitItem) {
                    if ([hitItem zOrder] < item.zOrder) {
                        hitItem = item;
                    }
                } else {
                    hitItem = item;
                }
            }
        }
    }
    return hitItem;
}

@end

最后在应用程序中将构造 CCMenu 对象的代码改为使用 CCMenuEx 即可。

CCMenuEx 不但判断点击位置是否在按钮上,还会判断按钮的叠放次序。在多个按钮重叠区域点击时,最上面的按钮会被触发。

  评论这张
 
阅读(70)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017