欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-26 09:01:35
...

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