SpriteKit自定义SKAction =弹跳?

时间:2014-01-25 06:42:51

标签: objective-c sprite-kit

寻求有关如何创建执行反弹的自定义SKAction(精灵工具包)的帮助?

基本上,想要从顶部屏幕到底部(Y轴)放下一个精灵,并让它执行快速衰减反弹(仅在Y轴上下)。

注意:不想使用物理引擎。

我在网上查看了一些补间示例(在C中),但是数学使我的眼球眩晕并开始启动,我还不清楚我是如何整合这些功能的。我还尝试使用moveTo和moveBy进行SKAction测序,但效果不是那么顺利。

3 个答案:

答案 0 :(得分:5)

您可以结合多个SKA来实现效果。

CGFloat bounceFactor = 0.2f;
SKAction* dropAction = [SKAction moveByX:0 y:-dropHeight duration:0.3f];
SKAction* bounce = [SKAction sequence:@[[SKAction moveByX:0 y:dropHeight*bounceFactor duration:0.1f],
                                        [SKAction moveByX:0 y:-dropHeigh*bounceFactor duration:0.1f],
                                        [SKAction moveByX:0 y:dropHeight*bounceFactor/2 duration:0.1f],
                                        [SKAction moveByX:0 y:-dropHeight*bounceFactor/2 duration:0.1f]]];

[node runAction:[SKAction group:@[dropAction,bounce]]];

此外,你可以玩SKActionTimingMode使弹跳看起来更逼真。

答案 1 :(得分:2)

我会做一个简单的速度计算:

在你的@interface / header中(使ivars全局化):

CGFloat velocity; // velocity
CGFloat gravity; // force of gravity
CGFloat ballY; // the ball location
CGFloat floorY; // the floor location
CGFloat dampening; // a float 0 to 1, where 0 will mean no bounce

在您的设置方法中(初始速度和Ys):

velocity = <some number here>;
gravity = <another number>;
ballY = <another number>;
floorY = <another number>;
dampening = <another number>;

在场景的-update:方法中(这会加速球并在底部反弹):

velocity += gravity; // increases velocity with gravity
ballY += velocity; // update position

if (ballY > floorY) {
  ballY = floorY; // don't let the ball past floor
  velocity *= dampening; // dampens velocity on the bounce
  velocity *= -1; // change direction
}

sprite.position = CGPointMake(0, ballY);

答案 2 :(得分:2)

我最近需要做同样的事情。考虑到他们两年前在UIKit中添加了它们,我很惊讶地发现Apple并没有支持SpriteKit中的弹簧动画。

我看到他们在iOS 8中的SKAction上添加了timingFunction属性,但这并没有解决问题,因为如果你弹跳,你需要超越你的目标。

刚开始我只是用SKAction.sequence连接了几个子动作,用眼睛调整了值和时序模式,但结果非常蹩脚。

我最终做了数学并制作了一组扩展,以便能够以弹性效果执行大多数SKActions。它的工作方式与UIView对应的工作方式完全相同,只需在常规SKActions中添加阻尼和初始速度,即可完成。该库复制了SKAction的大多数工厂方法,但您也可以使用低级方法为SKNode上的任何CGFloat属性设置动画。

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