在更新委托中创建 SKShapeNode 是否可以接受?
Is it acceptable to create an SKShapeNode in update delegate?
我在 SpriteKit's
update
delegate
中创建了一个 SKShapeNode
,它完全按照我想要的方式工作。我唯一担心的是 update
每十分之一秒被调用一次。这是否意味着我的代码也经常 运行?这似乎对性能不太友好。有办法解决吗?或者将代码放在 update
上可以吗?
为什么update
中的代码排在第一位你可能会问。好吧,如果我把它放在 didMove
或 sceneDidLoad
中,那么当我旋转 device
时,node
不会立即跟随,它会在原来的位置停留半秒钟在重新定位到它的新位置之前,让它看起来像在跳跃。坏的。 Update
解决了这个问题。这是代码:
override func update(_ currentTime: TimeInterval) {
let mySquare = SKShapeNode(rectOf: CGSize(width: 50, height: 50))
mySquare.fillColor = SKColor.blue
mySquare.lineWidth = 1
mySquare.position = CGPoint(x: 0, y: 0)
self.addChild(mySquare)
}
}
是的,您可以创建。您遇到的唯一问题是每次调用更新时都会创建一个新节点。目前您看不到多个节点,因为如果您尝试在每次更新调用中更改 mySquare 的位置,您会将它们放置在彼此之上,您会看到您有多个节点。创建后很快就会 运行 超出帧率。因为你没有任何动画,所以你现在看不出有什么不同。
override func update(_ currentTime: TimeInterval) {
let mySquare = SKShapeNode(rectOf: CGSize(width: 50, height: 50))
mySquare.fillColor = SKColor.blue
mySquare.lineWidth = 1
mySquare.position = CGPoint(x: randomX, y: randomY)
self.addChild(mySquare)
}
改变 X 和 Y 的位置将使您有机会看到节点被添加到屏幕上的不同位置。
如果出于任何原因您想在 更新 中创建您的 mySquare 节点,那么您可以保留该节点的引用或在父节点中搜索该节点(如果可用)不要添加任何
var mySquare: SKShapeNode
然后在更新中检查你的 Square 节点是否不为 nil 或具有相同的
override func update(_ currentTime: TimeInterval) {
if mySquire == nil {
mySquare = SKShapeNode(rectOf: CGSize(width: 50, height: 50))
mySquire.name = "your square name"
mySquare.fillColor = SKColor.blue
mySquare.lineWidth = 1
mySquare.position = CGPoint(x: randomX, y: randomY)
self.addChild(mySquare)
}
}
注意:您甚至可以检查名称,例如
if mySquare.name == "your square name"
那就不要再添加了
在 更新 功能上做任何事都是个坏主意
Apple 文档:
Do not call this method directly; it is called by the system exactly once per frame, so long as the scene is presented in a view and is not paused. This is the first method called when animating the scene, before any actions are evaluated and before any physics are simulated.
如果你想创建对象并控制它们,你应该使用例如didMove func。您可以创建这样的操作 例如:
self.run(
SKAction.repeatForever(
SKAction.customAction(withDuration: 0.0, actionBlock: { (_, _) in
// Create and add new node...
})
)
)
但是无限创建多个节点可能不是一个好主意。
我在 SpriteKit's
update
delegate
中创建了一个 SKShapeNode
,它完全按照我想要的方式工作。我唯一担心的是 update
每十分之一秒被调用一次。这是否意味着我的代码也经常 运行?这似乎对性能不太友好。有办法解决吗?或者将代码放在 update
上可以吗?
为什么update
中的代码排在第一位你可能会问。好吧,如果我把它放在 didMove
或 sceneDidLoad
中,那么当我旋转 device
时,node
不会立即跟随,它会在原来的位置停留半秒钟在重新定位到它的新位置之前,让它看起来像在跳跃。坏的。 Update
解决了这个问题。这是代码:
override func update(_ currentTime: TimeInterval) {
let mySquare = SKShapeNode(rectOf: CGSize(width: 50, height: 50))
mySquare.fillColor = SKColor.blue
mySquare.lineWidth = 1
mySquare.position = CGPoint(x: 0, y: 0)
self.addChild(mySquare)
}
}
是的,您可以创建。您遇到的唯一问题是每次调用更新时都会创建一个新节点。目前您看不到多个节点,因为如果您尝试在每次更新调用中更改 mySquare 的位置,您会将它们放置在彼此之上,您会看到您有多个节点。创建后很快就会 运行 超出帧率。因为你没有任何动画,所以你现在看不出有什么不同。
override func update(_ currentTime: TimeInterval) {
let mySquare = SKShapeNode(rectOf: CGSize(width: 50, height: 50))
mySquare.fillColor = SKColor.blue
mySquare.lineWidth = 1
mySquare.position = CGPoint(x: randomX, y: randomY)
self.addChild(mySquare)
}
改变 X 和 Y 的位置将使您有机会看到节点被添加到屏幕上的不同位置。
如果出于任何原因您想在 更新 中创建您的 mySquare 节点,那么您可以保留该节点的引用或在父节点中搜索该节点(如果可用)不要添加任何
var mySquare: SKShapeNode
然后在更新中检查你的 Square 节点是否不为 nil 或具有相同的
override func update(_ currentTime: TimeInterval) {
if mySquire == nil {
mySquare = SKShapeNode(rectOf: CGSize(width: 50, height: 50))
mySquire.name = "your square name"
mySquare.fillColor = SKColor.blue
mySquare.lineWidth = 1
mySquare.position = CGPoint(x: randomX, y: randomY)
self.addChild(mySquare)
}
}
注意:您甚至可以检查名称,例如
if mySquare.name == "your square name"
那就不要再添加了
在 更新 功能上做任何事都是个坏主意
Apple 文档:
Do not call this method directly; it is called by the system exactly once per frame, so long as the scene is presented in a view and is not paused. This is the first method called when animating the scene, before any actions are evaluated and before any physics are simulated.
如果你想创建对象并控制它们,你应该使用例如didMove func。您可以创建这样的操作 例如:
self.run(
SKAction.repeatForever(
SKAction.customAction(withDuration: 0.0, actionBlock: { (_, _) in
// Create and add new node...
})
)
)
但是无限创建多个节点可能不是一个好主意。