【问题标题】:Nesting SKActions not using wait duration嵌套 SKAction 不使用等待时间
【发布时间】:2017-02-02 05:27:42
【问题描述】:

我正在尝试在 SKSpriteNode 上执行以下操作: 让它变大, 将其移至新位置, 再把它变小。

但是,代码似乎都同时运行,变大和变小相互抵消了。

这是在 Playground 中创建的代码:

import PlaygroundSupport
import UIKit
import SpriteKit

var theirCard:SKSpriteNode
let CARDSHRINK_TIME = 5.0
let AICARDMOVE_SPEED = 2.5
let droppoint:CGPoint = CGPoint(x: 100,y:  100)

let sceneView = SKView(frame: CGRect(x:0 , y:0, width: 480, height: 320))

let scene = SKScene(size: CGSize(width: 480, height: 320))
sceneView.showsFPS = true
sceneView.presentScene(scene)
PlaygroundSupport.PlaygroundPage.current.liveView = sceneView

theirCard = SKSpriteNode(imageNamed: "card")
theirCard.name = "theircard"
theirCard.position = CGPoint(x: scene.size.width * 0.50, y: scene.size.height * 0.5)

scene.addChild(theirCard)

func getwait(makeBig big:Bool) -> SKAction {
    let ret = SKAction.wait(forDuration: CARDSHRINK_TIME)
    var action:SKAction

    if big {
        action = SKAction.scale(to: 1.9, duration: CARDSHRINK_TIME)
    }
    else {
        action = SKAction.scale(to: 1.0, duration: CARDSHRINK_TIME)
    }
    theirCard.run(action, completion: { print("getwait \(big) done!") } )

    return ret
}



// We want to MAKE the node BIG, move it to the location, then make it SMALL again
let action1:SKAction = getwait(makeBig: true)
let action2:SKAction = SKAction.move(to: droppoint, duration: AICARDMOVE_SPEED)
let action3:SKAction = getwait(makeBig: false )
let seq:SKAction = SKAction.sequence([action1, action2, action3])
theirCard.run(seq, completion: {
    print("animation complete!!!!")
})

我需要保持 getwait 不变,因为在实际代码中它是 Card 类的一个方法(这实际上是 theirCard)。我简化了它以便在 Playground 中进行测试

更新:

let action1 = SKAction.scale(to: 1.9, duration: CARDSHRINK_TIME)
let action2:SKAction = SKAction.move(to: droppoint, duration: AICARDMOVE_SPEED)
let action3 = SKAction.scale(to: 1.0, duration: CARDSHRINK_TIME)

按我的意愿工作,但这意味着我不能使用 Card 类中的方法。

【问题讨论】:

    标签: swift duration skaction


    【解决方案1】:

    当您使用getwait(makeBig: true) 时,操作会同时运行的原因是因为以下行:

    theirCard.run(action, completion: { print("getwait \(big) done!") } )
    

    每当您调用该函数时,您都会立即让卡片运行一个动作。所以你可以看到为什么调用,连续

    getwait(makeBig: true)
    getwait(makeBig: false)
    

    只会产生卡片同时同时放大和缩小的净效应。

    我建议你改写如下:

    func getScaleAction(makeBig big:Bool) -> SKAction {
        return SKAction.scale(to: big? 1.9 : 1.0, duration: CARDSHRINK_TIME)
    }
    

    并按如下方式调用它:

    let scaleUp = getScaleAction(makeBig: true)
    let move = SKAction.move(to: droppoint, duration: AICARDMOVE_SPEED)
    let scaleDown = getScaleAction(makeBig: false)
    
    theirCard.run(SKAction.sequence([scaleUp, move, scaleDown])) {
        print("done")
    }
    

    【讨论】:

    • 谢谢,我会试一试。我的代码背后的原因是我会调用 getwait() 来立即缩放卡,就像你说的那样。 getwait() 将返回序列用于等待实际缩放完成的等待操作。
    猜你喜欢
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 2018-04-26
    • 2020-04-21
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 2015-08-15
    相关资源
    最近更新 更多