2016-07-09 2 views
1

다섯 가지 다른 장애물이있는 게임을 만들려고합니다. 그 중 하나는 매 초마다 무작위로 선택되고 화면 상단에서 화면 하단으로 이동합니다. 이렇게하면 플레이어가 탐색 할 수있는 장애물이 생깁니다. 나는 화면 아래로 첫 번째 장애물 이동을 할 수 있었지만, 화면을 두 번째로 내려 오는 대신, 스레드 1을 계속 유지합니다. 문제를 해결하려고 시도 함에도 불구하고 신호 SIGABRT 오류가 계속 발생합니다. 여기 SWIFT : 5 개의 장애물 중 하나를 무작위로 선택하고 그에 대한 조치를 실행하고 매초이 프로세스를 반복하는 방법은 무엇입니까?

내 코드입니다 :

func randomize() { 
    smallMiddleObstacle.size = CGSizeMake(self.frame.width - 180, obstacleHeight) 
    smallMiddleObstacle.position = CGPointMake(self.frame.width/2, self.frame.height + smallMiddleObstacle.frame.height/4) 
    smallMiddleObstacle.color = UIColor.blueColor() 

    bigMiddleObstacle.size = CGSizeMake(self.frame.width - 100, obstacleHeight) 
    bigMiddleObstacle.position = CGPointMake(self.frame.width/2, self.frame.height + bigMiddleObstacle.frame.height/4) 
    bigMiddleObstacle.color = UIColor.blueColor() 

    rightObstacle.size = CGSizeMake(self.frame.width * 1.4, obstacleHeight) 
    rightObstacle.position = CGPointMake(self.frame.width, self.frame.height + rightObstacle.frame.height/4) 
    rightObstacle.color = UIColor.blueColor() 

    leftObstacle.size = CGSizeMake(self.frame.width * 1.4, obstacleHeight) 
    leftObstacle.position = CGPointMake(0, self.frame.height + leftObstacle.frame.height/4) 
    leftObstacle.color = UIColor.blueColor() 

    rightObstacleInPair.size = CGSizeMake(self.frame.width * 0.7, obstacleHeight) 
    rightObstacleInPair.position.x = self.frame.width 
    rightObstacleInPair.color = UIColor.blueColor() 

    obstaclePair.addChild(rightObstacleInPair) 

    leftObstacleInPair.size = CGSizeMake(self.frame.width * 0.7, obstacleHeight) 
    leftObstacleInPair.position.x = 0 
    leftObstacleInPair.color = UIColor.blueColor() 

    obstaclePair.addChild(leftObstacleInPair) 

    obstaclePair.position.y = self.frame.height + obstaclePair.frame.height/4 

    let distance = CGFloat(self.frame.height + obstacleHeight) 
    let move = SKAction.moveByX(0, y: -distance, duration: NSTimeInterval(0.005 * distance)) 
    let remove = SKAction.removeFromParent() 
    moveAndRemove = SKAction.sequence([move, remove]) 

    let random = Int(arc4random_uniform(4)) 

    if random == 0 { 
     addChild(smallMiddleObstacle) 
     smallMiddleObstacle.runAction(moveAndRemove) 
    } else if random == 1 { 
     addChild(bigMiddleObstacle) 
     bigMiddleObstacle.runAction(moveAndRemove) 
    } else if random == 2 { 
     addChild(rightObstacle) 
     rightObstacle.runAction(moveAndRemove) 
    } else if random == 3 { 
     addChild(leftObstacle) 
     leftObstacle.runAction(moveAndRemove) 
    } else { 
     addChild(obstaclePair) 
     obstaclePair.runAction(moveAndRemove) 
    } 

} 



override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    if !isGameStarted { 

     isGameStarted = true 


     let spawn = SKAction.runBlock({ 
     () in 

      self.randomize() 

    }) 

     let delay = SKAction.waitForDuration(1.5) 
     let spawnDelay = SKAction.sequence([spawn, delay]) 
     let spawnDelayForever = SKAction.repeatActionForever(spawnDelay) 

     self.runAction(spawnDelayForever) 



    } 



} 

감사

+0

코드, 어떤 라인 오류입니까? – Feldur

+0

나는 시뮬레이터를 잘 시작할 수 있지만 대략 1.5 초 후에 시뮬레이터가 충돌하고 디버거에서 나에게 다음 메시지를 준다 : 캐치되지 않은 예외 'NSInvalidArgumentException'으로 인해 앱 종료 중, 이유 : '이미 부모가있는 SKNode를 추가하려고 시도 함 : < SKSpriteNode> 이름 : '(null)'텍스처 : [ 'nil'] 위치 : {414, 0} 눈금 : {1.00, 1.00} 크기 : {289.79998779296875, 50} 앵커 : {0.5, 0.5} 회전 각도 : 0.00 ' – Aidan

+0

Can 오류를 만드는 코드 행을 식별합니까? – Feldur

답변

1

당신은 너무 이미 addChild 년대, 이미 이는 SKNode을 추가하는 당신이 randomize 방법은 당신이 "Attemped 한 전화 두 번째 removeFromParent에 잊었다 부모가 있습니다. "

먼저 노드에 name을 부여하십시오 (아직 수행하지 않은 경우). 예를 들어

: 당신이 addChild

매번 하기 전에, 당신은 당신이 이미 그것을 추가하지 않습니다 당신이 할 수있는 알고 확인해야합니다 당신은 단계별로

if let child = self.childNodeWithName(smallMiddleObstacle.name) { 
    child.removeFromParent() 
} 
+0

죄송합니다. 혼동 스럽습니다. 코드는 어디에 두어야합니까? – Aidan

관련 문제