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

遇到一个新的引擎,一定需要掌握以下内容:
创建基础对象;
获得基础对象;
设置基础对象;
点击坐标区域的判断;
事件传递和派发接收;
创建数据结构;
创建时间对象;
服务器请求和回调的数据解析;
打印调试语句;
动作序列调用;
存储数据到本地;
下面总结一下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);
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,084评论 1 32
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,421评论 1 45
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,095评论 0 3
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,864评论 6 13
  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 3,473评论 1 11