gpt4 book ai didi

xcode - 删除与玩家 Sprite 碰撞的节点

转载 作者:搜寻专家 更新时间:2023-11-01 06:38:47 25 4
gpt4 key购买 nike

我正在尝试在玩家与世界节点发生碰撞时删除包含在世界节点中的 levelUnit 中名称为“specialObstacle”的节点,它成功了,但我在多个级别中有多个名称为“specialObstacle”的节点一旦玩家与一个玩家发生碰撞,所有单位都会被移除。我试图让玩家碰撞的那个只被移除。我的代码如下:

删除代码(也放在联系代码中):

worldNode.enumerateChildNodesWithName("levelUnit"){
node, stop in

let levelUnit:LevelUnit = node as! LevelUnit //cast as an actual LevelUnit class

levelUnit.enumerateChildNodesWithName("specialObstacle"){
node, stop in


node.removeFromParent()

}

}

障碍代码:(在它自己的类中称为对象:SKnode)

 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)

}

联系代码:

 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)")

}
}

我真的不知道如何让它只移除我的玩家与之碰撞的节点,而不是移除关卡单元中与“specialObstacle”同名的所有其他障碍物。有人可以深入了解我做错了什么吗?

最佳答案

您永远不想在 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]()

}

关于xcode - 删除与玩家 Sprite 碰撞的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38239422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com