当前位置: 首页 > article >正文

EgreWing序列帧动画的几种实现思考

前言

今天关于场景中特效MovieClip和UI上的不同之处思考尝试了一些。场景中的MovieClip需要考虑多个方向,以及挂载点,且大多是通过配置来创建的,相比UI上公告板式样规则处理要复杂,所以把UI上的序列帧单独拆开,结合EXML编辑实现。

官方提供的MovieClip无法在EgretWing中所见即所得,于是…


第一种 通过MovieClipDataFactory创建

包 egret
类 public class MovieClip
继承 egret.MovieClip Inheritance egret.DisplayObjectInheritance egret.EventDispatcherInheritance egret.HashObject
影片剪辑,可以通过影片剪辑播放序列帧动画。MovieClip 类从以下类继承而来:DisplayObject 和 EventDispatcher。不同于 DisplayObject 对象,MovieClip 对象拥有一个时间轴。

官方提供示例如下

MovieClip序列帧动画-egret.MovieClip

帧动画演示http://developer.egret.com/cn/example/egret2d/index.html#100-anim-flash

TextureMerger创建动画-http://developer.egret.com/cn/github/egret-docs/tools/TextureMerger/movieClip/index.html

优点

  • 美术使用TextureMerger编辑。提供mc的json配置和图集。
  • 支持单帧图片的偏移(虽然这个工具真的。。但这个功能还是有的)
  • 支持添加事件
  • 支持swf,gif作为源文件

缺点

  • 无法在EgretWing中预览(这个很苦恼)
  • TextureMerger使用太酸爽(谁用谁知道,我们的美术被折磨的不轻)

示例代码如下:

/*** 以下示例演示了 MovieClip 序列帧动画的使用。* 该示例中假设资源已经用RES模块加载完成*/
class MovieClipExample extends egret.DisplayObjectContainer {private data:any;private texture:egret.Texture;public constructor() {super();var loader:egret.HttpRequest = new egret.HttpRequest();loader.responseType = egret.HttpResponseType.TEXT;loader.addEventListener(egret.Event.COMPLETE, this.onLoadJsonComplete, this);loader.open("resource/assets/chunli.json", egret.HttpMethod.GET);loader.send();}private onLoadJsonComplete(event:egret.Event):void {var loader:egret.HttpRequest = <egret.HttpRequest>event.target;this.data = JSON.parse(loader.response);var imageLoader:egret.ImageLoader = new egret.ImageLoader();imageLoader.addEventListener(egret.Event.COMPLETE, this.onLoadTextureComplete, this);imageLoader.load("resource/assets/chunli.png");}private onLoadTextureComplete(event:egret.Event):void {var loader:egret.ImageLoader = <egret.ImageLoader>event.target;//获取加载到的纹理对象var bitmapData:egret.BitmapData = loader.data;//创建纹理对象this.texture = new egret.Texture();this.texture.bitmapData = bitmapData;this.createMovieClip();}private createMovieClip():void {//创建动画工厂var mcDataFactory:egret.MovieClipDataFactory = new egret.MovieClipDataFactory(this.data, this.texture);//创建 MovieClip,将工厂生成的 MovieClipData 传入参数var mc:egret.MovieClip = new egret.MovieClip(mcDataFactory.generateMovieClipData("test"));this.addChild(mc);//添加播放完成事件mc.addEventListener(egret.Event.COMPLETE, function (){egret.log("COMPLETE");}, this);//添加循环播放完成事件mc.addEventListener(egret.Event.LOOP_COMPLETE, function (){egret.log("LOOP_COMPLETE");}, this);//播放攻击动画mc.gotoAndPlay("attack", -1);}
}

在此基础上,可以对操作进行封装,实现MovieClipManager,略过不说了。


第二种

不导出MovieClip,使用TextureMerger导出sheet格式。在EXML里面放入一张图片,使用该图集的第一帧作为source。逻辑中实现一个FrameAnimation类。

代码中使用:

let frameAnimation = new FrameAnimation(this.image_xx, "mc_001");

传入占位Image组件和序列帧名,通过Update(dt)或者使用Timer计时计算应该切换到的图片名称。

优点

