Explorar o código

Merge branch 'master' of http://git.mokasz.com/zouyong/mk_framework into master

fengcong %!s(int64=5) %!d(string=hai) anos
pai
achega
f99b3d67e7

+ 64 - 0
mk_framework/assets/script/game/component/TouchHelper.ts

@@ -0,0 +1,64 @@
+
+// import { _decorator, Component, Vec2, SystemEventType, EventTouch, UITransform, EventHandler, Vec3, v3 } from 'cc';
+const { ccclass, property } = cc._decorator;
+/**
+ * @description 触摸辅助器,支持多边形区域点击检测,并且添加ceator不带有的tap事件
+ * @author Soonsky
+ */
+@ccclass//('TouchHelper')
+export class TouchHelper extends cc.Component {
+    @property({ tooltip: "是否可以点击" }) canTouch: boolean = true;
+    @property({ tooltip: "在多边形范围内产生点击", type: cc.Component.EventHandler }) onInPolygon: cc.Component.EventHandler = new cc.Component.EventHandler();
+    @property({ tooltip: "在多边形范围外产生点击", type: cc.Component.EventHandler }) onOutPolygon: cc.Component.EventHandler = new cc.Component.EventHandler();
+    @property({ tooltip: "在节点范围内产生点击", type: cc.Component.EventHandler }) onTouchTap: cc.Component.EventHandler = new cc.Component.EventHandler();
+    @property({ tooltip: "是否与需要多边形检查" }) needPolygon: boolean = false;
+    @property({ type: [cc.Vec2], tooltip: "多边形定点位置信息(局部坐标,至少3个点)" }) points: Array<cc.Vec2> = [];
+    // @property({ tooltip: "点击在多边形区域内时是否阻止事件冒泡" }) stopPropagation = false;// 无效且报错
+
+    private isMoved = false;
+    start() {
+        this.node.on(cc.Node.EventType.TOUCH_END, this.onTouchEnd, this);
+        this.node.on(cc.Node.EventType.TOUCH_CANCEL, this.onTouchCancel, this);
+        this.node.on(cc.Node.EventType.TOUCH_MOVE, this.onTouchMove, this);
+    }
+
+    private onTouchEnd(e: cc.Touch): void {
+        if (this.canTouch && this.needPolygon && this.points.length >= 3) {
+            let touchPoint = e.getLocation();
+            let localPoint = this.node.convertToNodeSpaceAR(new cc.Vec2(touchPoint.x, touchPoint.y));
+            let result = this.pointInPoly(localPoint, this.points);
+            if (!this.isMoved) {
+                if (result) {
+                    // if (this.stopPropagation) {
+                    //     e.propagationStopped = true;
+                    // }
+                    this.canTouch && this.onInPolygon && this.onInPolygon.emit([]);
+                } else {
+                    this.canTouch && this.onOutPolygon && this.onOutPolygon.emit([]);
+                }
+            }
+        }
+        if (this.canTouch) {
+            if (!this.isMoved) {
+                this.canTouch && this.onTouchTap && this.onTouchTap.emit([]);
+            }
+        }
+        this.isMoved = false;
+    }
+    private onTouchMove(e: cc.Event.EventTouch) {
+        if (e.getTouches().length > 1) { this.isMoved = true; return }// getAllTouches
+        this.isMoved = cc.Vec2.distance(e.getStartLocation(), e.getLocation()) > 20;
+    }
+    private onTouchCancel(e: cc.Event.EventTouch) {
+        this.isMoved = false;
+    }
+
+    private pointInPoly(point: cc.Vec2 | cc.Vec3, polyPoints: cc.Vec2[]) {
+        for (var c = false, i = -1, l = polyPoints.length, j = l - 1; ++i < l; j = i)
+            ((polyPoints[i].y <= point.y && point.y < polyPoints[j].y) || (polyPoints[j].y <= point.y && point.y < polyPoints[i].y))
+                && (point.x < (polyPoints[j].x - polyPoints[i].x) * (point.y - polyPoints[i].y) / (polyPoints[j].y - polyPoints[i].y) + polyPoints[i].x)
+                && (c = !c);
+        return c;
+    }
+}
+

+ 9 - 0
mk_framework/assets/script/game/component/TouchHelper.ts.meta

@@ -0,0 +1,9 @@
+{
+  "ver": "1.0.8",
+  "uuid": "207f522f-4706-4619-b3ae-7461786df938",
+  "isPlugin": false,
+  "loadPluginInWeb": true,
+  "loadPluginInNative": true,
+  "loadPluginInEditor": false,
+  "subMetas": {}
+}

+ 5 - 5
mk_framework/assets/script/game/component/tween/UITween.ts

