在swift场景中设置节点计时器

时间:2017-11-16 21:39:35

标签: swift timer sprite-kit nodes nstimer

我有一个包含类名ballNode()的场景,它声明了球及其属性。现在,我希望每一个定义的球都会产生一个球。我读到了如何做到这一点,并意识到我需要设置一个计时器。所以我读了一个教程,看了一些关于它的视频。当我按照教程时,我终于得到了这段代码:

class GameScene: SKScene, SKPhysicsContactDelegate {
var tim = Timer()

override func didMove(to view: SKView) {

    self.physicsWorld.gravity = CGVector(dx: 0, dy: -9.8)
    physicsWorld.contactDelegate = self 


    tim = Timer.init(timeInterval: 0.5, target: self, selector: #selector(createSmallBall) , userInfo: nil, repeats: true)

    let sceneBody = SKPhysicsBody.init(edgeLoopFrom: self.frame) 
    sceneBody.friction = 0
    self.physicsBody = sceneBody

}

@objc func createSmallBall(){
    let smallBall = BallNode(radius: 30)
    smallBall.position.x = 100
    smallBall.position.y = 200
    self.addChild(smallBall)
}

虽然我按照指示操​​作(并将其调整为快速4 - 选择器问题)但我的框架上仍然看不到任何球。

我找了2个小时的问题而且找不到它(createSmallBall正在运行 - 我通过在touchesbegin()中设置它来检查它。)

有人能找到我做错的事吗?

1 个答案:

答案 0 :(得分:0)

经过大量阅读后,我了解到在spriteKit上使用计时器的最佳方法是通过SKAction。据我所知,定时器在spriteKit中没用,因为它们忽略了节点和场景(如果我没错,他们会忽略视图的暂停方法)。 因此,设置计时器只有两种方法:使用update(currentTime)功能或使用更好和通用的方式 - SKAction。 据我所知,SKAction更简单,更容易实现,使用的主要功能/方法是sequence

这里应该如何在swift中完成:

func spawnBalls() {
    let wait = SKAction.wait(forDuration: 3)
    let action = SKAction.run {
        //your code here
    }
    run(SKAction.repeatForever((SKAction.sequence([wait, action]))))
}

以下是逐行说明:

let wait = SKAction.wait(forDuration: 3)

.wait(forDuration:_) - 设置包含时间的let。主要用于设置每个动作之间的时间。时间间隔是秒。

let action = SKAction.run{ //code here }

.run - 设置动作本身,大括号内应该是动作代码(移动,淡入淡出,旋转,动画等)。在告诉节点运行它之后,该操作仅执行

run(SKAction.repeatForever((SKAction.sequence([wait, action]))))

在这一行中我实际做的是运行动作。使用repeatForver()表示我希望我的行动永远(定期)运行。但是这一行中最有趣的部分是sequence([]) - 它允许将按顺序执行的一系列动作(一次一个)链接在一起,因为我知道将SKAction vars插入执行第一个操作然后执行第二个操作的操作数组,依此类推。我的代码中的行说首先执行wait var(=等待3秒),然后执行action var。因为我将它设置为repeatforever - 它将重复执行(分别如果我删除它,代码将只执行一次)。

通过使用SKAction,您还可以将一些操作组合在一起 - .group :它的优势在于您可以运行一组将同时运行 的操作。

here is申请SKAction的苹果文档。

希望这可以帮助那些需要它的人。