【问题标题】:SpriteKit Custom SKAction = Bounce?SpriteKit 自定义 SKAction = 反弹?
【发布时间】:2014-01-25 06:42:51
【问题描述】:

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

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

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

我在网上查看了一些补间示例(用 C 语言),但数学让我的眼球目瞪口呆,无论如何我都不清楚如何集成这些函数。我也尝试了 SKAction 排序,使用 moveTo 和 moveBy,但效果不是那么流畅。

【问题讨论】:

    标签: objective-c sprite-kit


    【解决方案1】:

    你可以组合几个SKAction来达到效果。

    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 以使弹跳看起来更逼真。

    【讨论】:

      【解决方案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);
      

      【讨论】:

        【解决方案3】:

        我最近需要做同样的事情。看到 Apple 不支持 SpriteKit 中的弹簧动画,我感到很惊讶,因为他们两年前在 UIKit 中添加了它们。

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

        起初我只是将一些子动作与 SKAction.sequence 连接起来,通过肉眼调整值和计时模式,但结果很糟糕。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-07
          • 1970-01-01
          • 2016-04-08
          • 2014-09-23
          • 1970-01-01
          相关资源
          最近更新 更多