白鹭引擎之EgretWing动画编辑器使用

发表于2018-11-13
评论0 5.9k浏览
白鹭引擎有两个可以制作动画的工具,这篇主要说的是其中之一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

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引