我对Objective c和swift很陌生,我创建了一个小应用程序,其中呈现小圆圈,一旦玩家与圆圈碰撞,游戏结束。我设法让一切工作,但如何在碰撞后删除节点。我试过removeAllChildren(),但没有一个消失。当我使用removeFromParent()时,只有1消失。我想要一种方法来删除将在下面的代码中呈现的所有3个节点
//首先调用addEvilGuys()
func addEvilGuys()
{
addEvilGuy(named: "paul", speed: 1.3, xPos: CGFloat(self.size.height/3))
addEvilGuy(named: "boris", speed: 1.7, xPos: frame.size.width/4 + 50)
addEvilGuy(named: "natasha", speed: 1.5, xPos: frame.size.width/4 + 150)
}
func addEvilGuy(#named:String, speed:Float, xPos: CGFloat)
{
evilGuyNode = SKSpriteNode(imageNamed: named)
evilGuyNode.zPosition = 10
evilGuyNode.physicsBody = SKPhysicsBody(circleOfRadius: 16)
evilGuyNode.physicsBody!.affectedByGravity = false
evilGuyNode.physicsBody!.categoryBitMask = ColliderType.BadGuy.rawValue
evilGuyNode.physicsBody!.contactTestBitMask = ColliderType.Hero.rawValue
evilGuyNode.physicsBody!.collisionBitMask = ColliderType.Hero.rawValue
evilGuyNodeCount++
var evilGuy = EvilGuy(speed: speed, eGuy: evilGuyNode)
evilGuys.append(evilGuy)
resetEvilGuy(evilGuyNode, xPos: xPos)
evilGuy.xPos = evilGuyNode.position.x
addChild(evilGuyNode)
}
func resetEvilGuy(evilGuyNode:SKSpriteNode, xPos:CGFloat)
{
evilGuyNode.position.y = endOfScreenBottom
evilGuyNode.position.x = xPos
}
答案 0 :(得分:2)
在addEvilGuy
中,您正在重新创建存储的属性(即整个类可见,+访问级别允许的任何内容),以创建您正在添加的SKSpriteNode
。这意味着您正在孤立以前创建的EvilGuy
。
在addEvilGuy
中,替换
evilGuyNode = SKSpriteNode(imageNamed: named)
与
let evilGuyNode = SKSpriteNode(imageNamed: named)
并从您的班级中移除该属性(看起来您似乎不需要在更大的范围内)。
看起来您还在创建EvilGuy
并将它们存储在数组中,这很好。因此,当您可以使用以下功能从屏幕上删除所有这些内容时:
func removeAllEvilGuys(evilGuys: [EvilGuy]) {
for evilGuy in evilGuys {
evilGuy.eGuy.removeFromParent()
}
}
作为最佳做法建议,因为您提到您是初学者:
我建议在.plist中定义邪恶家伙的特征,然后使用该文件创建一个邪恶的家伙阵列。通过这种方式,您可以轻松地更改该文件中的邪恶人物,而无需更改代码中的任何内容。
创建EvilGuy
对象的代码应该与将恶魔添加到屏幕的代码分开。只要您存储每个SKNode的SKNode,您就可以添加/删除而无需重新创建整个对象。