如何对精灵动作应用不同的缓动效果?

Posted

技术标签:

【中文标题】如何对精灵动作应用不同的缓动效果?【英文标题】:How to apply different easing effects to sprite action? 【发布时间】:2013-09-26 11:23:03 【问题描述】:

我在 Cocos2D 描述的here 中使用了很多CCEase* 功能。 ios 7 Sprite Kit 也有SKActionTimingMode。但是只有简单的模式。如何使用 Sprite Kit 获得类似 CCEaseElasticInCCEaseBounceIn 的效果?

【问题讨论】:

我猜 Apple 希望我们使用 customActionWith... 来处理此类情况。 您知道如何使用customActionWith 实现这一目标吗? 仅从概念上讲,一般的想法是使用 elapsedTime 以及持续时间,并将两者都输入到缓动动作中,以确定在任何给定的 elapsedTime 处所需的属性(即位置)应该改变多少。例如,你可以从 cocos2d 改编的缓动函数。 【参考方案1】:

Sprite Kit 故意限制缓动(或补间),期望开发人员能够控制精灵运动的细节。基本上,您需要做的是在更改精灵的属性(旋转、位置、缩放等)之前进行自定义操作并将缓动曲线应用于参数。这是一个例子。

CGFloat initialScale = mySprite.xScale;
SKAction *scaleAction = [SKAction customActionWithDuration:duration actionBlock:^(SKNode *node, CGFloat elapsedTime) 
  CGFloat t = elapsedTime/duration;
  CGFloat p = t*t;
  CGFloat s = initialScale*(1-p) + scale * p;
  [node setScale:s];
];
[mySprite runAction:scaleAction];

决定缓动的部分是p = t*t。所以,pt 的函数,这样:

t为0时,p为0 当t为1时,p为1

这意味着您将从起点开始并在终点结束,但中间曲线的形状将决定您如何到达那里。缓动功能可以很简单,就像这里显示的那样,基本上是一种缓动,也可以很复杂,例如弹性或反弹。要生成自己的,试试这个:http://www.timotheegroleau.com/Flash/experiments/easing_function_generator.htm 或者更详细地查看 Robert Penner 的方程:http://www.robertpenner.com/easing/

【讨论】:

优秀的答案,感谢您的链接!点赞并接受! 不同缓动函数类型的数学实现的另一个很好的链接是:github.com/warrenm/AHEasing 我们如何将其应用于SKAction followPath【参考方案2】:

对于任意宽松,Kardasis 的回答说明了一切。

如果您正在寻找一种简单的方法来为您的动画添加弹跳效果,这与 UIKit 中的处理方式一致,我有一些适合您的方法。

几年前,Apple 在 UIKit 中引入了弹簧动画,让您在执行 UIView 动画时设置弹簧阻尼和初始速度。不幸的是,他们没有在 SpriteKit 中实现这一点,所以我创建了自己的库来实现这一点。

它是 SKAction 上的一组扩展,复制了大多数工厂方法,添加了阻尼和速度参数。

代码在GitHub上,随意使用:https://github.com/ataugeron/SpriteKit-Spring

【讨论】:

以上是关于如何对精灵动作应用不同的缓动效果?的主要内容,如果未能解决你的问题,请参考以下文章

WPF中ListBox滚动时的缓动效果

镜头以及各种运动的缓动效果

quick-cocos2dx 之transition.execute()的缓动效果

FairyGUI & Unity使用动效功能实现血条UI扣血与加血的缓动效果

svg animate中的缓动不起作用

div盒子的缓动函数封装