2015-08-04 2 views
1

Я работаю над своей игрой, и я застреваю в удалении действия. У меня есть набор трубок, которые движутся справа налево навсегда (например, птица-птица). Я создал трубы внутри функции и действие их перемещения внутри didMoveToView. Итак, внутри функции pipe я создаю трубы и запускаю действие. (я упростил код)Удаление действия, объявленного внутри функции

func initPipes() { 
    let pipePair = SKNode() 
    pipePair.position = CGPoint(x: self.frame.size.width + 70, y: 0) 
    //PIPE 1 
    let pipe1 = SKSpriteNode(color: SKColor.whiteColor(), size: CGSizeMake(70, 700)) 

    //here i set physics and position 

    pipePair.addChild(pipe1) 

    //PIPE 2 
    let pipe2 = SKSpriteNode(color: SKColor.whiteColor(), size: CGSizeMake(70, 700)) 

    //same as pipe1 

    pipePair.addChild(pipe2) 

    //SCORE 
    let scoreSprite = SKSpriteNode(color: SKColor.clearColor(), size: CGSize(width: 50, height: 150)) 

    pipePair.addChild(scoreSprite) 

    pipePair.runAction(moveAndRemove, withKey: "move") 
    pipes.addChild(pipePair) 

} 

При обнаружении коллизии я бег gameOver функцию. Внутри этой функции, если я пишу:

removeActionForKey("move") 

трубы продолжают двигаться. Может быть, потому, что я должен написать pipePair.removeActionForKey("move"). Но так как pipePair является локальным, я не могу этого сделать. Как я могу это решить?

+0

Является ли узел «pipe» (родительский узел pipePair) определенным как свойство? – Whirlwind

+0

Извините, я забыл об этом. Я объявил это в GameScene. –

ответ

2

Вы можете дать имя для pipePair узла:

pipePair.name = "pipePair" 

Тогда вы можете остановить "движение" действие внутри gameOver метода, как это:

let pipePair = pipes.childNodeWithName("pipePair") 

if(pipePair.actionForKey("move") != nil){ 


    pipePair.removeActionForKey("move") 
} 

Я думаю, это был бы один из способов сделать это.

+0

Я пробовал, и он не работает. –

+0

Непроверено, но вот как вы можете это сделать. Позвольте мне открыть Xcode. Между тем, можете ли вы уточнить, что не работает? Вы получаете какую-либо ошибку или просто не удалены действия? Вы уверены, что правильно назвали узел pipePair? – Whirlwind

+0

Я отредактировал ответ ... Можете ли вы попробовать еще раз? – Whirlwind

0

Попробуйте сделать переменную bool для обнаружения внутри обновления, если игра была утеряна.

class GameScene: SKScene { 
var lost = false 

override func update(currentTime: NSTimeInterval) { 

if lost { 

removeActionForKey("move") 

} 
} 

func loseGame() { 
lost = true 

} 

, когда пользователь воспроизводит игру, вы должны будете сбросить потеряли ложь, так что вы можете определить, когда пользователь фактически теряет игру снова

+0

Это то же самое. Проблема в том, что мне приходится писать pipePair.removeActionForKey («move»), поскольку это действие pipePair. Но pipePair является локальным, и я не могу объявить его снаружи. Я даже не могу создать узел pipePair снаружи, потому что игра не будет работать. Поэтому я должен разрешить это локально ... –

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