白鹭引擎之EgretWing动画编辑器使用
发表于2018-11-13
白鹭引擎有两个可以制作动画的工具,这篇主要说的是其中之一EgretWing的动画编辑器的使用,考虑到有些开发者可能还没用过,这里就将相应的官方教程分享给大家。
可以去看官方教程:http://developer.egret.com/cn/github/egret-docs/Wing/animation/index.html
官方的示例直接使用,可能会报出bug,哈哈,问题在于加载exml文件的时候,还未加载完成就使用exml中的组件,因此,你延时执行初始化就可以了。也就是createChildren后面的内容延时执行。
下面是我自己项目中用到的示例,总觉得官方的怪怪的。
先看效果:
一、新建TipsViewSkin.exml和TipsView.ts文件。
二、在TipsViewSkin.exml文件中摆放好UI,然后添加动画,如何添加请看官方,用起来虽然简单,说起来比较麻烦。
最后生成的动画是一个egret.tween.TweenGroup,在ts文件中调用其实也是tween缓动动画,也就是说效果可以自己使用tween手写。先看一下exml中tween内容,内容多,但足够简单:
<w:Declarations> <tween:TweenGroup id="close2open"> <tween:TweenItem target="{background}"> <tween:Set> <tween:props> <e:Object alpha="{0}"/> </tween:props> </tween:Set> <tween:To duration="500"> <tween:props> <e:Object alpha="{1}"/> </tween:props> </tween:To> </tween:TweenItem> <tween:TweenItem target="{tips_panel}"> <tween:Set> <tween:props> <e:Object x="{125}" y="{887}" height="{200}" alpha="{0}"/> </tween:props> </tween:Set> <tween:To duration="200"> <tween:props> <e:Object height="{200}" alpha="{1}"/> </tween:props> </tween:To> <tween:To duration="300"> <tween:props> <e:Object height="{440}"/> </tween:props> </tween:To> </tween:TweenItem> <tween:TweenItem target="{tips_title}"> <tween:Set> <tween:props> <e:Object alpha="{0}"/> </tween:props> </tween:Set> <tween:To duration="350"> <tween:props> <e:Object alpha="{0}" y="{60}"/> </tween:props> </tween:To> <tween:To duration="250"> <tween:props> <e:Object alpha="{1}" y="{20}"/> </tween:props> </tween:To> </tween:TweenItem> <tween:TweenItem target="{tips_msg}"> <tween:Set> <tween:props> <e:Object alpha="{0}"/> </tween:props> </tween:Set> <tween:To duration="350"> <tween:props> <e:Object alpha="{0}" y="{115}"/> </tween:props> </tween:To> <tween:To duration="250"> <tween:props> <e:Object alpha="{1}" y="{55}"/> </tween:props> </tween:To> </tween:TweenItem> <tween:TweenItem target="{close_bg}"> <tween:Wait duration="450"/> <tween:Set> <tween:props> <e:Object y="{-80}"/> </tween:props> </tween:Set> <tween:To duration="150"> <tween:props> <e:Object y="{-40}"/> </tween:props> </tween:To> </tween:TweenItem> <tween:TweenItem target="{close_label}"> <tween:Wait duration="450"/> <tween:Set> <tween:props> <e:Object y="{-80}"/> </tween:props> </tween:Set> <tween:To duration="150"> <tween:props> <e:Object y="{-40}"/> </tween:props> </tween:To> </tween:TweenItem> <tween:TweenItem target="{group}"> <tween:Set> <tween:props> <e:Object alpha="{0}"/> </tween:props> </tween:Set> <tween:To duration="450"> <tween:props> <e:Object alpha="{0}"/> </tween:props> </tween:To> <tween:To duration="150"> <tween:props> <e:Object alpha="{1}"/> </tween:props> </tween:To> </tween:TweenItem> </tween:TweenGroup> <tween:TweenGroup id="open2close"> <tween:TweenItem target="{background}"> <tween:Wait duration="100"/> <tween:Set> <tween:props> <e:Object alpha="{0.6}"/> </tween:props> </tween:Set> <tween:To duration="500"> <tween:props> <e:Object alpha="{0}"/> </tween:props> </tween:To> </tween:TweenItem> <tween:TweenItem target="{tips_panel}"> <tween:Wait duration="100"/> <tween:Set> <tween:props> <e:Object height="{440}"/> </tween:props> </tween:Set> <tween:To duration="300"> <tween:props> <e:Object height="{200}"/> </tween:props> </tween:To> <tween:To duration="200"> <tween:props> <e:Object height="{200}" alpha="{0}"/> </tween:props> </tween:To> </tween:TweenItem> <tween:TweenItem target="{tips_title}"> <tween:Set/> <tween:To duration="250"> <tween:props> <e:Object alpha="{0}" y="{60}"/> </tween:props> </tween:To> <tween:To duration="350"/> </tween:TweenItem> <tween:TweenItem target="{tips_msg}"> <tween:Set/> <tween:To duration="250"> <tween:props> <e:Object alpha="{0}" y="{115}"/> </tween:props> </tween:To> <tween:To duration="350"/> </tween:TweenItem> <tween:TweenItem target="{close_bg}"> <tween:Set/> <tween:To duration="150"> <tween:props> <e:Object y="{-80}"/> </tween:props> </tween:To> <tween:To duration="450"/> </tween:TweenItem> <tween:TweenItem target="{close_label}"> <tween:Set/> <tween:To duration="150"> <tween:props> <e:Object y="{-80}"/> </tween:props> </tween:To> <tween:To duration="450"/> </tween:TweenItem> <tween:TweenItem target="{group}"> <tween:Set/> <tween:To duration="150"> <tween:props> <e:Object alpha="{0}"/> </tween:props> </tween:To> <tween:To duration="450"/> </tween:TweenItem> </tween:TweenGroup> </w:Declarations>
三、在ts文件中调用,添加到stage上面,自己根据自己结构添加,自己拷贝代码运行肯定是不行的,不过思路没问题。
class TipsView extends eui.Component { public background: eui.Rect; public tips_panel: eui.Group; public top_image_mask: eui.Rect; public top_image: eui.Image; public tips_title: eui.Label; public tips_msg: eui.Label; public close_label: eui.Label; // animation public close2open: egret.tween.TweenGroup; public open2close: egret.tween.TweenGroup; private _hadInit: boolean = false; constructor() { super() this.width = App.StageUtils.getWidth(); this.height = App.StageUtils.getHeight(); this.skinName = "resource/skins/common/help-view/TipsViewSkin.exml"; this.visible = false; } private initUI() { if(this._hadInit) return; this._hadInit = true; LayerManager.UI_Tips.addChild(this); this.top_image.mask = this.top_image_mask; this.close_label.addEventListener(egret.TouchEvent.TOUCH_TAP, this.onCloseHandler, this); this.open2close.addEventListener('complete', this.afterClose, this); } /** * 打开tips view */ public open(title: string, msg: string, animated: boolean) { console.log("open open open"); this.initUI(); this.visible = true; this.tips_title.text = title; this.tips_msg.text = msg; if(animated) { this.close2open.play(0); // 这里很重要,一定要从第0帧开始,erget不会帮你重置 } } /** * 变比tips view */ public close(animated: boolean) { if(animated) { this.open2close.play(0); } else { this.afterClose(); } } /** * 关闭窗口后行为 */ private afterClose() { this.visible = false; } private onCloseHandler() { this.close(true); } private addToParent() { LayerManager.UI_Tips.addChild(this); } }
说明:this.close2open.play(0); // 这里很重要,一定要从第0帧开始,erget不会帮你重置,这是个坑,egret说得也是不明不白的,其他引擎会帮你重置到第一帧。
注意:egret.tween.Group中如果你添加某一项属性,但是没有动画帧的话,动画在播放的时候是不能监听到完成回调的
也就是说,如果open2close某一项属性没有关键帧,下一行代码中不会回调 this.afterClose()
this.open2close.addEventListener('complete', this.afterClose, this);
想看demo的话,可以看看这个:https://bbs.egret.com/thread-46313-1-1.html
来自:https://blog.csdn.net/honey199396/article/details/80625617