iOS SpriteKit 碰撞检测在解码保存后失败
iOS SpriteKit Collision Detection Fails After Decode Save
我有一个游戏,其中 Falling Nodes 掉落并击中 Base Number Sprite Node,游戏逻辑是 运行 从那里开始的。当我从头开始设置一个新游戏时,碰撞检测完全按照它应该的方式工作。当我使用 NSCoding 从以前的保存创建游戏时,我的问题就出现了。在这两种情况下(新游戏和从保存游戏继续)物理实体是相同的——动态的、相同大小的实体、相同的 contactTestBitMask、相同的 categoryBitMask。我已经测试了所有这些,所以我知道这是真的。物理接触委托也设置为正确的对象。然而,在从保存继续的游戏中,联系人未注册,我不明白为什么。我唯一能想到但无法弄清楚的是对象,它被设置为我的物理接触委托,并且是我想要碰撞检测的对象的父对象 gets loaded/unarchived 而我实际上没有为它调用 decodeObjectForKey 。
如有任何帮助,我们将不胜感激
func initBaseNumberSpritePhysicsBody() {
baseNumberSprite.physicsBody = nil
baseNumberSprite.physicsBody = SKPhysicsBody(rectangleOfSize: baseNumberSprite.size)
baseNumberSprite.physicsBody!.categoryBitMask = baseNumberCategory
baseNumberSprite.physicsBody!.contactTestBitMask = fallingNodeCategory
baseNumberSprite.physicsBody!.collisionBitMask = 0
baseNumberSprite.physicsBody!.usesPreciseCollisionDetection = true
baseNumberSprite.physicsBody!.allowsRotation = false
}
func initPhysicsBodyForFallingNode(node: NumberNode) {
node.physicsBody = nil
node.physicsBody = SKPhysicsBody(rectangleOfSize: node.size)
node.physicsBody!.categoryBitMask = fallingNodeCategory
node.physicsBody!.contactTestBitMask = baseNumberCategory
node.physicsBody!.collisionBitMask = 0
node.physicsBody!.allowsRotation = false
node.physicsBody!.velocity = nodeVelocity
}
func didBeginContact(contact: SKPhysicsContact) {
if isContactBetween(fallingNodeCategory, and: baseNumberCategory, contact: contact) {
handleContactBetweenFallingNodeAndBaseNumber(contact)
} else {
print("\nUNKNOWN CONTACT OCCURED\n")
}
updateInternalState()
checkGameOverCondition()
}
required init?(coder aDecoder: NSCoder) {
// gameZone = aDecoder.decodeObjectForKey(gameZoneKey) as! GameZone
super.init(coder: aDecoder)
gameZone = self.children[0] as! GameZone //Not decoded by itself but somehow decoded with the this GameScene Object (the "self" object here)
gameZone.delegate = self
self.physicsWorld.contactDelegate = gameZone
}
override func encodeWithCoder(aCoder: NSCoder) {
super.encodeWithCoder(aCoder)
aCoder.encodeObject(gameZone, forKey: gameZoneKey) //Gets coded
}
我能够在这里找出我自己的问题。我缺乏的基本理解是 SKNodes 编码它们自己的子节点。
// gameZone = aDecoder.decodeObjectForKey(gameZoneKey) as! GameZone
gameZone 对象是一个子节点。所以我对它和其他关键对象进行了两次编码,这导致了我的问题。问题与物理世界联系代表或 encoding/decoding.
无关
我有一个游戏,其中 Falling Nodes 掉落并击中 Base Number Sprite Node,游戏逻辑是 运行 从那里开始的。当我从头开始设置一个新游戏时,碰撞检测完全按照它应该的方式工作。当我使用 NSCoding 从以前的保存创建游戏时,我的问题就出现了。在这两种情况下(新游戏和从保存游戏继续)物理实体是相同的——动态的、相同大小的实体、相同的 contactTestBitMask、相同的 categoryBitMask。我已经测试了所有这些,所以我知道这是真的。物理接触委托也设置为正确的对象。然而,在从保存继续的游戏中,联系人未注册,我不明白为什么。我唯一能想到但无法弄清楚的是对象,它被设置为我的物理接触委托,并且是我想要碰撞检测的对象的父对象 gets loaded/unarchived 而我实际上没有为它调用 decodeObjectForKey 。
如有任何帮助,我们将不胜感激
func initBaseNumberSpritePhysicsBody() {
baseNumberSprite.physicsBody = nil
baseNumberSprite.physicsBody = SKPhysicsBody(rectangleOfSize: baseNumberSprite.size)
baseNumberSprite.physicsBody!.categoryBitMask = baseNumberCategory
baseNumberSprite.physicsBody!.contactTestBitMask = fallingNodeCategory
baseNumberSprite.physicsBody!.collisionBitMask = 0
baseNumberSprite.physicsBody!.usesPreciseCollisionDetection = true
baseNumberSprite.physicsBody!.allowsRotation = false
}
func initPhysicsBodyForFallingNode(node: NumberNode) {
node.physicsBody = nil
node.physicsBody = SKPhysicsBody(rectangleOfSize: node.size)
node.physicsBody!.categoryBitMask = fallingNodeCategory
node.physicsBody!.contactTestBitMask = baseNumberCategory
node.physicsBody!.collisionBitMask = 0
node.physicsBody!.allowsRotation = false
node.physicsBody!.velocity = nodeVelocity
}
func didBeginContact(contact: SKPhysicsContact) {
if isContactBetween(fallingNodeCategory, and: baseNumberCategory, contact: contact) {
handleContactBetweenFallingNodeAndBaseNumber(contact)
} else {
print("\nUNKNOWN CONTACT OCCURED\n")
}
updateInternalState()
checkGameOverCondition()
}
required init?(coder aDecoder: NSCoder) {
// gameZone = aDecoder.decodeObjectForKey(gameZoneKey) as! GameZone
super.init(coder: aDecoder)
gameZone = self.children[0] as! GameZone //Not decoded by itself but somehow decoded with the this GameScene Object (the "self" object here)
gameZone.delegate = self
self.physicsWorld.contactDelegate = gameZone
}
override func encodeWithCoder(aCoder: NSCoder) {
super.encodeWithCoder(aCoder)
aCoder.encodeObject(gameZone, forKey: gameZoneKey) //Gets coded
}
我能够在这里找出我自己的问题。我缺乏的基本理解是 SKNodes 编码它们自己的子节点。
// gameZone = aDecoder.decodeObjectForKey(gameZoneKey) as! GameZone
gameZone 对象是一个子节点。所以我对它和其他关键对象进行了两次编码,这导致了我的问题。问题与物理世界联系代表或 encoding/decoding.
无关