我看到 famo.us 的 示例主要引用 Modifier 类,但是 famo.us 大学教程主要引用 StateModifier 类。
这两者有何不同,哪一个是最合适的应用程序?
目前,这些没有区别。
如果需要、和,请使用StateModifier。目前Modifier仍然支持这些方法,但它们已被弃用。setTransform
setSize
setOrigin
setOpacity
StateModifier使用Transitionable,可用于在值之间平滑转换。使用这些方法时只需提供一个过渡:
stateModifier.setTransform(Transform.rotateZ(Math.random()*Math.PI/2), { curve: 'easeOut', duration: 5000 });
修饰符更受限制,使用transformFrom
、和。这些方法可以接收一个值、getter 函数或一个带有函数的对象。sizeFrom
originFrom
opacityFrom
get
根据著名大学的说法,这些是不同之处:
Statemodifiers 为每个实例创建一个新的 Transitionable,这意味着您不能重用给定的 transitionable。使用修饰符,您可以:
- 跨组件共享状态/相互派生状态
他们的构造函数选项有一个重要的区别。StateModifier 只接受常量值作为初始值。修饰符接受常量值和具有适当返回值的函数。该函数将以 60fps 进行评估。
1) 状态修饰符
var stateModifier = new StateModifier({
size: [200, 200],
opacity: 1,
transform: [1, 0.5, 0, 0, -0.5, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],
//transform: Transform.translate(20, 20, 0), // --> this is still constant
});
2) 修饰符
var transitionable = new Transitionable(0);
transitionable.set(2*3.14, {duration: 2000});
var modifier = new Modifier({
origin: [0.5, 0.5],
transform: function(){
var state = transitionable.get();
transition = Transform.rotateZ(state);
return transition; // --> this will cause rotating
},
opacity: function(){
return Math.random(); // --> this will cause blinking (60fps)
},
});
您选择的任何一个都需要考虑性能和设计。
当您的对象具有静态定位或不经常更改其变换细节时,您可以使用修改器。例如,如果您有一组相对于父对象坐下的对象,并且您只需要设置它们的位置一次。您使用修改器是因为一旦您将它们布置好,就无需担心触及它们所关心的渲染树。
当您需要更频繁地控制对象的变换时,您可以使用StateModifier 。这是当您想要动画或控制每帧或事件发生时的变换时。
使用拉StateModifier
或推的方法。这为您提供了两种更改/动画对象变换的方法。拉取意味着您正在提供一个函数并使用某个对象来确定该对象的值(例如一个或您自己的带有方法的对象)。如果您有一个始终跟踪其他东西的游戏对象,这可能会很有用,您将使用一个函数,该函数在每一帧都要求对象变换值。Push意味着你决定何时改变事物,并使用Transitionable
.get()
.setOpacity
.setTransform
StateModifier
. 这将更适合在某些事件触发之前保持静止的 UI 对象。您还可以在调用这些方法时使用不同的缓动曲线,或者让更改立即发生。
性能和设计考虑来自这样一个事实,即您应该始终尝试编写一个不必做超过它需要做的事情的应用程序。如果您的所有对象都使用StateModifier
带有*pull模型的 a(使用每个帧调用的函数),您可以想象这将花费更多的 CPU 资源,而不是您只需要偶尔更改一个对象并使用push方法来更改需要时的对象状态。这对于小型 UI 可能不是问题,但如果您将应用程序扩大到控制数百个甚至数千个对象,您可以看到您开始消耗更多 CPU 功率的地方。
所以总而言之,Modifer非常适合将东西放在某个地方并忘记它,而StateModifier更适合能够移动东西,但你必须在不断被问到它在做什么(拉)或在你准备好时告诉它之间做出选择(推)。