如何使一个节点在接触时消失
How to make one node disappear upon contact
所以目前我正在尝试制作一个应用程序,当玩家与敌人发生碰撞时,敌人就会消失。我通过编写这段代码实现了这一点;
func didBegin(_ contact: SKPhysicsContact) {
var firstBody = SKPhysicsBody()
var secondBody = SKPhysicsBody()
if contact.bodyA.node?.name == "Player" {
firstBody = contact.bodyA
secondBody = contact.bodyB
}else {
firstBody = contact.bodyB
secondBody = contact.bodyA
}
if firstBody.node?.name == "Player" && secondBody.node?.name == "Enemy" {
}
if contact.bodyA.categoryBitMask == 1 && contact.bodyB.categoryBitMask == 2 {
self.enumerateChildNodes(withName: "Enemy") { (node:SKNode, nil) in
if node.position.y < 550 || node.position.y > self.size.height + 550 {
node.removeFromParent()
}
}
}
}
但是,因为我正在枚举名称为“Enemy”的 ChildNode,所以每个敌人都会在屏幕上消失。我只希望我击中的那个消失。有什么帮助吗?谢谢!
你需要替换这个:
self.enumerateChildNodes(withName: "Enemy") { (node:SKNode, nil) in
if node.position.y < 550 || node.position.y >
self.size.height + 550 {
node.removeFromParent()
}
}
}
像这样:
if contact.bodyA.node?.name == "Enemy" {
contact.bodyA.node?.removeFromParent()
} else if contact.bodyB.node?.name == "Enemy" {
contact.bodyB.node?.removeFromParent()
}
Contact bodyA 和bodyB 是相互接触的2 个节点。 IF 语句只是检查哪一个是敌人,然后将其删除。
JohnL 发布了正确答案,但您可能会发现像这样构建您的 didBegin
会有所帮助:
func didBegin(_ contact: SKPhysicsContact) {
print("didBeginContact entered for \(String(describing: contact.bodyA.node!.name)) and \(String(describing: contact.bodyB.node!.name))")
let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
switch contactMask {
case playerCategory | enemyCategory:
print("Player and enemy have contacted.")
let enemyNode = contact.bodyA.categoryBitMask == enemyCategory ? contact.bodyA.node : contact.bodyB.node
enemyNode.removeFromParent
default:
print("Some other contact occurred")
}
}
(打印语句用于调试,可以去掉)
此代码不会在需要时分配碰撞中的物体,并逻辑与 2 个类别位掩码以确定什么撞到了什么,然后使用 'switch' 处理每次碰撞。您可以为其他碰撞添加额外的开关盒。然后,我们使用三元运算符获取 'enemy' 节点(功能与 JohnL 的“if...then...”相同)并将其删除。
所以目前我正在尝试制作一个应用程序,当玩家与敌人发生碰撞时,敌人就会消失。我通过编写这段代码实现了这一点;
func didBegin(_ contact: SKPhysicsContact) {
var firstBody = SKPhysicsBody()
var secondBody = SKPhysicsBody()
if contact.bodyA.node?.name == "Player" {
firstBody = contact.bodyA
secondBody = contact.bodyB
}else {
firstBody = contact.bodyB
secondBody = contact.bodyA
}
if firstBody.node?.name == "Player" && secondBody.node?.name == "Enemy" {
}
if contact.bodyA.categoryBitMask == 1 && contact.bodyB.categoryBitMask == 2 {
self.enumerateChildNodes(withName: "Enemy") { (node:SKNode, nil) in
if node.position.y < 550 || node.position.y > self.size.height + 550 {
node.removeFromParent()
}
}
}
}
但是,因为我正在枚举名称为“Enemy”的 ChildNode,所以每个敌人都会在屏幕上消失。我只希望我击中的那个消失。有什么帮助吗?谢谢!
你需要替换这个:
self.enumerateChildNodes(withName: "Enemy") { (node:SKNode, nil) in
if node.position.y < 550 || node.position.y >
self.size.height + 550 {
node.removeFromParent()
}
}
}
像这样:
if contact.bodyA.node?.name == "Enemy" {
contact.bodyA.node?.removeFromParent()
} else if contact.bodyB.node?.name == "Enemy" {
contact.bodyB.node?.removeFromParent()
}
Contact bodyA 和bodyB 是相互接触的2 个节点。 IF 语句只是检查哪一个是敌人,然后将其删除。
JohnL 发布了正确答案,但您可能会发现像这样构建您的 didBegin
会有所帮助:
func didBegin(_ contact: SKPhysicsContact) {
print("didBeginContact entered for \(String(describing: contact.bodyA.node!.name)) and \(String(describing: contact.bodyB.node!.name))")
let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
switch contactMask {
case playerCategory | enemyCategory:
print("Player and enemy have contacted.")
let enemyNode = contact.bodyA.categoryBitMask == enemyCategory ? contact.bodyA.node : contact.bodyB.node
enemyNode.removeFromParent
default:
print("Some other contact occurred")
}
}
(打印语句用于调试,可以去掉)
此代码不会在需要时分配碰撞中的物体,并逻辑与 2 个类别位掩码以确定什么撞到了什么,然后使用 'switch' 处理每次碰撞。您可以为其他碰撞添加额外的开关盒。然后,我们使用三元运算符获取 'enemy' 节点(功能与 JohnL 的“if...then...”相同)并将其删除。