egreteui源码_egret游戏源码

hacker|
96

文章目录:

egret中eui怎么获取exml中的属性并修改

在EUI中,EXML是可以运行时加载解析的。您可以把它当做标准的文本文件加载后解析,或者直接将exml文本内容嵌入代码中解析。在下一节我们将详细讲解EXML的语法,这节我们先来看一下如何在代码中使用EXML文件。

如何在wing 看egret源码

我的是mac,在这个目录下

/Applications/EgretEngine.app/Contents/Resources/mac/egret/src

windows也差不多,找到src

layabox和egret存在哪些区别

区别是:

Layabox 有两个框架;LayaFlash是面向Flash AS3程序员的,可以用AS3语言直接开发H5产品,也可以把AS3源码的项目发布成H5项目。主要用于开发大游戏。另一个框架是LayaAir支持三种语言开发(AS3、TypeScript、JavaScript)这是全新的开发框架,与Flash没关系了,是一个超牛的全新H5引擎,支持重度、中度、轻度的游戏开发,支持应用、网站的开发。

Egret是TypeScript语言开发游戏用的。是围住神经猫这个游戏把引擎推火了,也一直致力于小游戏的开发。目前在小游戏的研发市场上品牌作的不错。

egret 和cocos2d-x-js哪个目前更稳定更好用

如果大型游戏,强烈建议不要使用cocos2d-js

我们目前的几个项目都是cocos2d-js开发的,我打算把这几个项目转egret。有如下几个理由:

1、cocos ide有BUG:断点会崩溃、代码提示很差、内存太高、虚拟机的菜单栏会影响事件(迭代了很多版本,这菜单栏BUG都没修复)

2、studio的工作流在几个引擎中是最差的,而且有BUG。经常和实际表现不一致。而且内存占用大,会崩溃。不能继承(这个问题最严重,不能继承按钮,那么按下缩放等高级功能就很蛋疼)。

3、

架构太差。写点小功能没事,如果想写大型游戏,这套架构会让你抓狂!比如最简单的按钮事件,我必须在事件方法里面加个触摸类型判断。一个很简单的点击,就

多出很多这种相似的代码!4、UI有好几套,然而每一套都有BUG。CCUI的设计也是很糟糕的!同时也是崩溃的罪魁祸首。

5、引擎BUG问题,

很多BUG会让你欲哭无泪,比如坐标会出现undefined。再比如热更新的BUG,XCODE编出的包默认是js而不是jsc,当这个包发布商店就会

出现不能热更新的问题,同时也进不去游戏,卡在了热更新界面。(这个问题导致我们流失了3个月的用户,知道苹果商店通过审核位置),再比如

java/objectc和js的交互,这个都有问题!再比如:ios第三方输入法会导致崩溃!

6、工作流问题,IDE的断点的观察变量很不友好、studio导出的配置很大、studio扩展性很差。在IDE 1.2版本出来之前,我们团队甚至无法断点,只能打印日志来debug。

7、工作效率问题,代码提示先不谈。我实现一个简单的列表都能折腾很久,那ccui的list真是太不好用!除此之外,裁剪、遮罩这些只需要一行的代码,在cocos下面需要无数行!

8、

引擎升级问题:cocos大概一个月1个升级,egret是2周。然而cocos升级会带来大量的新BUG,而且兼容性很差。导致我们现在还用3.0版

本。最蛋疼的是,官方的3.6版本又不能断点了!3.0升级到3.6还会导致布局混乱、九宫失效、崩溃闪退(绝对不是代码问题这个解释了)!基本上

cocos每加个新功能都会带来无数新BUG,老BUG修复量也少,我论坛反馈的问题经常需要迭代2到3个版本才修复,下个版本修复兼职是不可能。而

egret不仅迭代快,BUG修复也勤快!也很少有一些导致产品质量的验证BUG。

9、官方人员态度问题:我在cocos论坛发的BUG反馈,过了7天才有人来回复。地址(从3.0到3.1和3.2的BUG,官方帮忙看下),再看下egret我发的BUG反馈,当时是下班时间,然而第二天一早就回复我了。地址(Egret社区-BUG列表)

10、API问题:cocos经历了3个大版本,官方API文档也有的API,实际尽然是没有的,官方回复是还没加入js绑定。

11、跨平台问题:cocos2d-js经常是HTML5和JSB表现不一致。导致我们现在只能专注JSB而放弃HTML5版本。egret很少有这个问题。

12、

性能问题:先抛开runtime。如果你用了ccui,那么我100%保证你的cocos2d-js的性能会被egret秒杀。再来说下native下面

