寻求有关如何创建执行反弹的自定义SKAction(精灵工具包)的帮助?
基本上,想要从顶部屏幕到底部(Y轴)放下一个精灵,并让它执行快速衰减反弹(仅在Y轴上下)。
注意:不想使用物理引擎。
我在网上查看了一些补间示例(在C中),但是数学使我的眼球眩晕并开始启动,我还不清楚我是如何整合这些功能的。我还尝试使用moveTo和moveBy进行SKAction测序,但效果不是那么顺利。
答案 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