【Flutter&Flame游戏 - 拾捌】构件特效 | ComponentEffect 一族
前言
第一季完结,谢谢支持 ~
1. ComponentEffect 一族特效的特点
上一节介绍了 移动
、旋转
、缩放
、移除
的特效,它们都是 Effect
的直接子类,施加一些变换效果。本文来看一下 ComponentEffect
一族,它们如何使用、有什么特点。
如下是 ComponentEffect
抽象类的源码实现,从中可以很清楚地看出 ComponentEffect
的特点。它可以支持一个 Component
类型的泛型,并且持有该类型的成员 target
。这个 target
对象使用 late
声明,会在 onMount
方法中被赋值。
从红框中的逻辑可以看出,会寻找上级第一个非 Effect
的构件,且该构件的类型是指定的 T
类型。也就是找到宿主构件为 target
成员赋值,注意如果宿主类型和指定的 T
类型会抛异常。
2. 尺寸特效:SizeEffect
同样 SizeEffect
也有 by
和 to
两个构造由于表示尺寸增加了多少,和尺寸变化到多少。如下,为了更方便演示操作,在左侧给出相关按键的效果信息,图中的是按下 8
和 9
的效果,更改宿主的尺寸。
在使用方式上合前面也是一样的,给出变化数据和控制器即可:
void addSizeEffectBy(){
Effect effect = SizeEffect.by(
Vector2(5,5*(37/50)),
EffectController(duration: 0.5),
);
player.add(effect);
}
void addSizeEffectTo(){
Effect effect = SizeEffect.to(
Vector2(50, 37),
EffectController(duration: 0.5),
);
player.add(effect);
}
这里可能会有人感觉 SizeEffect
似乎和 ScaleEffect
很像,都能实现把构件变大和变小。其实本质上还是有很大区别的。ScaleEffect
是变换,针对整体的图形变换,构件是被整体缩放的。可以用下面 ScaleEffect
效果对比一下,可以看出变换 ScaleEffect
也会波及其子构件。
而 SizeEffect
只是针对角色的 size
进行更改,不涉及变换,如下所示:
从 SizeEffect
的源码也能清楚地看出,本质是对 target
成员,也就是宿主构件的 size
属性进行变化:
3. 透明度效果: OpacityEffect
同样 OpacityEffect
也有 by
和 to
两个构造由于表示透明度增加了多少,和透明度变化到多少,注意透明度在 0~1
之间。下图中的是按下 q
和 w
的效果,更改宿主的透明度,其中 q
按键使用 by
每次增加 -0.1
透明度,w
按键将透明度变化到 1
。
void addOpacityEffectBy(){
Effect effect = OpacityEffect.by(
-0.1,
EffectController(duration: 0.5),
);
player.add(effect);
}
void addOpacityEffectTo(){
Effect effect = OpacityEffect.to(
1,
EffectController(duration: 0.5),
);
player.add(effect);
}
另外 OpacityEffect
中还有 fadeIn
和 fadeOut
两个构造方法,本质上是基于 _OpacityToEffect
实现的。fadeIn
表示渐变到 1
而淡入,fadeOut
表示渐变到 0
而淡出。只是一个语义化的封装,没有什么特别之处,了解一下即可。
4. 颜色效果: ColorEffect
该效果可以为构件施加颜色滤镜,比如下面所示,在 1.5
s 之内,用蓝色颜色滤镜逐渐加到 40%
。这作为一个简单的冰冻效果还是不错的。
void addColorEffect(){
final effect = ColorEffect(
Colors.blue,
const Offset(0.0, 0.4),
EffectController(duration: 1),
);
player.add(effect);
}
什么的 Offset
对象表示颜色滤镜的程度变化范围,其中 0
表示不施加;1
表示把构建颜色完全变为该颜色。比如下图是取 1
的情况。
5. 沿路径运动: MoveAlongPathEffect
彩虹岛,是我童年的珍贵回忆,不知道大家有没有玩过。其中的小人可以发射一个彩虹桥,然后在弧线上走。这是一个 沿路径运动
的好场景。
Path path = Path()..quadraticBezierTo(50, -50, 100, 0);
void addMoveAlongPathEffect() {
final Effect effect = MoveAlongPathEffect(
path,
EffectController(duration: 1.5),
);
player.add(effect);
}
简单瞄一眼 MoveAlongPathEffect
的源码,可以看出本质上还是通过 PathMetric
进行计算的,所以万变不离其宗。渲染的本质总是和绘制相关,路径、色彩、图像、变换的基本知识在哪里都是通用的。
本文介绍了一下 ComponentEffect
一族的特效,该族特点是会持有一个 Componemt
类型的 target
对象,在 onMount
中初始化。各个特效的实现类,本质上就是对 target
构建属性的补间变化,产生动画效果。下一篇,我们将认识一下 EffectController
,如何对动画特效进行控制。那么本文就到这里,明天见 ~
\
转载自:https://juejin.cn/post/7108534574459650084