2016-02-29 6 views
2

Я делаю игру, где, когда основной спрайт/игрок постоянно перемещается, ему нужно прыгать через барьеры.Постоянная скорость, все еще способная применить импульс

Мне нужна помощь в том, как установить постоянную скорость для моего движущегося спрайта. Когда я пытаюсь сделать это в функции обновления SpriteKit, я не могу применить импульс для перехода, когда пользователь нажимает экран.

Вот мой код. Я заметил те места, где у меня возникли проблемы:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    /* Called when a touch begins */ 
    if (gameStarted == false) { 
     gameStarted = true 

     mainSprite.physicsBody?.affectedByGravity = true 
     mainSprite.physicsBody?.allowsRotation = true 
     let spawn = SKAction.runBlock({ 
      () in 

      self.createWalls() 
     }) 


     let delay = SKAction.waitForDuration(1.5) 

     let spawnDelay = SKAction.sequence([spawn, delay]) 

     let spawnDelayForever = SKAction.repeatActionForever(spawnDelay) 

     self.runAction(spawnDelayForever) 

     let distance = CGFloat(self.frame.height + wallPair.frame.height) 

     let movePipes = SKAction.moveByX(0, y: -distance - 50, duration: NSTimeInterval(0.009 * distance)) // Speed up pipes 

     let removePipes = SKAction.removeFromParent() 

     moveAndRemove = SKAction.sequence([movePipes, removePipes]) 

    } else { 
     if died == true { 

     } 
     else { 
      mainSprite.physicsBody?.applyImpulse(CGVectorMake(0, 20)) // TRYING TO APPLY AN IMPULSE TO MY SPRITE SO IT CAN JUMP AS IT MOVES 
     } 
    } 



    for touch in touches { 
     let location = touch.locationInNode(self) 
    } 
} 

override func update(currentTime: CFTimeInterval) { 
    /* Called before each frame is rendered */ 
    updateSpritePosition() 
    mainSprite.physicsBody?.velocity = CGVectorMake(400, 0) // SETS A CONSTANT VELOCITY, HOWEVER I CAN NOT APPLY AN IMPULSE. 
} 

ответ

2

Проблема заключается в том, что вы перезапись скорости в методе update. Поэтому, хотя вы добавили импульс, он сразу же перезаписывается кодом в update. Попробуйте переписать только часть скорости.

override func update(currentTime: CFTimeInterval) { 

    updateSpritePosition() 
    mainSprite.physicsBody?.velocity = CGVectorMake(400, mainSprite.physicsBody?.velocity.dy) 
} 
+0

Большое вам спасибо! : D <3 – DevelUpGames

+0

Нет проблем! :) – RaffAl

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