@@ -36,15 +36,15 @@ export class TweenData {
     @property({ tooltip: "是否为差值" })
     public isOffset: boolean = false;
     @property({ tooltip: "当缓动动作完成时触发", type: cc.Component.EventHandler })
-    public onComplete: cc.Component.EventHandler = null;
+    public onComplete: cc.Component.EventHandler = new cc.Component.EventHandler();
     @property({ tooltip: "当缓动动作启动时触发", type: cc.Component.EventHandler })
-    public onStart: cc.Component.EventHandler = null;
+    public onStart: cc.Component.EventHandler = new cc.Component.EventHandler();
     @property({ tooltip: "当缓动动作更新时触发", type: cc.Component.EventHandler })
-    public onUpdate: cc.Component.EventHandler = null;
+    public onUpdate: cc.Component.EventHandler = new cc.Component.EventHandler();
 }
 /**
  * 缓动组件,目前只支持节点的三个基础属性
- * 目前改动类后会导致编辑器内的属性记录丢失,请不要使用
+ * 目前改动类后会导致编辑器内的属性记录丢失,请不要使用 
  * @author 
  */
 @ccclass//('UITween')
@@ -64,7 +64,7 @@ export class UITween extends cc.Component {
     @property({ tooltip: "执行次数,为0则一直重复执行" })
     public repeat: number = 1;
     @property({ tooltip: "单次缓动序列执行完毕时触发", type: cc.Component.EventHandler })
-    public onOneRepeatComplete: cc.Component.EventHandler = null;
+    public onOneRepeatComplete: cc.Component.EventHandler = new cc.Component.EventHandler();
     @property({ tooltip: "是否在缓动组件运行时自动播放缓动动画" })
     public playOnLoad: boolean = false;
     @property({ displayName: "编辑器预览" })

+ 8 - 16
mk_framework/assets/script/mk/utils/FileUtil.ts

@@ -7,7 +7,6 @@ export default class FileUtil {
 
     /**
      * 打开文件选择器
-     *
      * @param {string} accept
      * @param {(file: File) => void} callback
      * @memberof FileUtil
@@ -15,7 +14,6 @@ export default class FileUtil {
     public openLocalFile(accept: string, callback: (file: File) => void) {
         let inputEl: HTMLInputElement = <HTMLInputElement>document.getElementById('file_input');
         if (!inputEl) {
-            // console.log('xxxxxx createElement input');
             inputEl = document.createElement('input');
             inputEl.id = 'file_input';
             inputEl.setAttribute('id', 'file_input');
@@ -30,11 +28,7 @@ export default class FileUtil {
         accept = accept || ".*";
         inputEl.setAttribute('accept', accept);
 
-        // inputEl.addEventListener('change', (event) => {
-        //     console.log('xxx onchange1', event, inputEl.value);
-        // });
         inputEl.onchange = (event) => {
-            // console.log('xxx onchange2', event, inputEl.files);
             let files = inputEl.files
             if (files && files.length > 0) {
                 var file = files[0];
@@ -46,18 +40,16 @@ export default class FileUtil {
 
     /**
      * 读取本地文件数据
-     *
      * @param {File} file
      * @param {READ_FILE_TYPE} readType
      * @param {((result: string | ArrayBuffer) => void)} callback
      * @memberof FileUtil
      */
-     public readLocalFile(file: File, readType: READ_FILE_TYPE, callback: (result: string | ArrayBuffer) => void) {
+    public readLocalFile(file: File, readType: READ_FILE_TYPE, callback: (result: string | ArrayBuffer) => void) {
         var reader = new FileReader();
         reader.onload = function (event) {
             if (callback) {
                 if (reader.readyState == FileReader.DONE) {
-                    // console.log('xxx FileReader', event, reader.result);
                     callback(reader.result);
                 } else {
                     callback(null);
@@ -69,8 +61,7 @@ export default class FileUtil {
                 reader.readAsDataURL(file);
                 break;
             case READ_FILE_TYPE.TEXT:
-                reader.readAsText(file);   //作为字符串读出
-                //reader.readAsText(file,'gb2312');   //默认是用utf-8格式输出的,想指定输出格式就再添加一个参数,像txt的ANSI格式只能用国标才能显示出来
+                reader.readAsText(file);// 作为字符串读出
                 break;
             case READ_FILE_TYPE.BINARY:
                 reader.readAsBinaryString(file);
@@ -83,12 +74,11 @@ export default class FileUtil {
 
     /**
      * 保存数据到本地
-     *
-     * @param {*} fileNameToSaveAs  要保存的文件名
-     * @param {*} textToWrite       要保存的文件内容
+     * @param {*} fileNameToSaveAs 要保存的文件名
+     * @param {*} textToWrite 要保存的文件内容
      * @memberof FileUtil
      */
-     public saveForBrowser(fileNameToSaveAs, textToWrite,) {
+    public saveForBrowser(fileNameToSaveAs: any, textToWrite: any) {
         if (cc.sys.isBrowser) {
             console.log("浏览器");
             let textFileAsBlob = new Blob([textToWrite], { type: 'application/json' });
@@ -113,7 +103,9 @@ export default class FileUtil {
     }
 
 }
-// 读取文件方式
+/**
+ * 读取文件方式
+ */
 enum READ_FILE_TYPE {
     DATA_URL,// readAsDataURL, base64
     TEXT,// readAsText