2017-02-19 2 views
2

私は誰かが私は2安打の後に敵を削除することができますどのように私に言うことができる?、2 shots.Hereは私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() 
     } 

された後これは、一度打たれた後、敵を削除敵を削除しようとしていますか

+1

動作していたアレッサンドロとは別に、SKSpriteNodeをサブクラス化し、* energy *または* hp *という名前のプロパティを追加することができます。 t道すぎて... – Whirlwind

答えて

4

通常、ノードをdidBegin(_ contact:に削除しようとすると、最初の接触後にnilになるノードが複数ある可能性があり、クラッシュする可能性があるため、お勧めできません。あなたは1体の敵を持っている場合

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]() 
} 

この例は、役立ちます。 あなたはより多くの敵を持っている場合は、あなたの敵のクラスにbulletCounterプロパティを作成したり、SKNodeuserDataプロパティ内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) 
} 
+1

あなたの助けをたくさんありがとう! – sicvayne

関連する問題