我试图在玩家与它发生碰撞时在一个世界节点中包含的levelUnit中删除名为“specialObstacle”的节点,但它成功但我在多个级别中有多个名为“specialObstacle”的节点一旦玩家与一个玩家发生碰撞,所有单位都被移除。我试图让玩家碰撞的那个只被删除。我的代码如下:
删除代码(也放在联系人代码中):
func createSpecialObject() {
objectSprite = SKSpriteNode(imageNamed:imageName)
self.addChild(objectSprite)
objectSprite.physicsBody = SKPhysicsBody(circleOfRadius: objectSprite.size.width / 3)
objectSprite.physicsBody!.categoryBitMask = BodyType.specialObjectDiamond.rawValue
objectSprite.physicsBody!.contactTestBitMask = BodyType.specialObjectDiamond.rawValue
}
objectSprite.physicsBody!.friction = 1
objectSprite.physicsBody!.dynamic = false
objectSprite.physicsBody!.affectedByGravity = false
objectSprite.physicsBody!.restitution = 0.0
objectSprite.physicsBody!.allowsRotation = false
self.zPosition = 400
self.name = "specialObstacle"
self.position = CGPointMake(objectSprite.size.width / 2 , 0)
}
障碍代码:(在自己的类中称为Object:SKnode)
func didBeginContact(contact: SKPhysicsContact) {
if (contact.bodyA.categoryBitMask == BodyType.player.rawValue && contact.bodyB.categoryBitMask == BodyType.specialObjectCoin.rawValue ) {
**REMOVAL CODE HERE**
numberOfCoins += 1
print("number of Coins collected is \(numberOfCoins)")
}
else if (contact.bodyA.categoryBitMask == BodyType.specialObjectCoin.rawValue && contact.bodyB.categoryBitMask == BodyType.player.rawValue ) {
**REMOVAL CODE HERE**
numberOfCoins += 1
print("number of Coins collected is \(numberOfCoins)")
}
}
联系代码:
{{1}}
我真的不知道如何让它只移除我的玩家碰撞的节点而不是等级单位中与#34; specialObstacle"同名的所有其他障碍物。被删除。请问有人能够深入了解我做错了什么吗?
答案 0 :(得分:3)
您永远不想在didBeginContact
阶段删除。您可以输入一个位置,在该位置删除与2个对象冲突的节点,在第一个对象上删除,然后在检查第二个对象上,由于对象不存在而导致程序崩溃。相反,您需要排队要删除的所有节点,并在didFinishUpdate
阶段
var nodesToRemove = [SKNode]()
override func didBeginContact()
{
if (contact.bodyA.categoryBitMask == BodyType.player.rawValue && contact.bodyB.categoryBitMask == BodyType.specialObjectCoin.rawValue )
{
**REMOVAL CODE HERE**
nodesToRemove.append(contact.bodyB.node)
numberOfCoins += 1
print("number of Coins collected is \(numberOfCoins)")
}
else if (contact.bodyA.categoryBitMask == BodyType.specialObjectCoin.rawValue && contact.bodyB.categoryBitMask == BodyType.player.rawValue )
{
**REMOVAL CODE HERE**
nodesToRemove.append(contact.bodyA.node)
numberOfCoins += 1
print("number of Coins collected is \(numberOfCoins)")
}
}
override func didFinishUpdate()
{
nodesToRemove.forEach(){$0.removeFromParent()}
nodesToRemove = [SKNode]()
}
答案 1 :(得分:0)
当调用didBeginContact
时,会给出2个碰撞的节点,因此很容易删除正确的节点:
func didBeginContact(contact: SKPhysicsContact) {
let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
switch contactMask
case BodyType.player.rawValue | BodyType.specialObjectCoin.rawValue :
// The player and the coin have contacted
let coin = contact.bodyA.categoryBitMask == BodyType.specialObjectCoin.rawValue ? contact.bodyA.node! : contact.bodyB.node!
coin.removeFromParent()
numberOfCoins += 1
print("number of Coins collected is \(numberOfCoins)")
default:
print("Other contact detected")
}