cocos-js怎么了解析Res中的xml

JavaScript024

cocos-js怎么了解析Res中的xml,第1张

定义一个用于解析的类,这个类继承CCSAXDelegator和CCObject,然后实现CCSAXDelegator的纯虚函数。

[cpp] view plain copy

#ifndef XMLANALYSIS_H_H

#define XMLANALYSIS_H_H

#include "cocos2d.h"

#include <string>

using namespace cocos2d

using namespace std

class XMLAnalysis:public CCSAXDelegator,public CCObject//继承CCSAXDelegator,覆盖纯虚函数

{

public:

XMLAnalysis(const char* data,unsigned int length)//解析数据

XMLAnalysis(const char* filename) //解析文件

~XMLAnalysis(void)

virtual void startElement(void *ctx, const char *name, const char **atts)//开始标签

virtual void endElement(void *ctx, const char *name)//标签结束

virtual void textHandler(void *ctx, const char *s, int len) //标签的内容

string rootname

}

#endif

源文件

[cpp] view plain copy

#include "XMLAnalysis.h"

XMLAnalysis::XMLAnalysis(const char* data,unsigned int length)

{

CCSAXParser parser //定义解析

if(parser.init("UTF-8")==0) //不是utf-8就不解析了

{

CCLog("please use utf-8")

return

}

parser.setDelegator(this) //设置解析的对象,这样就会调用解析的方法

parser.parse(data,length)

}

XMLAnalysis::XMLAnalysis(const char* filename)

{

CCSAXParser parser

if(parser.init("UTF-8")==0)

{

CCLog("please use utf-8")

return

}

parser.setDelegator(this)

parser.parse(filename)

}

XMLAnalysis::~XMLAnalysis(void)

{

}

void XMLAnalysis::startElement(void *ctx, const char *name, const char **atts)

{

if(strcmp(name,"root"))

{

rootname=name

}

}

void XMLAnalysis::textHandler(void *ctx, const char *s, int len)

{

string str=string(s,0,len)

if(rootname!="")

{

CCLog("%s",str.c_str())

}

}

void XMLAnalysis::endElement(void *ctx, const char *name)

{

rootname=""

}

这样每次就打印出标签的内容。

导读:   ccc 我们在使用一张图片的时候,使用cc.laod api ,回调传回来cc.spriteFrame 或者cc.texture来供我们使用。下面的内容会解密中间到底经历了哪些过程(native)。 加载:首先会在js引擎中,通过一些方式得到资源的完整信息,包括资源的完整路径资源类型等(可以了解下load的加载过程)。 然后调用jsb_global_load_image方法,利用native来加载这张图片到内存中,拿到内存首地址和内存大小。 把刚才拿到的信息转为jsObject,内存地址和大小会被描述成arrayBuff,包装好的对象回调回给js。 js引擎拿到回调后会创建一个texture来,然后调用 texture.initWithElement()方法,把之前包装好的数据再传回给native的texture对象(js的texture利用jsb来管理native的texture对象,并且是1对1的)。 渲染:native的texture接收到数据后会用OpenGL的api来开辟显存,绑定纹理数据(分配一个纹理id给native的texture)。然后通过device(DeviceGraphics是单例,大多数的OpenGL api接口都是通过他调用)渲染到屏幕上。(OpenGL api可自行查找资料) 我们在js端让一个精灵显示图片的时候,是在load的回调里 把cc.spriteFrame给精灵使用,spriteFrame里持有cc.texture对象,cc.texture又持有由native返回的数据。通过这种方式让纹理数据和将要渲染的对象绑定起来。 还有许多包括顶点数据  node的位置 大小 shader 等等 都在RenderFlow等类中获取和封装(比较复杂),最后配合纹理数据 渲染出来。我们加载的一张图片就这样渲染到了屏幕上。 流程图:

var NewBegin = cc.Layer.extend({

i : null,

text1 : null,

label : null,

strsArray:null,

ctor : function() {

//----start0----ctor

this._super()

//文本框

label = new ccui.Text()

label.attr({

//string : str,

//fontName : "Arial",

fontSize : 20,

anchorX : 0.5,

anchorY : 0.5,

x : winSize.width / 2,

y : 50,

width : winSize.width - 20,

height : 150

})

label.setColor(cc.color(255, 255, 255))

label.ignoreContentAdaptWithSize(false)

labelColor.addChild(label, 2)

i=0

//加载文本内容到资源

cc.loader.loadTxt(res.test_txt, function(err, data) {

if(err)

return console.log("load failed")

//success

else {

cc.log("load success")

strsArray=new Array()

strsArray=data.split(new RegExp('\\r\\n|\\r|\\n'))

text1(strsArray)

}

})

//读取文本内容

if('mouse' in cc.sys.capabilities)

cc.eventManager.addListener({

event : cc.EventListener.MOUSE,

swallowTouches : true, // 设置是否吞没事件,在 onMouseDown 方法返回 true 时吞掉事件,不再向下传递。

onMouseDown : function(event) {

i++

text1(strsArray)

return i

}

}, this)

}

})

function text1(data) {

if(i <data.length) {

//读取数据到文本框

label.string = data

}

}

NewBegin.scene = function() {

var scene = new cc.Scene()

var layer = new NewBegin()

scene.addChild(layer)

return scene

}