Swift 如果多次触摸,如何从父节点移除节点?
我正在做一个游戏,当按下按钮时,子弹会射向坏人。我做了一个函数,在这个函数中,无论何时调用它,它都会添加更多的坏人 代码如下:(此方法被多次调用) 我想要这样,如果有两颗子弹与坏人接触,坏人就会被从父母那里除掉 我得到了它,所以当一颗子弹与敌人接触时,它会从母体中移除。(这是代码)Swift 如果多次触摸,如何从父节点移除节点?,swift,sprite-kit,swift2,Swift,Sprite Kit,Swift2,我正在做一个游戏,当按下按钮时,子弹会射向坏人。我做了一个函数,在这个函数中,无论何时调用它,它都会添加更多的坏人 代码如下:(此方法被多次调用) 我想要这样,如果有两颗子弹与坏人接触,坏人就会被从父母那里除掉 我得到了它,所以当一颗子弹与敌人接触时,它会从母体中移除。(这是代码) 有谁能告诉我,我怎样才能使敌人从父节点上被移除,这样就需要一颗以上的子弹。移除冲突节点的最佳方法是使用方法didFinishUpdate,如果您从didBeginContact中删除或启动一个方法来删除节点,您的游戏
有谁能告诉我,我怎样才能使敌人从父节点上被移除,这样就需要一颗以上的子弹。移除冲突节点的最佳方法是使用方法
didFinishUpdate
,如果您从didBeginContact
中删除或启动一个方法来删除节点,您的游戏可能会在搜索正在被删除的冲突节点时崩溃
class BadGuy: SKSpriteNode {
var badGuyBulletCollisionsCounter: Int = 0
init() {
let texture = SKTexture(imageNamed: "CircleBadGuy")
super.init(texture: texture, color: nil, size: texture.size())
...
// fill this part with your BadGuy code
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
声明一个全局变量:
var nodesToRemove = [SKNode]()
在didBeginContact
方法中:
func didBeginContact(contact: SKPhysicsContact) {
let A : SKPhysicsBody = contact.bodyA
let B : SKPhysicsBody = contact.bodyB
if (A.categoryBitMask == Numbering.Badguy) && (B.categoryBitMask == Numbering.Laser) || (A.categoryBitMask == Numbering.Laser) && (B.categoryBitMask == Numbering.Badguy)
{
badGuy = A.node as! BadGuy
badGuy.badGuyBulletCollisionsCounter += 1
runAction(BadGuyLostSound)
bulletsTouchedBadGuy(badGuy, Laser: B.node as! SKSpriteNode)
}
}
在bulletsTouchedBadGuy
方法中:
func bulletsTouchedBadGuy(badGuy: BadGuy, laser: SKSpriteNode){
nodesToRemove.append(laser)
if badGuy.badGuyBulletCollisionsCounter == 2 {
nodesToRemove.append(badGuy)
}
}
最后:
override func didFinishUpdate()
{
nodesToRemove.forEach(){$0.removeFromParent()}
nodesToRemove = [SKNode]()
}
使用节点的用户数据跟踪其命中状态。当子弹击中坏人时,检查节点的用户数据,看看它是否已经被击中。如果有,将其移除;如果没有,请说明它有:
//Add this when creating BadGuy:
BagGuy.userData = ["HasBeenHit" : false]
func bulletsTouchedBadGuy(BadGuy: SKSpriteNode, Laser: SKSpriteNode){
Laser.removeFromParent()
if BadGuy.userData["HasBeenHit"] == true {
BadGuy.removeFromParent()
} else {
BadGuy.userData["HasBeenHit"] = true
}
甚至:
if BadGuy.userData["HasBeenHit"] == true ? BadGuy.removeFromParent() : BadGuy.userData["HasBeenHit"] = true
如果要将removeFromParent()
移动到didFinishUpdate()
,只需按如下方式更改操作:
if BadGuy.userData["HasBeenHit"] == true {
BadGuy.userData["HasBeenHitTwice"]
} else {
BadGuy.userData["HasBeenHit"] = true
}
然后在
didFinishUpdate()
中删除设置了此值的所有节点,或者根据另一个答案构造要删除的节点数组。Alessandro-我尝试通过删除didBeginContact中的节点来生成崩溃,但失败了。你见过这种情况吗?有几次,但确实发生过,我过去很不高兴,因为我的游戏在苹果商店里有这个bug。didBeginContact可以被调用很多次,所以它不是删除节点的正确位置。你好,谢谢你回答这个问题,班上的坏蛋:SKSpriteNode必须在我目前工作的班里,还是我必须制作另一个swift文件?如果没有,你能告诉我它去哪里吗?谢谢我这么问是因为badGuypostion方法每0.5秒调用一次,使用NSTimer计划的时间,您可以在同一个文件中生成所有内容,即您的类之上的BadGuy类
if BadGuy.userData["HasBeenHit"] == true ? BadGuy.removeFromParent() : BadGuy.userData["HasBeenHit"] = true
if BadGuy.userData["HasBeenHit"] == true {
BadGuy.userData["HasBeenHitTwice"]
} else {
BadGuy.userData["HasBeenHit"] = true
}