2015-02-14 4 views
-1

Я новичок в программировании, поэтому я уверен, что это простое исправление. Тем не менее, у меня есть так, что, когда я касаюсь конкретного узла спрайта, он добавляет мяч и цель. Как только я отпущу палец, он отправляет мяч в цель. Однако, если я попытаюсь отправить еще один мяч до завершения первого шара, произойдет сбой Xcode.Swift touchBegan вызывает сбой Xcode при выполнении функции в touchsEnded

Пожалуйста, помогите !!

ERROR = причина: «покушений на добавление SKNode, который уже имеет родителя:

Код:

// 
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 

      let touch = touches.anyObject() as UITouch 
      let touchLocation = touch.locationInNode(self) 

      if self.nodeAtPoint(touchLocation) == self.slingshot { 

      addBall() 
      addTarget() 

      isFingerTouching = true 

      } 
    } 




override func touchesMoved(touches: NSSet, withEvent event: UIEvent) { 
     /* Update to new touch location */ 

    if isFingerTouching { 

     var touch = touches.anyObject() as UITouch! 
     var touchLocation = touch.locationInNode(self) 
     var previousLocation = touch.previousLocationInNode(self) 


       var slingholderY = slingholder.position.y + (touchLocation.y - previousLocation.y) 
       var slingholderX = slingholder.position.x + (touchLocation.x - previousLocation.x) 

     slingholderY = min(slingholderY, 155) 
     slingholderY = max(slingholderY, 89) 

     slingholderX = min(slingholderX, CGRectGetMidX(self.frame) + 40) 
     slingholderX = max(slingholderX, CGRectGetMidX(self.frame) - 40) 

      slingholder.position = CGPointMake(slingholderX, slingholderY) 

     leftsling.yScale = (155/slingholder.position.y)*0.6 
     leftsling.xScale = (slingholder.position.x/383)*0.6 

     rightsling.yScale = (155/slingholder.position.y)*0.6 
     rightsling.xScale = (383/slingholder.position.x)*0.6 

     slingholder.yScale = (89/slingholder.position.y) 
     slingholder.xScale = (89/slingholder.position.y) 

     ball.yScale = 2*(89/slingholder.position.y) 
     ball.xScale = 2*(89/slingholder.position.y) 
     ball.position = slingholder.position 

     slingholder.zRotation = 0.3*((slingholder.position.x - 383)/40) 

     target.position.x = 768 - (9.57 * (slingholder.position.x - 343)) 
     target.position.y = max(10, 300) 
     target.position.y = (self.frame.size.height - self.scoreboard.size.height - 300) + (9.85 * (89 - slingholder.position.y) + 150) 

      } 
    } 


    override func touchesEnded(touches: NSSet, withEvent event: UIEvent) { 

     sendBall() 
     isFingerTouching = false 

    } 

    //Check if bird reaches right or left side 
    func checkIfBirdReachesOtherSide() { 
     for child in self.children { 
      if(child.position.x > self.frame.width+20) { 
       self.removeChildrenInArray([child]) 
      } 
      if(child.position.x < -20) { 
       self.removeChildrenInArray([child]) 
      } 
     } 

} 

    func addBall() { 

       ball.position = CGPointMake(CGRectGetMidX(self.frame), 155) 
       ball.xScale = 1.0 
       ball.yScale = 1.0 
       ball.zPosition = 4 
       self.addChild(ball) 

      } 

    func addTarget() { 


     target.position = CGPoint(x: CGRectGetMidX(self.frame), y: slingholder.position.y + 200) 
     target.zPosition = 4 
     self.addChild(target) 
    } 

    func sendBall() { 

     let moveToTarget = SKAction.moveTo(CGPointMake(target.position.x, target.position.y), duration: 0.5) 
     let scaleBallUp = SKAction.scaleBy(1.0, duration: 0.2) 
     let scaleBallDown = SKAction.scaleBy(0.3, duration: 0.3) 

     let delay = SKAction.waitForDuration(2) 

     let remove = SKAction.removeFromParent() 

     let sequence = SKAction.sequence([scaleBallUp, scaleBallDown, remove]) 

     let ballGroupAction = SKAction.group([moveToTarget, sequence]) 
     ball.runAction(ballGroupAction) 

     target.runAction(remove) 

     let moveSlingholder = SKAction.moveTo(CGPointMake(CGRectGetMidX(self.frame), 155), duration:1, delay: 0, usingSpringWithDamping: 0.1, initialSpringVelocity: 10.0) 

     let scaleSling = SKAction.scaleXTo(0.6, y: 0.6, duration: 1, delay: 0, usingSpringWithDamping: 0.1, initialSpringVelocity: 10.0) 

     let scaleSlingHolder = SKAction.scaleXTo(0.6, y: 0.6, duration: 1, delay: 0.2, usingSpringWithDamping: 0.1, initialSpringVelocity: 10.0) 

     let rotateSlingholder = SKAction.rotateToAngle(0, duration: 1, delay: 0, usingSpringWithDamping: 0.1, initialSpringVelocity: 10.0) 

     let slingHolderBundledMovement = SKAction.group([moveSlingholder, rotateSlingholder, scaleSlingHolder]) 


     slingholder.runAction(slingHolderBundledMovement) 
     leftsling.runAction(scaleSling) 
     rightsling.runAction(scaleSling) 

    } 

} 
// 

ответ

0

Ваша проблема заключается в методе addTarget и addBall.

Вы можете добавить SKNode только одному родителю. И там вы добавляете одну и ту же цель и тот же шар каждый раз, когда вы касаетесь экрана. Таким образом, вы должны добавить мяч и цель только один раз и обновлять позицию каждый раз.

Таким образом, вы могли бы в вашем методе didMoveToView добавить два узла:

addChild(ball) 
addChild(target) 

и обновлять только положение и т.д. в своих методах, не добавляя его каждый раз, когда метод вызывается.

+0

это имеет полный смысл. Спасибо! –

+0

Добро пожаловать. Не могли бы вы принять мой ответ, чтобы другим людям было легче? – Christian

Смежные вопросы