如何在SWIFT中使用SpriteKit脉冲一个精灵?

4
我试图在SK/SWIFT中给精灵添加“脉动”效果。我尝试使用for循环和`.setScale`,但它们没有起作用(没有错误,只是没有动画效果)。我感觉使用SKActions可能更加优雅。
在参考下面的帮助后,这是我的当前实现。然而,它出现了编译错误:
“Expected member name or constructor call after type name &;Consecutive statement on a line must be separated by a ;”
这是我正在使用的代码:
SKAction *pulseUp = [SKAction.scaleTo(3.0, duration: 3.0)]
SKAction *pulseDown = [SKAction.scaleTo(1.0, duration: 3.0)]
SKAction *pulse = [SKAction.sequence(pulseUp, pulseDown)]
SKAction *repeat = [SKAction repeatActionForever:pulse]]
[self.playButton runAction: repeat]

任何帮助都将不胜感激。


你确定是 sprite-kit 吗?CCSprite 和 CCSequence 等都是 cocos2d 的类,对吧? - Anthony Kong
我正在使用Sprite it,但是上面的代码是Cocos。然而,我希望在Sprite it中找到类似的结果。 - Frankeex
你可能应该重新措辞你的问题标题,以使你的意图更加清晰。有一段时间我被你的示例代码搞得很困惑。 - Anthony Kong
@AnthonyKong 谢谢你,Anthony。在你的帮助下,我已经进行了修改,感觉我离成功更近了,但是就像我的问题描述一样,它仍然会导致错误。 - Frankeex
4个回答

6

在 xCode 8.3.3 版本中,使用 Swift 编程:

    let pulseUp = SKAction.scale(to: 3.0, duration: 1.0)
    let pulseDown = SKAction.scale(to: 0.5, duration: 1.0)
    let pulse = SKAction.sequence([pulseUp, pulseDown])
    let repeatPulse = SKAction.repeatForever(pulse)
    self.playButton.run(repeatPulse)

由于某些原因,这对我来说并不完全有效。我收到一个错误,声称“pulseUp”和“pulseDown”不是我的类的成员。 - TerranceW
@TerranceW - 你的pulseUp和pulseDown声明是在类的范围内吗?如果不是,你就不能像我这样引用它们。 - Frankeex

1
它将类似于这样的东西:
 SKAction *scaleUpAction = [SKAction ...]; // you need to find the CCScaleTo counterpart
 SKAction *scaleDownAction = [SKAction ...];
 SKAction *pulse = [SKAction sequence:@[scaleUpAction, scaleDownAction]];

 [sprite runAction:[SKAction repeatActionForever:pulse]];

1
如果你想要一个真正的脉冲效果(即一旦缩放,立即返回原始比例并无限重复),请按照以下步骤进行:
func addPulseAction(scale: CGFloat = 50, duration: TimeInterval = 0.5) {
    
    let pulse = SKAction.sequence([
        SKAction.group([
            SKAction.scale(to: scale, duration: duration),
            SKAction.fadeOut(withDuration: duration)
        ]),
        SKAction.group([
            SKAction.scale(to: 1, duration: 0),
            SKAction.fadeIn(withDuration: 0)
        ])
    ])
    let shockwave = SKShapeNode(circleOfRadius: 1)
    node.addChild(shockwave)
    
    shockwave.run(SKAction.repeatForever(pulse))
}

0

作为扩展:

    import SpriteKit


    extension SKSpriteNode {

    

    private static let fillColor = UIColor(red: 0, green: 0.455, blue: 0.756, alpha: 0.45)

    

    func addPulseEffect(circleOfRadius: CGFloat, backgroundColor: UIColor = fillColor) {

        

        let circle = SKShapeNode(circleOfRadius: circleOfRadius)

        circle.fillColor = backgroundColor

        circle.lineWidth = 0.0

        circle.position = CGPoint(x: 0, y: 0)

        self.addChild(circle)

        let scale = SKAction.scale(to: 3.0, duration: 1.0)

        let fadeOut = SKAction.fadeOut(withDuration: 1.0)

        let pulseGroup = SKAction.sequence([scale, fadeOut])

        let repeatSequence = SKAction.repeatForever(pulseGroup)

        circle.run(repeatSequence)

        

    }

    

    func repeatPulseEffectForEver(circleOfRadius: CGFloat) {

        let _ = Timer.scheduledTimer(withTimeInterval: 0.8, repeats: true) { (timer) in

            self.addPulseEffect(circleOfRadius: circleOfRadius)

        }

    }

}

不需要安装定时器。只需按照以下步骤将新比例添加到您的组中,并将其替换为 'repeatPulseEffectForEver()':let pulseGroup = SKAction.sequence([scale, fadeOut, SKAction.scale(to: 1.0, duration0)]) - Stéphane de Luca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接