我遇到了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)并且它会一直缓慢变化?我不明白。为什么会出现这种情况?
答案 0 :(得分:0)
这种行为的发生是因为你已经为你的精灵添加了物理环境,所以这个行为涉及尊重你physicsWorld
和physicsBody
设置的所有参数(重力,恢复原状,线性阻尼,摩擦力) ..)。
事实上,使用SKAction
是不正确的,因为你可能有像你这样的奇怪值。最好对您的精灵使用addImpulse
或velocity
。
希望它能帮助您了解项目中发生的事情。
答案 1 :(得分:0)
好的。
我已就此问题做了一些研究,并得出结论,如果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版本,我不知道bug是否在iOS也。
最初我的地图系统的设计使得地图为SKNode,而瓷砖为SKSpriteNodes。由于这个错误,我更改了它,以便SKSpriteNodes(tile)直接添加到SKScene。现在这个错误并没有发生。