2017-02-11 23 views
0

Если я касаюсь, кроме кнопок, игра падает. Что я могу сделать? И как? Я хочу игнорировать все касания, которые помимо кнопок. Как я могу это сделать? Вот мой touchesBegan:Swift 3 моя игра над кодом работает некорректно

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    let touch = touches.first 
    if let location = touch?.location(in: self), 
     let node = self.nodes(at: location).first { 

     var player = SKSpriteNode() 

     if node.name == "BlueButton" { 
      player = playerB 
      playerB.isHidden = false 

     } else if node.name == "RedButton" { 
      player = playerR 
      playerR.isHidden = false 

     } else if node.name == "YellowButton" { 
      player = playerY 
      playerY.isHidden = false 

     } else if node.name == "GreenButton" { 
      player = playerG 
      playerG.isHidden = false 

     } 
     for sprite in [playerB, playerW, playerR, playerY, playerG] { 
      sprite?.removeFromParent() 
     } 
     player.position = CGPoint(x: 0, y: -60) 
     addChild(player) 
    } 

} 

Вот моя touchesEnded функция

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
    addChild(playerW) 
    playerB.removeFromParent() 
    playerR.removeFromParent() 
    playerY.removeFromParent() 
    playerG.removeFromParent() 

} 
+0

Я понимаю ваш английский. Я также отмечаю, что ваш final * else * is * gameOver() *. Несмотря на ** не ** отладка вашего кода (извинения), мой вопрос таков: всегда ли это ударяется? Что еще до хороших вопросов, можете ли вы дать мне что-то, что я могу проверить и воспроизвести? Проводили ли вы дебют с контрольными точками? – dfd

+0

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

+0

И у меня нет точек останова. Он просто не работает правильно –

ответ

0

Из обсуждения в моем другом ответе угадать, что сложность вашего touchesBegan приводит к тому, что вы иногда добавляете несколько версий игрового спрайта. Ниже следует добавить только каждый playerSprite раз и только один в то время, который должен сделать его легче избежать непреднамеренных контактов вследствие спрайтов покрывающих спрайтов и т.д ...

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    let touch = touches.first 
    if let location = touch?.location(in: self), 
     let node = self.nodes(at: location).first { 

     var player = SKSpriteNode() 

     if node.name == "BlueButton" { 
      player = playerB 
     } else if node.name == "RedButton" { 
      player = playerR 
     } else if node.name == "YellowButton" { 
      player = playerY 
     } else if node.name == "GreenButton" { 
      player = playerG 
     } 
     for sprite in [playerB, playerW, playerR, playerY, playerG] { 
      sprite.removeFromParent() 
     } 
     player.position = CGPoint(x: 0, y: -50) 
     addChild(player) 
    } 
} 
+0

Теперь его работа! Спасибо!! Я действительно в долгу !!!! –

+0

:-) Рад это услышать. –

+0

По-прежнему нет:/проблема такая же, как раз позже ... если я нажму зеленую кнопку после желтой кнопки или после синей кнопки нажмите зеленую кнопку и реверс:/ –

1

Я думаю, что это условие

if firstBody.node?.name == "BLUE" && secondBody.node?.name == "BLUEBLOCK" || 
    firstBody.node?.name == "RED" && secondBody.node?.name == "REDBLOCK" || 
    firstBody.node?.name == "YELLOW" && secondBody.node?.name == "YELLOWBLOCK" && 
    firstBody.node?.name == "GREEN" && secondBody.node?.name == "GREENBLOCK" 

должно выглядеть

if (firstBody.node?.name == "BLUE" && secondBody.node?.name == "BLUEBLOCK") || 
    (firstBody.node?.name == "RED" && secondBody.node?.name == "REDBLOCK") || 
    (firstBody.node?.name == "YELLOW" && secondBody.node?.name == "YELLOWBLOCK") || 
    (firstBody.node?.name == "GREEN" && secondBody.node?.name == "GREENBLOCK") 

It Stil l выглядит уродливым, но нужно работать

+0

Конечно, если все узлы имеют правильные имена ... –

+0

Проблема одна и та же:/ –

1

ОК, откровенно говоря, это немного беспорядок, в частности функция didBeginContact. Если я правильно прочитаю, вы должны сделать что-то вроде этого:

  • Любой контакт с «белым» блоком должен заканчивать игру.
  • Для других цветов контакты со всеми, кроме один конкретный цвет должен заканчиваться.
  • Контакт с конкретный цвет должен увеличивать счет.

Если это действительно то, что мы стремимся к чему-то вроде ниже, вероятно, следует работать, хотя я бы рекомендовал дальнейший рефакторинг, чтобы избежать основывая такую ​​важную часть вашей игровой логики на Flakey сравнения строк:

func didBegin(_ contact: SKPhysicsContact) { 
    guard let nodeA = contact.bodyA.node else { 
     // this and the one blow are good places to add a breakpoint to inspect what's going on if still having problems 
     return 
    } 
    guard let nodeB = contact.bodyB.node else { 
     return 
    } 

    // Some Bools to make the below logic more readable 
    let blueContacted = nodeA.name == "BLUEBLOCK" || nodeB.name == "BLUEBLOCK" 
    let redContacted = nodeA.name == "REDBLOCK" || nodeB.name == "REDBLOCK" 
    let yellowContacted = nodeA.name == "YELLOWBLOCK" || nodeB.name == "YELLOWBLOCK" 
    let greenContacted = nodeA.name == "GREENBLOCK" || nodeB.name == "GREENBLOCK" 

    var removableNodeName: String? 

    if blueContacted && yellowContacted { 
     removableNodeName = "YELLOWBLOCK" 
    } else if redContacted && greenContacted { 
     removableNodeName = "GREENBLOCK" 
    } else if yellowContacted && blueContacted { 
     removableNodeName = "BLUEBLOCK" 
    } else if greenContacted && redContacted { 
     removableNodeName = "REDBLOCK" 
    } 

    if let nodeName = removableNodeName { 
     score += 1 
     scoreLabel?.text = "\(score)" 
     if nodeA.name == nodeName { 
      nodeA.run(SKAction.move(to: CGPoint(x: 0 , y: 360), duration: 0.3)) 
      nodeA.run(SKAction.fadeOut(withDuration: 0.3)) 
     } else { 
      nodeB.run(SKAction.move(to: CGPoint(x: 0 , y: 360), duration: 0.3)) 
      nodeB.run(SKAction.fadeOut(withDuration: 0.3)) 
     } 
    } else { // Any other contact means game over 
     nodeA.removeFromParent() 
     nodeB.removeFromParent() 
     score = 0 
     scoreLabel?.text = "\(score)" 
     gameOver() 
    } 
} 

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

+0

Я получаю фатальное сообщение об ошибке, когда я использую этот код .. (неожиданно нашел нуль при распаковке Необязательное значение) –

+0

Где именно? Возможно, в части, создающей Bools?Если это так, это указывает на то, что у вас есть какие-то контакты, регистрирующие, что вас не волнует ИЛИ, что вы не настроили узлы с именами ... –

+0

let nodeA = contact.bodyA.node! или пусть nodeB = contact.bodyB.node! наверх –