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

在swift场景中设置节点计时器,swift,timer,sprite-kit,nodes,nstimer,Swift,Timer,Sprite Kit,Nodes,Nstimer,我有一个场景,其中包含一个类名称ballNode(),它声明了ball及其属性。现在,我希望每定义一秒,一个球就会产生一个帧。我读了一些关于如何做的书,意识到我需要设置一个计时器。所以我读了一篇教程,看了一些关于它的视频。在我学习教程的过程中,我最终得到了以下代码: class GameScene: SKScene, SKPhysicsContactDelegate { var tim = Timer() override func didMove(to view: SKView) {

我有一个场景,其中包含一个类名称ballNode(),它声明了ball及其属性。现在,我希望每定义一秒,一个球就会产生一个帧。我读了一些关于如何做的书,意识到我需要设置一个计时器。所以我读了一篇教程,看了一些关于它的视频。在我学习教程的过程中,我最终得到了以下代码:

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)
}
虽然我按照指示操作(并将其调整为swift 4-选择器问题),但我仍然没有在我的框架上看到任何球

我花了2个小时寻找这个问题,但找不到它(CreateSallball正在工作-我通过在touchesbegin()中设置它来检查这个问题)


有人能发现我做错了什么吗?

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

以下是如何在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:u)-设置包含时间的let。基本上用于设置每个动作之间的时间。时间间隔以秒为单位

let action = SKAction.run{ //code here }
.run-设置动作本身,在花括号内应该是动作代码(移动、淡入、旋转、设置动画等)。只有在告诉节点运行该操作后,才会执行该操作

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

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

苹果公司的行动文件


希望有助于那些需要它的人。

你真的应该考虑通过更新FUNC使用SpRITEKIT计时功能。把它放在一边,试着设置smallBall.zPosition=1,看看是否有帮助