我有一个包含类名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()中设置它来检查它。)
有人能找到我做错的事吗?
答案 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的苹果文档。
希望这可以帮助那些需要它的人。