cocos2dx菜单重叠按钮实现按层优先选择及透明过滤

本文介绍了在cocos2d-x 2.2.2版本中,解决菜单按钮重叠时按添加顺序选择的问题。作者在开发策略手游时遇到此困扰,发现引擎默认按按钮添加顺序响应点击。为了解决这个问题,作者研究了CCMenu源码并创建了LekoMenu类,使得可以自定义按钮优先级并过滤掉按钮透明部分的点击事件。LekoMenu类的声明和定义分别在LekoMenu.h和LekoMenu.cpp文件中给出。
摘要由CSDN通过智能技术生成

        众所周知,在cocos2d-x中,通过CCMenu(抱歉,笔者至今任然在用2.2.2的版本)创建的菜单,如果遇到数个按钮有重叠,当用户点击重叠区域(包括PNG图标中的透明部分)时,引擎默认是按照按钮的添加顺序来检索确定当前用户点击的按钮的,即在该位置第一个被添加到菜单中的的按钮为被点击按钮,即使用户点击到的是空白部分。</span>

        相信很多开发人员均对此很苦恼,笔者最近正在开发一款策略类的手机游戏,游戏界面中的建筑物的位置、层级是通过配置文件的形式进行配置的,当加载进入游戏时,读取配置文件,进而绘制界面。界面中的每一个建筑实际上都是一个按钮,当笔者测试时,发现经常会产生想点击按钮A,却点击到了按钮B,原因就是按钮B比按钮A先添加到了保存按钮列表的CCArray数组中,且绘制按钮B图标的空白部分遮挡住了按钮A;而且,很多时候,点击按钮的空白部分也会触发点击事件,个中原因,相信大家都知道,就不废话了。

        那么,能不能通过我们自己定义的优先级来有限出发指定按钮的点击事件呢?能不能过滤掉按钮中的透明部分呢?答案是肯定的,为此,笔者百度了很多相关案例,却都语焉不详,而且写的代码不带注释不说,还运行起来。没办法,只好自己去研究了一下CCMenu的源代码,并在其基础上派生出以下绘制菜单的类----LekoMenu。

        以下的代码是LekoMenu类的声明及定义:

LekoMenu.h:

#ifndef _LEKOMENU_H_
#define _LEKOMENU_H_
/************************************************************
  Copyright (C), 2014-2024, Leko Tech. Co., Ltd.
  FileName: Role.h
  Author: Hejh       Version : 1.0         Date: 2015-03-06
  Description: 
      建筑物菜单类,派生自CCMenu,用以绘制游戏中的建筑菜单。
	  扩展完成了通过Z轴层级觉得触摸优先级和过滤掉按钮图标中的透明部分功能。
  Function List: 
    1.bool init()
	    对象属性初始化函数
	2.bool ccTouchBegan(CCTouch* touch, CCEvent* event)
	    菜单触摸开始回调函数
	3.void ccTouchMoved(CCTouch* touch, CCEvent* event)
	    菜单触摸滑动回调函数
	4.CCMenuItem * itemForTouch(CCTouch *touch)
	    获取当前被点击的按钮
	5.bool isTransparent(CCMenuItem *, CCPoint)
	    判断对应按钮被点击区域是否为透明

============================================================
  History:         
      <author>    <time>     <version >     <desc>
	  
***********************************************************/
#include &
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值