2015-09-12 1 views
0

Я хочу создать игру, где каждый раз, когда пользователь прикасается, он переключается между одним из двух состояний. Чтобы отслеживать штрихи, я сделал переменную userTouches, которая изменяется от истины до значения false каждый раз, когда пользователь прикасается. Я хочу сделать так, чтобы, если numberOfTouches истинно, он обновляет текстуру до состояния 0; если он неверен, он обновляет текстуру до состояния1. Довольно просто переключение между state0 и state1 для каждого касания.Удаление спрайта в инструкции if с помощью SpriteKit

var userTouches: Bool = true 


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


    for touch in (touches as! Set<UITouch>) { 
     userTouches = !userTouches 

    } 



    let centered = CGPoint(x: size.width/2, y: size.height/2) 





    let state0 = SKTexture(imageNamed:"state0") 


    let state1 = SKTexture(imageNamed:"state1") 


    var activeState: SKSpriteNode = SKSpriteNode(texture: state0) 

    //Add new state0 if it's odd, remove old state0 if it's not. 
    if userTouches == true { 
     activeState.texture = state0 
    println("IT'S TRUE") 
    } else { 
     activeState.texture = state1 
    println("IT'S FALSE") 
    } 

    self.addChild(activeState) 
    activeState.name = "state0" 
    activeState.xScale = 0.65 
    activeState.yScale = 0.65 
    activeState.position = centered 

} 

Когда я запускаю код, новые текстуры добавляются в соответствии с условиями, но старые все еще там. Они добавляются как новые спрайноды в сцене. Я не хочу это. Я ожидал, что он просто переключится между текстурами (state0 и state1) в spritenode activeState в зависимости от моей логической переменной. Как я могу переключать свой код между текстурами каждый раз, когда пользователь нажимает, вместо того, чтобы накладывать новые спрайноды друг на друга?

+0

Попробуйте сделать '' println() 'журналы и сообщить нам, что происходит. Как внутри ваших if-утверждений, чтобы убедиться, что они действительно вызваны вообще. Кроме того, я бы не использовал целые числа для условных выражений. Вместо этого я использовал бы булевский язык. По-моему, использование 'true' или' false' намного проще. –

+0

Я отредактировал свой код в соответствии с вашим предложением (логическим), и он все еще имеет схожие проблемы. Я также попытался сделать так, чтобы один spritenode переключался между двумя текстурами, но это, похоже, не работает. Тест 'println()' работал, поэтому я знаю, что на самом деле вызывается инструкция if. Я отправил свой новый код, чтобы помочь вам понять, что происходит. – ntheo

+0

Вы не понимаете основную ошибку. Вы создаете локальные объекты и добавляете их в сцену. В следующий раз вы создадите новый локальный объект и работаете с новым локальным объектом. В вашем коде у вас нет доступа к старому объекту, который был создан на последнем шаге. Проверьте ответ, который я оставил ниже, и попытайтесь понять, что вы делаете неправильно –

ответ

1

Каждый раз, когда вы создаете новый объект, измените его текстуру (текстуру нового объекта, но не текстуру объекта, которая была настроена в последний раз) и добавьте ее в сцену. Вот почему новые объекты добавляются и ничего не происходит со старыми объектами. ли это, и это будет решить вашу проблему:

  1. Создание текстур и объектов SKSpriteNode вне touchesBegan функции
  2. Если у вас нет инициализации на сцене, создать объект SKSpriteNode на didMoveToView функции, например, и добавить его в сцену
  3. Тогда в touchesBegan функции только установить текстуры объекта SKSpriteNode

это будет выглядеть примерно так:

class GameScene: SKScene { 
... 
    let state0 = SKTexture(imageNamed:"state0") 
    let state1 = SKTexture(imageNamed:"state1") 
    var activeState: SKSpriteNode? 

... 
    override func didMoveToView(view: SKView) {   
     let centered = CGPoint(x: size.width/2, y: size.height/2) 
     activeState = SKSpriteNode(texture: state0) 
     self.addChild(activeState!) 
     activeState!.name = "state0" 
     activeState!.xScale = 0.65 
     activeState!.yScale = 0.65 
     activeState!.position = centered 
    } 
... 
    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { 
     if userTouches { 
      activeState!.texture = state0 
     } else { 
      activeState!.texture = state1 
     } 
    } 
... 
} 
Смежные вопросы