2016-07-21 1 views
3

나는 버튼을 눌렀을 때 총알이 나쁜 녀석에게 발사되는 게임을 만들고있다. 나는 그것이 불릴 때마다 더 나쁜 녀석을 추가하는 기능을 만들었다. 여기 한 번 이상 만진 경우 부모 노드를 제거하는 방법은 무엇입니까?

는 코드입니다 (이 방법은 여러 번 호출)

func BadGuyPosition() 
    let BadGuyCircle = SKSpriteNode(imageNamed: "CircleBadGuy") 
    BadGuyCircle.zPosition = 1 
    //var mininmum = self.size.width/600 
    let TooMuch = self.size.height - 60 

    let PointToShow = UInt32(TooMuch) 

    BadGuyCircle.position = CGPointMake(CGRectGetMaxX(self.frame) + 20 , CGFloat(arc4random_uniform(PointToShow))) 

    let action2 = SKAction.moveToX(-100, duration: 5.0) 
    let remove = SKAction.removeFromParent() 

    BadGuyCircle.runAction(SKAction.sequence([action2,remove])) 

    //Physics BadGuy 
    BadGuyCircle.physicsBody = SKPhysicsBody(rectangleOfSize: BadGuyCircle.size) 
    BadGuyCircle.physicsBody?.categoryBitMask = Numbering.Badguy 
    BadGuyCircle.physicsBody?.contactTestBitMask = Numbering.Laser 
    BadGuyCircle.physicsBody?.affectedByGravity = false 
    BadGuyCircle.physicsBody?.dynamic = true 

    self.addChild(BadGuyCircle) 

2 개 총알이 나쁜 사람과 접촉하게되는 경우 나쁜 사람이 부모로부터 삭제되도록 내가 원하는.

1 개의 총알이 적과 접촉하면 부모에게서 제거됩니다.

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) 
    { 

     runAction(BadGuyLostSound) 
     bulletsTouchedBadGuy(A.node as! SKSpriteNode, Laser: B.node as! SKSpriteNode) 

    } 









} 

func bulletsTouchedBadGuy(BadGuy: SKSpriteNode, Laser: SKSpriteNode){ 

    Laser.removeFromParent() 
    BadGuy.removeFromParent() 


} 

은 누구나 내가 그래서 적 부모로부터 삭제하기 위해 하나 개 이상의 총알을 수행하게 할 수있는 방법을 가르쳐주세요 수 (여기에 코드입니다). 당신이 그 사이에 제거되는 과정에있는 충돌 노드를 검색 충돌 할 수 didBeginContact 게임에서 노드를 제거하는 방법을 제거하거나 실행할 경우

답변

3

당신의 충돌 노드를 제거하는 가장 좋은 방법은, 방법 didFinishUpdate을 사용하고 있습니다 ..

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 선언 다음 didBeginContact 방법에서

var nodesToRemove = [SKNode]() 

:

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

Alessandro - didBeginContact에서 노드를 제거하여 충돌을 생성하려고 시도했지만 실패했습니다. 이것이 일어난 것을 본 적이 있습니까? –

+1

게임이이 버그로 애플 스토어에 있었기 때문에 약간의 시간이 있었지만, 나는 행복하지 않았습니다 .didBeginContact는 여러 번 호출 할 수 있으므로 노드를 제거 할 수있는 적절한 장소가 아닙니다. –

+1

안녕하십니까, 질문에 대답 해 주셔서 감사합니다. BadGuy : SKSpriteNode 클래스가 현재 작업중인 클래스 안에 있어야합니까? 아니면 다른 신속한 파일을 만들어야합니까? 그렇지 않다면 어디로 가는지 말해 줄 수 있니? ThankYou –

0

는 상태를 칠 것 추적하기 위해 노드의 userData에 사용합니다. 총알이 BadGuy에 도달하면 노드의 userData가 이미 공격 받았는지 확인하십시오. 있다면 제거하십시오. 하지 않을 경우,이 없어진 것을 나타냅니다 : 심지어

//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()에서이 값이 설정된 모든 노드를 제거하거나 다른 대답에 따라 제거 할 노드 배열을 구성하십시오.

관련 문제