【问题标题】:How to delete enemy after certain hits?如何在某些命中后删除敌人?
【发布时间】:2017-02-19 01:47:04
【问题描述】:

我试图在 2 次射击后删除一个敌人。这是我的 didBegin

func didBegin(_ contact: SKPhysicsContact) {

    var body1:SKPhysicsBody
    var body2:SKPhysicsBody

    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
        body1 = contact.bodyA
        body2 = contact.bodyB
    }else{
        body1 = contact.bodyB
        body2 = contact.bodyA
    }


    if body1.categoryBitMask == PhysicsCatagory.Bullet && body2.categoryBitMask == PhysicsCatagory.Enemy{
        //if the bullet has hit the enemy
        if body2.node != nil {
            spawnSplatter(spawnPosition: body2.node!.position)
            body1.node?.removeFromParent()
            body2.node?.removeFromParent()
        }

这会在被击中一次后删除一个敌人,有人能告诉我如何在两次击中后删除一个敌人吗?

【问题讨论】:

  • 除了 Alessandro 所说的可行的方法之外,您可以将 SKSpriteNode 子类化并为其添加一些属性,称为 energyhp .. . 也可以这样...

标签: sprite-kit swift3


【解决方案1】:

通常,尝试将节点删除到 didBegin(_ contact: 这不是一个好主意,因为您可能有多个联系人,第一次接触后节点变为 nil,这可能会导致崩溃。

var bulletCounter : Int = 0
var nodesToRemove = [SKNode]()

func didBegin(_ contact: SKPhysicsContact) {
    var body1:SKPhysicsBody
    var body2:SKPhysicsBody
    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
        body1 = contact.bodyA
        body2 = contact.bodyB
    }else{
        body1 = contact.bodyB
        body2 = contact.bodyA
    }
    if body1.categoryBitMask == PhysicsCatagory.Bullet && body2.categoryBitMask == PhysicsCatagory.Enemy{
        //if the bullet has hit the enemy
        bulletCounter += 1
        nodesToRemove.append(body1.node!) // remove always the bullet
        switch bulletCounter {
        case 2: 
           nodesToRemove.append(body2.node!) // remove enemy
           bulletCounter = 0
        default:break 
        }
    }
}
override func didFinishUpdate()
{
    nodesToRemove.forEach(){$0.removeFromParent()}
    nodesToRemove = [SKNode]()
}

如果你有 1 个敌人,这个例子会很有用。 如果你有更多敌人,你可以为你的 Enemy 类创建一个 bulletCounter 属性,或者在 SKNode userData 属性中存储一个 bulletCounter 值:

先创建字典:

enemy.userData = NSMutableDictionary()
enemy.userData?.setObject(0, forKey: "bulletCounter")

在游戏中获取/分配你的价值:

if let bulletCounter = self.userData?.object(forKey: "bulletCounter") {
   var counter = bulletCounter as! Int
   counter += 1
   self.userData?.setObject(counter, forKey: "bulletCounter" as NSCopying)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 2014-11-08
    • 1970-01-01
    相关资源
    最近更新 更多