众所周知,在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 &