美文网首页
cocoscreator+js客户端需要掌握的一些基础内容

cocoscreator+js客户端需要掌握的一些基础内容

作者: 夏洛伊de风 | 来源:发表于2019-05-15 00:30 被阅读0次

    遇到一个新的引擎,一定需要掌握以下内容:
    创建基础对象;
    获得基础对象;
    设置基础对象;
    点击坐标区域的判断;
    事件传递和派发接收;
    创建数据结构;
    创建时间对象;
    服务器请求和回调的数据解析;
    打印调试语句;
    动作序列调用;
    存储数据到本地;
    下面总结一下cocos+js的内容。

    1.普通文本对象
    在cocosctrator中先拖拽创建一个普通文本对象strText,在其父layer节点对应的js文件中,进行如下的声明:

    properties: {
        strText:{
            default: null,
            type:cc.Node,
        },
    }
    

    这样,在这个js文件内,设置其内容的代码如下:

    this.strText.getComponent(cc.Label).string = str;
    

    2.普通静态图片对象
    在cocosctrator中先拖拽创建一个普通图片对象fangZuoBi_bg,没有必要在properties进行声明(也可以声明,那么调用就用this.name),不声明的话,在js文件内的调用方式如下:

    this.node.getChildByName("fangZuoBi_bg");
    

    3.普通按钮对象
    在cocosctrator中先拖拽创建一个普通按钮对象lahei_btn,在这个引擎中按钮设置方式有多种类型,有多个图片去表示按钮点击前后效果的,也有单张图表现的,具体方式请看cocoscreator的api文档。这里找个简单的例子,在sprite属性设置好单张图片之后,为button属性设置点击事件的效果onClickCancle,在js文件内填写该函数。

    4.普通滑动列表
    在cocosctrator中先拖拽创建一个普通滑动列表对象对象m_gameListScrollView,设置好方向属性。首先在代码中声明:

    properties: {
        m_gameListScrollView:{
            default:null,
            type:cc.ScrollView,
        },
    },
    

    然后去设置滑动列表的内容和滑动列表的宽高:

    addGameList:function()
    {
        var gameList = require('HallControl').getInstance().getGameList();
        var nListSize = gameList.length;
        var columnCount = 2;
        var itemW = 280;
        var nButtonX = -250;
        var nButtonY = -130;
        var offsetX = 300 * 2 / columnCount;
        var offsetY = 260 * (columnCount - 1);
        var totalWidth = 0;
        var scrollViewSize =  this.m_gameListScrollView.node.getContentSize();
        for(var i=1;i<=nListSize;i++)
        {
            var buttonNode = new cc.Node('buttonNode');
            var  ccBtutton = buttonNode.addComponent(cc.CCButton);
            var gameInfo = gameList[i-1];
            ccBtutton.setCCButton('hallRes/gameicon/'+gameInfo.m_sEn,null,this.onClickButton.bind(this));
            ccBtutton.setObjectData(gameInfo);
            this.m_gameListScrollView.content.addChild(buttonNode);
            
            if(columnCount == 1)
            {
               offsetY = scrollViewSize.height / 2 - itemW/ 2;
            };
           
            buttonNode.x=nButtonX+ (Math.floor((i - 1) / columnCount) * offsetX - 20);
            buttonNode.y=nButtonY+(offsetY - (i + 1) % columnCount * offsetY);
            totalWidth = buttonNode.getPositionX()*2 +itemW
        } 
        this.m_gameListScrollView.content.width = totalWidth;
    
    },
    

    5.点击坐标区域
    首先在onload中添加监听的事件,cocoscreator中集成了不少的Node.EventType,可以去查询api了解更多内容。
    在事件的回调中,获得这个点击到的坐标,然后在目标区域上通过convertToNodeSpace函数转化坐标系,最后通过rectContainsPoint判断是否存在这个区域内。
    这里范例代码使用了fangZuoBi_bg这块图片上的内容,实际上如果是活的整个的layer的坐标,直接使用this.node.convertToNodeSpace即可。

    onLoad:function(){
        this.node.on(cc.Node.EventType.TOUCH_START, this.onTouch, this);
    },
    
    onTouch:function(event){
        var poistion = event.touch.getLocation();
        var locationInNode = this.node.getChildByName("fangZuoBi_bg").convertToNodeSpace(poistion);    
        var s = this.node.getChildByName("fangZuoBi_bg").getContentSize();
        var rect = cc.rect(0, 0, s.width, s.height);
        if (cc.rectContainsPoint(rect, locationInNode)) {
            
        }
        else{         
            this.node.active = false;
        }
    },
    

    6.事件派发
    cocoscreator有两种事件派发的方法,一种是emit另外一种是dispatchEvent,后者可以做事件传递,尽量还是使用后者。
    事件使用on来监听,off关闭监听。

    onLoad: function () {
    this.node.on('mousedown', function ( event ) {
        console.log('Hello!');
    });
    
    _sayHello: function () {
        console.log('Hello World');
    },
      
    onEnable: function () {
        this.node.on('mousedown', this._sayHello, this);
    },
    
    start: function () {
        this.node.emit('mousedown', {
            msg: 'Hello, this is Cocos Creator',
        });
    },
    
    this.node.dispatchEvent( new cc.Event.EventCustom('mousedown', true) );
    

    7.表的结构
    使用new Array()创建一个数组,然后调用push去插入一个数据

    var stEat = new Array();
    this.m_stSceneData = {}
    this.m_stSceneData.cbCurrentCard = 0
    stEat.push(this.m_stSceneData.cbCurrentCard)
    pEatCase.push(stEat);
    

    也可以创建一个{}然后用字母表示来给这个表添加元素。

    8.时间调用
    首先使用 cc.director.getScheduler() 来获取系统定时器,然后通过unscheduleCallbackForTarget和scheduleCallbackForTarget分别对计时器进行取消和定义

    startTimer:function(overTimeFunc, nDowntime){
        var scheduler = cc.director.getScheduler();
        scheduler.unscheduleCallbackForTarget(this, this.m_timerUpdate)
        var timeLabel = this.node.getChildByName("gameBg").getChildByName("diceNode").getChildByName("timeLabel");
        timeLabel.setLocalZOrder(10);
        timeLabel.getComponent(cc.Label).string = "";
        timeLabel.active = true;
        var strLeftTime = "";
        var update = function(){
            if(nDowntime < 0){
                timeLabel.getComponent(cc.Label).string = "";
                if (overTimeFunc){
                    overTimeFunc();
                }
                scheduler.unscheduleCallbackForTarget(this, update)
                return;
            }
    
            strLeftTime = strLeftTime = nDowntime;
            if(nDowntime < 10){ 
                strLeftTime = "0" + strLeftTime;
            }
            timeLabel.getComponent(cc.Label).string = strLeftTime;
            nDowntime = nDowntime - 1;           
        };
        
        this.m_timerUpdate = update;
        scheduler.scheduleCallbackForTarget(this, update, 1, cc.macro.REPEAT_FOREVER, 0, false);
    },
    

    9.服务器请求和回调数据的解析
    一般短连接的使用方法:使用 new XMLHttpRequest() 来创建一个连接对象,也可以通过 cc.loader.getXMLHttpRequest() 来创建,两者效果一致。
    有关下面代码中几个接口的描述请看https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest 这个MSDN的文档。
    onreadystatechange当readyState属性改变时会调用它。
    readyState请求的5种状态4是指DONE (请求完成) 整个请求过程已经完毕。
    status该请求的响应状态码 (例如, 状态码200 表示一个成功的请求).只读.
    open初始化一个请求。
    setRequestHeader给指定的HTTP请求头赋值.在这之前,你必须确认已经调用 open() 方法打开了一个url.
    timeout是一个无符号长整型数,代表着一个请求在被自动终止前所消耗的毫秒数
    send发送请求.
    我检查了代码,只有微信支付和获得签名这两处代码调用了GET请求,其他都使用封装过后的POST。post和get的区别可以参考这个文章https://www.cnblogs.com/logsharing/p/8448446.html

    var WebRequest = cc.Class({
        _callBack: null,
        getData: function (url, data, callback, post) {
            this._callBack = callback;
            var self = this;
            var xhr = cc.loader.getXMLHttpRequest();
            // Simple events
            ['loadstart', 'abort', 'error', 'load', 'loadend', 'timeout'].forEach(function (eventname) {
                xhr["on" + eventname] = function () {
                    if (eventname == 'abort' || eventname == 'error' || eventname == 'timeout') {
                        if (self._callBack != null) {
                            self._callBack(false, "");
                        }
                    }
                };
            });
    
            // Special event
            xhr.onreadystatechange = function () {
                if (xhr.readyState === 4 && (xhr.status >= 200 && xhr.status < 300)) {
                    if (self._callBack != null) {
                        // var XmlToJson = require('XmlToJson');
                        // var xmlToJson = new  XmlToJson();
                        // var jsonData = JSON.stringify(xmlToJson.parse(xhr.responseText));                    
                        self._callBack(true, xhr.response);                    
                    }
                }
            };
            xhr.timeout = 5000;//5 seconds for timeout
            if (post == null || post == false) {
                xhr.open("GET", url + data, true);
                if (cc.sys.isNative) {
                    xhr.setRequestHeader("Accept-Encoding", "gzip,deflate");
                }
                xhr.send();
            }
            else {
                xhr.open("POST", url);
                //set Content-type "text/plain" to post ArrayBuffer or ArrayBufferView
                // xhr.setRequestHeader("Content-Type","text/plain");
                xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                // Uint8Array is an ArrayBufferView
                //xhr.send(new Uint8Array([1,2,3,4,5]));
                xhr.send(data);
            }
    
        },
    });
    

    有关数据解析:下面是我们的xml转json的办法和具体代码解析方式。

     var onResponse = function(success, data){
        if(success){
            var XmlToJson = require('XmlToJson');           
            var xmlToJson = new  XmlToJson();       
            var jsonData = JSON.stringify(xmlToJson.parse(data));  
            var jsonObject = JSON.parse(jsonData);
    
            var root = jsonObject;
    
            var property = {};
            property.RetCode = root.retcode 
            vBeReportList.push(property);
        }
        else{
            console.log("HallWebRequest.requestCheatReport load xml data fail!");
            return;
        }
    }
    
    var XmlToJson=cc.Class({
        // Changes XML to JSON
        parseXmlToJson:function(xmlStr) {
            // Create the return object
            var obj = {};
            if (xml.nodeType == 1) { // element
                // do attributes
                if (xml.attributes.length > 0) {
                obj["@attributes"] = {};
                    for (var j = 0; j < xml.attributes.length; j++) {
                        var attribute = xml.attributes.item(j);
                        obj["@attributes"][attribute.nodeName] = attribute.nodeValue;
                    }
                }
            } else if (xml.nodeType == 3) { // text
                obj = xml.nodeValue;
            }
            // do children
            if (xml.hasChildNodes()) {
                for(var i = 0; i < xml.childNodes.length; i++) {
                    var item = xml.childNodes.item(i);
                    var nodeName = item.nodeName;
                    if (typeof(obj[nodeName]) == "undefined") {
                        obj[nodeName] = xmlToJson(item);
                    } else {
                        if (typeof(obj[nodeName].length) == "undefined") {
                            var old = obj[nodeName];
                            obj[nodeName] = [];
                            obj[nodeName].push(old);
                        }
                        obj[nodeName].push(xmlToJson(item));
                    }
                }
            }
            return obj;
        },
    });
    
    XmlToJson.prototype.setXml = function(xml) {
        if(xml && typeof xml == "string") {
            this.xml = document.createElement("div");
            this.xml.innerHTML = xml;
            this.xml = this.xml.getElementsByTagName("*")[0];
        }
        else if(typeof xml == "object"){
            this.xml = xml;
        }
    };
    XmlToJson.prototype.getXml = function() {
        return this.xml;
    };
    XmlToJson.prototype.parse = function(xml) {
        this.setXml(xml);
        return this.convert(this.xml);
    };
    XmlToJson.prototype.convert = function(xml) {
        if (xml.nodeType != 1) {
            return null;
        }
        var obj = {};
        obj.xtype = xml.nodeName.toLowerCase();
        var nodeValue = (xml.textContent || "").replace(/(\r|\n)/g, "").replace(/^\s+|\s+$/g, "");
        
        if(nodeValue && xml.childNodes.length == 1) {
            obj.text = nodeValue;
        }
        if (xml.attributes.length > 0) {
            for (var j = 0; j < xml.attributes.length; j++) {
                var attribute = xml.attributes.item(j);
                obj[attribute.nodeName] = attribute.nodeValue;
            }
        }
        if (xml.childNodes.length > 0) {
            var items = [];
            for(var i = 0; i < xml.childNodes.length; i++) {
                var node = xml.childNodes.item(i);
                var item = this.convert(node);
                if(item) {
                    items.push(item);
                }
            }
            if(items.length > 0) {
                obj.items = items;
            }
        }
        return obj;
    };
    

    10.打印语句

    console.log
    cc.log
    

    都可以

    11.动作序列
    看下面代码感受下,其它方法去查看api吧

    onSendChat:function(){
        var node = new cc.Node();
    
        var callFunc1 = cc.callFunc(()=>{
            timerSprite.spriteFrame = this.TimerAssets[2];
        }, this)
    
        var delay1 = cc.delayTime(1);
    
        var callFunc2 = cc.callFunc(()=>{
            timerSprite.spriteFrame = this.TimerAssets[1];
        }, this)
    
        var delay2 = cc.delayTime(1);
    
        var callFunc3 = cc.callFunc(()=>{
            timerSprite.spriteFrame = this.TimerAssets[0];
        }, this)
    
        var delay3 = cc.delayTime(1);
    
        var callFunc4 = cc.callFunc(()=>{
            node.removeFromParent()
            this.quickChatBtn.node.active = true;
        }, this)
    
        var sequence = cc.sequence(callFunc1, delay1, callFunc2, delay2, callFunc3, delay3, callFunc4);
        node.runAction(sequence);
    },
    

    12.本地数据存储
    localStorage可以保存相关数据

    var imei = cc.sys.localStorage.getItem("imei");
    cc.sys.localStorage.setItem("imei", imei);
    

    相关文章

      网友评论

          本文标题:cocoscreator+js客户端需要掌握的一些基础内容

          本文链接:https://www.haomeiwen.com/subject/icvtyftx.html