的性能对比,cocos的人说egret是js写的逻辑,而他们是绑定。那么问题来了,在现在,js的逻辑产生的性能压力一点都不是问题(参考

node.js,能用js写服务器了都)。主要的性能压力其实是在渲染上面,而他们2个都是opengl作为渲染的。如果用了ccui,那么还是被

egret秒杀。那ccui带来的drawCall真是太!!再来谈runtime,egret现在很多浏览器都集成了runtime(可以opengl

渲染代替canvas渲染),而cocos-js只是说在合作,已经慢了一步。

13、产品路线图问题:cocos的几个产品一心在弄3D,egret都已经自己搞了一个IDE了。开发基本的生活cocos都没保障好,就去想和u3d打架!

14、内部问题:cocos估计内部很不和谐,ide据说是1个人在开发,studio是30个人(30个人整出这东西),而且studio是用的.NET搞的,跨平台最呵呵的技术!QT、AIR那些那么多高效率,扩展性强的技术不用,选了个.NET。。。。

---------------------------------------------------------------------------------------------------------------------------------

外话:说了那么多cocos的不是,我也曾试着爱过它,我甚至开发了一个和egret

wing一样的UI编辑器,写了个和Flash/Flex一样的API(egret用的这套,这种架构很好用,简单明了)。其中UI编辑器还加上了

unity3d那种绑定脚本的功能。然而因为cocos底层的一些令人发狂的BUG,我最终是放弃了。有egret这个车子在,我还造什么轮子?我打算把

手里头的这套cocos的东西开源。然后去整egret去!

---------------------------------------------------------------------------------------------------------------------------------

再来个题外话:

游戏引擎cocos2d-js和egret 对比

个是百度搜索第一的对比,里面说cocos2d的工具比egret多,我不否认,但是能用的基本没有。而egret的工具很稳定。就拿最简单的骨骼动

画,cocos连龙骨都不支持,studio里面的骨骼设计也是坑的不行,egret的骨骼设计工具从界面和实用性都已经完爆studio了!

再来说上面的地址里面的成功产品:捕鱼达人、DOTA传奇、我叫MT那都是cocos2dx写的,和js版本一点关系都没有!请问你有见过网页版的刀塔传奇么?

上面的开发语言对比,大项目来说,ts真的是完爆js!js那不小心就会出错真心不适合大项目,不然微软不会造这个轮子。

上面的参考资料对比,cocos2d-js的文档连参数的注释都没,和c++文档作参考也不行,很多参数是不一致的!而egret在开发工具里面就继承了中文的帮助。

从目前状况看,今年绝对是egret产品井喷的一年,不信走着瞧!cocos真是把我坑惨了!

---------------------------------------------------------------------------------------------------------------------------------

次申明,请拿cocos2d-js或者JSB的大作出来,不用拿2dx的东西。说到2dx,你们再去了解下,榜单上,有几个人是没改过引擎源码的,有几个

游戏能随着cocos引擎升级而升级。用studio的又有几个。并不想和王哲斯逼,只是希望你们能正视BUG,提高体验。如果好,我们团队会考虑

cocos技术的,否则只能用egret和unity3d了。我说cocos这么多不是,也是希望他成长,能给开发者带来更多利益,带来更多方便,而不是

各种无厘头的问题,各种蹩脚的手段去开发。还有,我说的这几点,@王哲

你接招,如果我不说出这些BUG,这些问题,那么估计还不一定改。egret同样有个人叫王泽,然而他的理念完全当我们开发者是用户,提高开发体验,这个

很重要的。

layabox与egret 有什么区别

Egret是比较早推的一个H5游戏引擎,引擎是仿Flash AS3 API的接口,但是用TypeScript语言去开发游戏用的。自《围住神经猫》之后Egret引擎火了,也一直致力于小游戏的引擎。目前在小游戏的研发上市场品牌不错。由于和AS3的语言级差异性还是挺大的,对一个AS3来讲,很多的不适应。

Layabox推出的比较晚,他推出两个框架;最开始推的是LayaFlash,这是直接面向Flash AS3程序员的,可以用AS3语言直接开发H5产品,这一点对AS3程序员来讲确实比较爽,太熟悉了,当然这个框架也可以把AS3源码的项目发布成H5项目,对于开发过Flash想快速转型的来讲,是一种超低成本进入H5市场的方式,当然也有一个缺陷,这个框架主要用于开发大游戏,开发小游戏不合适,引擎库好几百K,有点大啊。不过最近要发布另一个框架是LayaAir就解决了只能开发大游戏的问题了,引擎库才100K左右。还支持三种语言开发(AS3、TypeScript、JavaScript),这个全新的引擎开发框架,支持重度、中度、轻度的游戏开发,支持应用、网站的开发。

