SKSpriteNode放置后位置变化
SKSpriteNode's position changes after placement
我遇到了 SKSpriteNode 的问题。当我把它放在场景中的某个位置后,它的位置开始变化得很慢。只有当我将 SKPhysicsBody 附加到它时才会发生这种情况,但不是没有它所以它与此有关。
这是我放置的图块的代码:
import Foundation
import SpriteKit
class Tile : SKNode {
var sprite = SKSpriteNode(imageNamed: "grassMid")
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented");
}
override init() {
super.init();
self.sprite.physicsBody = SKPhysicsBody(texture: self.sprite.texture!, size: CGSize(width: 32.0, height: 32.0))
self.sprite.physicsBody?.dynamic = false
self.sprite.physicsBody?.collisionBitMask = 0x0
self.addChild(sprite)
}
}
这是放置对象的代码:
func addNewTile(position: CGPoint) {
let t = Tile()
t.sprite.position = getClosestPointInGrid(position)
t.sprite.size = CGSize(width: 32.0, height: 32.0)
if(!doesPositionContainTile(t.sprite.position)) {
self.addChild(t)
}
print(t.sprite.position)
}
比如:我在位置(256, 32)放了一个方块,很快位置就变成了(255.990264892578, 31.9987831115723),而且一直在慢慢变化?我不明白。为什么会发生这种行为?
这种行为的发生是因为你已经为你的精灵添加了物理环境,所以这个涉及尊重你的 physicsWorld
和 physicsBody
设置的所有参数(重力,恢复,linearDamping , 摩擦..)。
事实上,使用 SKAction
s 是不正确的,因为您可能有像您这样的奇怪值。最好对您的精灵使用 addImpulse
或 velocity
。
希望它能帮助您了解项目中发生的事情。
好的。
我对这个问题做了一些研究,得出的结论是,如果一个 SKSpriteNode 是一个 SKNode 的父级,并且你将 SKSpriteNode 的 SKPhysicsObject 的动态 属性 设置为 false,该对象仍然会缓慢地保持漂移吃下。它根本不应该在动态 属性 设置为 false 的情况下移动。如果 SKSpriteNode 的父级是 SKScene,则不会出现此错误。
此错误于 2015 年 11 月 27 日在 Apple 开发者论坛 thread 中报告。据说它在 12 月 20 日仍然存在。我现在可以说它在 2016 年 7 月 10 日仍然存在。我有 Xcode 7.0 和 OS X 10.11.5,我只熟悉 spritekit 的 OS X 版本,我不知道这个错误是否也在 iOS 上。
最初我的地图系统是这样设计的,地图是SKNode,瓦片是SKSpriteNode。由于此错误,我对其进行了更改,以便将 SKSpriteNodes(tiles) 直接添加到 SKScene。现在bug没有出现了。
我遇到了 SKSpriteNode 的问题。当我把它放在场景中的某个位置后,它的位置开始变化得很慢。只有当我将 SKPhysicsBody 附加到它时才会发生这种情况,但不是没有它所以它与此有关。
这是我放置的图块的代码:
import Foundation
import SpriteKit
class Tile : SKNode {
var sprite = SKSpriteNode(imageNamed: "grassMid")
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented");
}
override init() {
super.init();
self.sprite.physicsBody = SKPhysicsBody(texture: self.sprite.texture!, size: CGSize(width: 32.0, height: 32.0))
self.sprite.physicsBody?.dynamic = false
self.sprite.physicsBody?.collisionBitMask = 0x0
self.addChild(sprite)
}
}
这是放置对象的代码:
func addNewTile(position: CGPoint) {
let t = Tile()
t.sprite.position = getClosestPointInGrid(position)
t.sprite.size = CGSize(width: 32.0, height: 32.0)
if(!doesPositionContainTile(t.sprite.position)) {
self.addChild(t)
}
print(t.sprite.position)
}
比如:我在位置(256, 32)放了一个方块,很快位置就变成了(255.990264892578, 31.9987831115723),而且一直在慢慢变化?我不明白。为什么会发生这种行为?
这种行为的发生是因为你已经为你的精灵添加了物理环境,所以这个涉及尊重你的 physicsWorld
和 physicsBody
设置的所有参数(重力,恢复,linearDamping , 摩擦..)。
事实上,使用 SKAction
s 是不正确的,因为您可能有像您这样的奇怪值。最好对您的精灵使用 addImpulse
或 velocity
。
希望它能帮助您了解项目中发生的事情。
好的。
我对这个问题做了一些研究,得出的结论是,如果一个 SKSpriteNode 是一个 SKNode 的父级,并且你将 SKSpriteNode 的 SKPhysicsObject 的动态 属性 设置为 false,该对象仍然会缓慢地保持漂移吃下。它根本不应该在动态 属性 设置为 false 的情况下移动。如果 SKSpriteNode 的父级是 SKScene,则不会出现此错误。
此错误于 2015 年 11 月 27 日在 Apple 开发者论坛 thread 中报告。据说它在 12 月 20 日仍然存在。我现在可以说它在 2016 年 7 月 10 日仍然存在。我有 Xcode 7.0 和 OS X 10.11.5,我只熟悉 spritekit 的 OS X 版本,我不知道这个错误是否也在 iOS 上。
最初我的地图系统是这样设计的,地图是SKNode,瓦片是SKSpriteNode。由于此错误,我对其进行了更改,以便将 SKSpriteNodes(tiles) 直接添加到 SKScene。现在bug没有出现了。