  • EgretWing里面可以预览到动画位置
  • EgretWing里面可以直接把适配设置好
  • 逻辑调用简单
  • 只有图集json,相比Mc格式的json资源小

缺点

  • 不能加事件
  • 看到EXML上的单个Image组件可能并不清楚这里是个特效占位符
  • 需要对应的配置表来确定帧率,子图片下标等

第三种

实现一个通用组件UIComponent_MovieClip。

使用:

  • 固定特效:
    摆到EXML上,填好source,如Eui_001.1,可以自动播放。
  • 动态加载特效: 摆到EXML上,留空source,如``,程序动态设置如:
    this.uicomponent_mc_task.initMc("Eui_001");
    
/*** UI序列帧特效*/class UIComponent_MovieClip extends eui.Image implements eui.UIComponent{protected childrenCreated(): void {super.childrenCreated();let effectName = getDefaultEffectName(this.source);if(effectName != ""){this.initEffect(effectName);}}/*** 初始化特效* @paramp_effectId cfg_effect中id 如Eui_52*/public initEffect(p_effectId: string) {let config = GetConfig(p_effectId);if(config == null) {return;}···this.addEventListener(egret.Event.ENTER_FRAME, this.onEnterFrame, this);}private onEnterFrame() {···if(this.mIndex == -1|| this.mIndex > this.endIndex) {this.mIndex = this.startIndex;}this.source = this.imgPath + "_json."+ this.mIndexthis.mIndex++;}
}

优点

  • EgretWing可以预览动画位置大小
  • EgretWing可以直接把适配设置好
  • 不需要动态加载的固定特效可以不添加代码
  • 只有图集json,相比Mc格式的json资源小
  • 程序看到其他设计人员提交的EXML上该组件就清楚这里是一个特效,如有设置source不处理,无则确认需求动态加载

缺点

  • 需要对应的配置表来确定帧率,子图片下标等

其他

  • 自定义事件也可以统一配置在配置表里面

后记

  • 吐槽一下,工具真的是无力,TextureMerger不支持实时刷新,MovieClip编辑也是极其反人类。。Egret前路漫漫啊。。


参考

  • MovieClip序列帧动画-egret.MovieClip

  • 帧动画演示http://developer.egret.com/cn/example/egret2d/index.html#100-anim-flash

  • TextureMerger创建动画-http://developer.egret.com/cn/github/egret-docs/tools/TextureMerger/movieClip/index.html

http://www.lryc.cn/news/2418765.html

相关文章:

  • RabbitMQ入门(五) —— vhost
  • 为什么一些程序频繁发生GC 【转】
  • 如何将经度范围在0至360的栅格数据转换为经度范围为-180至+180
  • 数据库基础知识(总结+摘抄)
  • 前国际货币基金组织(IMF)高级经济学家Andy Jobst将担任Roxe首席货币经济学家
  • ALaN一键压枪脚本【FPS通用】For CS1.5
  • 在VB.Net中创建使用控件数组
  • 在win10里更改启动项、误删分区表恢复,Diskgenius这个软件真的很强大。
  • Socket/TCP/UDP
  • U盘文件夹乱码无法删除的原因及解决方案
  • 小故事大哲理之八
  • 探索宇宙新前沿,星际加油站与你不见不散
  • linux为什么不怕病毒
  • Linux学习(一)Ubuntu20.04 LTS (Focal Fossa)以及 Anaconda CUDA CuDNN PyTorch VisualStudioCode 的安装
  • 数据库开发技术第一次作业aaa
  • 点亮数字人生( 202009-3/CCF)———附带思路和完整代码(邻接表、邻接矩阵)
  • 详细说明vue组件中 data ,computed 和 watch的区别
  • JVM参数类型及常用参数
  • 三位大股东推动盖茨辞去微软董事长职位
  • 基于asp.net的大连之韵旅行网站设计与实现
  • JavaScript深入浅出
  • 一款实用的综合性导航网站
  • 海思 Hi3559AV100 简介
  • 搭建论坛的几种方法
  • 优能分类目录源码php,分类导航目录源码分享 优能站长F3.8正式版源码下载
  • 触摸屏原理介绍
  • rtyhrtrtyrtyr
  • Javaparser使用
  • 加权平均法和移动加权法的例题
  • 程序员如何学习