2016-01-22 2 views
0

У меня проблема, когда расстояние до моих платформ становится испорченным после достижения определенного результата. Я хочу, чтобы игра начиналась точно так же, как часть spawnDelayForever в touchhesBegan, пока счет не достигнет 5. После того, как оценка достигает 5 ... 10 ... 15 и так далее, я хочу, чтобы платформы могли ускоряться с таким же объемом пространства в между каждой икру независимо от того, что. Проблема заключается в том, когда оценка достигает 5, скорость платформ, но расстояние/пространство между каждой икрой не то же самое. Они еще больше обособлены. Кто-нибудь может мне помочь?Spritekit - Увеличивает скорость и сохраняет одинаковое расстояние между узлами спрайтов?

Надеюсь, это никого не смутило, но если бы это позволило мне прояснить это. Я просто хочу, чтобы платформы ускорялись после того, как определенная оценка была достигнута с таким же количеством пространства между каждой икрой. Значение waitForDuration должно ускоряться (менее 2.0) с каждым увеличением скорости.

Часть моего кода:

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

    if gameStarted == false { 

     gameStarted = true 

     ball.physicsBody?.affectedByGravity = true 

     title.removeFromParent() 

     let spawn = SKAction.runBlock({ 

      ()in 

      self.creatingPlatforms() 


     }) 

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

     let distance = CGFloat(self.frame.width + 170 + officialPlatform.frame.width) 
     let movePlatforms = SKAction.moveByX(-distance, y: 0, duration: NSTimeInterval(0.01 * distance)) 
     let removePlatforms = SKAction.removeFromParent() 
     moveAndRemove = SKAction.sequence([movePlatforms, removePlatforms]) 


     ball.physicsBody?.velocity = CGVectorMake(0, 0) 
     ball.physicsBody?.applyImpulse(CGVectorMake(0, 0)) 

     scoreLbl.fontSize = 35 
     scoreLbl.position = CGPoint(x: self.frame.width/2, y: scene!.frame.height/2 + 300) 
     scoreLbl.fontColor = UIColor.blackColor() 
     scoreLbl.text = "\(score)" 
     score = 0 
     self.addChild(scoreLbl) 



    } 

    else { 

     ball.physicsBody?.velocity = CGVectorMake(0, 0) 
     ball.physicsBody?.applyImpulse(CGVectorMake(0, 45)) 

     ball.physicsBody?.restitution = 0 
     scoreNode.physicsBody?.restitution = 0 

    } 
} 





func creatingPlatforms() { 

    scoreNode = SKSpriteNode() 

    scoreNode.size = CGSize(width: 120, height: 25) 
    scoreNode.position = CGPoint(x: self.frame.width + 95, y: self.frame.height/2) 
    scoreNode.physicsBody = SKPhysicsBody(rectangleOfSize: scoreNode.size) 
    scoreNode.physicsBody?.affectedByGravity = false 
    scoreNode.physicsBody?.dynamic = false 
    scoreNode.physicsBody?.categoryBitMask = physicsCategory.score 
    scoreNode.physicsBody?.collisionBitMask = 0 
    scoreNode.physicsBody?.contactTestBitMask = physicsCategory.ball 
    scoreNode.name = "scoreNode" 

    officialPlatform = SKNode() 

    let platform = SKSpriteNode(imageNamed: "platform") 

    platform.size = CGSize(width: 140, height: 25) 
    platform.position = CGPoint(x: self.frame.width + 95, y: self.frame.height/2) 
    platform.physicsBody = SKPhysicsBody(rectangleOfSize: platform.size) 
    platform.physicsBody?.categoryBitMask = physicsCategory.platform 
    platform.physicsBody?.collisionBitMask = physicsCategory.ball 
    platform.physicsBody?.contactTestBitMask = physicsCategory.ball 
    platform.physicsBody?.affectedByGravity = false 
    platform.physicsBody?.dynamic = false 

    officialPlatform.name = "official platform" 

    officialPlatform.runAction(moveAndRemove) 

    officialPlatform.addChild(platform) 
    officialPlatform.addChild(scoreNode) 

    self.addChild(officialPlatform) 




} 

override func update(currentTime: CFTimeInterval) { 
    /* Called before each frame is rendered */ 

    if score >= 5 && score <= 9 { 

     moveAndRemove.speed = 0.9 



     } 

    } 
} 
+0

Не могли бы вы добавить их все в качестве ребенка на один более крупный узел и просто переместить этот более крупный узел? –

+0

@BeauNouvelle Я не уверен, если вы имеете в виду платформу или что-то еще, но платформа, которая нерестится, находится в более крупном узле (пусть платформа = SKSpriteNode) = (officialPlatform = SKNode). В SKNode, официальная платформа, выполняется действие moveAndRemove, которое вызывается в touchhesBegan. Вопрос в том, как можно обновлять SKActions spawnDelayForever и moveAndRemove каждый раз, когда будет достигнута определенная оценка? –

ответ

0

Я нашел ответ на другой вопрос здесь. swift - Increase speed of objects over time

Я изменил мой self.runAction(spawnDelayForever) в моем touchesBegan к self.runAction(spawnDelayForever, withKey: "spawnDelayForever"). Затем в функции обновления я сменил ее на:

override func update(currentTime: CFTimeInterval) { 
    /* Called before each frame is rendered */ 

    if score > 0 { 

     self.actionForKey("spawnDelayForever")?.speed += 0.001 
     moveAndRemove.speed += 0.001 

    } 

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