123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- import AudioMgr from "../AudioMgr";
- import GameLog from "../GameLogMgr";
- /**
- * 这个是 封装了一些方法 ,例如 注册点击事件 销毁事件 等等
- */
- const {ccclass} = cc._decorator;
- @ccclass
- export default class LayerUI extends cc.Component {
- private _touchList: { [key: string]: { target, handler, callObj } } = {};
- private _touchEndList: { [key: string]: { target, handler, callObj } } = {}
- private _enableList: { [key: string]: { enabled: boolean, isGray: boolean } } = {};
- /**
- * 是否交互 需在target注册onTouch之后
- * @param target
- * @param v
- * @param isGray
- */
- protected setInteractable(target: cc.Node, v: boolean, isGray: boolean = true) {
- if (!target)
- return;
- let button: cc.Button = target.getComponent(cc.Button);
- if (button) {
- button.enableAutoGrayEffect = isGray;
- button.interactable = v;
- }
- this._enableList[target.name] = {enabled: v, isGray};
- }
- /**
- * 注册点击事件
- * @param target 点击对象
- * @param handler 触发事件
- * @param sound 播放声音名称
- * @param scale 缩放值
- * @param stopEvent
- */
- protected onTouch(target: cc.Node, handler: Function, sound: string = "click", scale = 0.9, stopEvent = true) {
- if (!target || !handler) {
- GameLog.error("target || handler为空-->", target, handler);
- return;
- }
- let targetName: string = target.name;
- if (this._touchList[targetName] && this._touchList[targetName].target == target) {
- GameLog.warn("重复设置-->", targetName);
- return;
- }
- //添加一个button 动画
- let button = target.getComponent(cc.Button);
- if (scale != 1) {
- if (!button) {
- button = target.addComponent(cc.Button);
- button.transition = cc.Button.Transition.SCALE;
- button.zoomScale = scale;
- }
- }
- let enabled = true;
- let isGray = true;
- if (this._enableList[target.name]) {
- enabled = this._enableList[target.name].enabled;
- isGray = this._enableList[target.name].isGray;
- }
- this.setInteractable(target, enabled, isGray);
- let callObj = this;
- let touchHandler = (event) => {
- let {enabled = true} = this._enableList[target.name] || {};
- if (!enabled) {
- return;
- }
- if (stopEvent) {
- event.stopPropagation();
- }
- if (sound && sound != "") {
- // if (sound === "check") {
- // sound = "piano/a" + Math.floor(Math.random() * (5 - 1) + 1);
- // }
- AudioMgr.play(sound).then();
- }
- handler.call(callObj, event);
- };
- target.on(cc.Node.EventType.TOUCH_START, touchHandler);
- this._touchList[targetName] = {target: target, handler: touchHandler, callObj: callObj};
- }
- protected onTouchEnd(target: cc.Node, handler: Function) {
- if (!target || !handler) {
- GameLog.error("target || handle为空 ondTouchEnd -->", target, handler)
- return
- }
- let targetName: string = target.name
- if (this._touchEndList[targetName] && this._touchEndList[targetName].target == target) {
- GameLog.warn("重复设置 --> onTouchEnd ", targetName)
- }
- let callObj = this;
- let touchHandler = (event) => {
- handler.call(callObj, event);
- };
- target.on(cc.Node.EventType.TOUCH_END, touchHandler);
- target.on(cc.Node.EventType.TOUCH_CANCEL, touchHandler);
- this._touchEndList[targetName] = {target: target, handler: touchHandler, callObj: callObj};
- }
- protected offTouchEnd(target: cc.Node) {
- if (!target) {
- GameLog.error("target 为空 ")
- return
- }
- let targetName: string = target.name
- if (this._touchEndList[targetName]) {
- let handler = this._touchEndList[targetName].handler
- target.off(cc.Node.EventType.TOUCH_END, handler)
- target.off(cc.Node.EventType.TOUCH_CANCEL, handler)
- delete this._touchEndList[targetName]
- }
- }
- /**
- * 移除对象点击事件
- * @param target
- */
- protected offTouch(target: cc.Node) {
- if (!target) {
- GameLog.error("target 为空");
- return
- }
- let targetName: string = target.name;
- if (this._touchList[targetName]) {
- let touchHandler = this._touchList[targetName].handler;
- target.off(cc.Node.EventType.TOUCH_START, touchHandler);
- delete this._touchList[targetName]
- }
- delete this._enableList[targetName]
- }
- protected clear() {
- for (let key in this._touchList) {
- this.offTouch(this._touchList[key].target)
- }
- }
- onDestroy() {
- this.clear()
- }
- /**
- *
- * @param path 路径或者名字
- */
- protected getNode(path: string): cc.Node {
- let node: cc.Node = null;
- if (path == "" || !path)
- return null;
- if (path.indexOf("/") != -1) {
- node = cc.find(path, this.node);
- } else {
- node = this.node.getChildByName(path);
- }
- if (!node) {
- GameLog.warn("未找到该节点 path=", path);
- }
- return node;
- }
- }
|