如何使用EXML Egret EDN 开发者中心

在EUI中,EXML是可以运行时加载解析的。您可以把它当做标准的文本文件加载后解析,或者直接将exml文本内容嵌入代码中解析。在下一节我们将详细讲解EXML的语法,这节我们先来看一下如何在代码中使用EXML文件。下面是一个EXML文件内容示例,它描述了一个按钮的皮肤:

?xml version="1.0" encoding="utf-8" ?

e:Skin class="39c8-87fe-b797-315a skins.ButtonSkin" states="up,down,disabled" minHeight="50" minWidth="100" xmlns:e=""

e:Image width="100%" height="100%" scale9Grid="1,3,8,8" alpha.disabled="0.5"

source="button_up_png"

source.down="button_down_png"/

e:Label id="labelDisplay" top="8" bottom="8" left="8" right="8"

size="20" fontFamily="Tahoma 'Microsoft Yahei'"

verticalAlign="middle" textAlign="center" text="按钮" textColor="0x000000"/

e:Image id="iconDisplay" horizontalCenter="0" verticalCenter="0"/

/e:Skin

运行时显示结果如下:

直接引用EXML文件

第一种方式也是最简单的方式,因为这个EXML的根节点是Skin,表示这个文件描述的是一个皮肤。在EXML根节点是Skin的情况下,可以直接使用组件的skinName接受EXML文件路径,这通常也是最普遍的使用情景。这里我们假设之前那个EXML文件的路径为:[项目根路径]/resource/skins/ButtonSkin.exml,引用那个ButtonSkin.exml的代码如下:

var button = new eui.Button();

button.skinName = "resource/skins/ButtonSkin.exml";

this.addChild(button);

皮肤文件推荐放在resource目录下。

动态加载EXML文件

上面介绍了EXML根节点是Skin的情况,若不描述的对象不是皮肤,那么我们就得采用更加通用的一种加载解析方式。可以直接使用EXML.load()方法来加载并解析外部的EXML文件,加载完成后,回调函数的参数会传入解析后的类定义,可以把类定义new出来实例化它,或直接赋值给组件的skinName属性(如果EXML根节点是Skin)。下面看个简单例子:

private init():void{

EXML.load("skins/ButtonSkin.exml",this.onLoaded,this);

}

private onLoaded(clazz:any,url:string):void{

var button = new eui.Button();

button.skinName = clazz;

this.addChild(button);

}

嵌入EXML到代码

EXML同样也提供了文本的解析方式,这个过程大家可以直接类比对JSON文件的处理,因为几乎是一样的。您可以使用HttpRequest去加载EXML文件的文本内容,然后运行时调用EXML.parse(exmlText)方法去解析即可,会立即返回解析后的类定义。当然,您也可以跳过异步加载,直接在代码中嵌入EXML文本内容:

var exmlText = `?xml version="1.0" encoding="utf-8" ?

e:Skin class="87fe-b797-315a-af0e skins.ButtonSkin" states="up,down,disabled" minHeight="50" minWidth="100" xmlns:e=""

e:Image width="100%" height="100%" scale9Grid="1,3,8,8" alpha.disabled="0.5"

source="button_up_png"

source.down="button_down_png"/

e:Label id="labelDisplay" top="8" bottom="8" left="8" right="8"

size="20" fontFamily="Tahoma 'Microsoft Yahei'"

verticalAlign="middle" textAlign="center" text="按钮" textColor="0x000000"/

e:Image id="iconDisplay" horizontalCenter="0" verticalCenter="0"/

/e:Skin`;

var button = new eui.Button();

button.skinName = exmlText;

this.addChild(button);

注意观察上面的例子,这里有个嵌入多行文本的技巧,您可以不用写一堆的 "n"+ 符号来连接字符串,可以直接使用头尾一对·符号(波浪线那个按键)来包裹多行文本。另外,包含在这对符合之间的文本内容,还可以使用${key}的形式来引用代码中的变量,进行简洁的字符串拼接:

var className = "skins.ButtonSkin";

var exmlText = `e:Skin class="b797-315a-af0e-aaca ${className}" states="up,over,down,disabled" xmlns:s="" ...

/e:Skin`;

2条大神的评论

  • avatar
    访客 2022-07-02 下午 12:28:20

    uttonSkin.exml",this.onLoaded,this);}private onLoaded(clazz:any,url:string):void{ var button

  • avatar
    访客 2022-07-02 上午 10:21:38

    d,this);}private onLoaded(clazz:any,url:string):void{ var button = new eui.Button(); button.skinName = clazz; this.addChil

发表评论