2016-12-23 2 views
1

Я исследовал, и, безусловно, пытаюсь на некоторое время, чтобы найти способ, чтобы активировать функцию при нажатии спрайта. Например: Если вы нажмете синий спрайт, он активирует blue(). Нажмите красный спрайт, он активирует red(). Я искал какое-то время, и все ответы либо для более старых версий, либо просто не работают для меня. У кого-нибудь есть идеи?Xcode Swift 3/SpriteKit: Касание спрайтов

EDIT: Вот некоторые из моего кода, который я использую.

class GameScene: SKScene { 

     var blue = SKSpriteNode() 
     var red = SKSpriteNode() 
     var green = SKSpriteNode() 
     var help = SKLabelNode() 
     var score = SKLabelNode() 
     var points = 0 
     var loseAmount = 1.0 
     var firstAdvance = 0 
     var loseTimer = Timer() 

     override func didMove(to view: SKView) { 

      self.physicsWorld.contactDelegate = self 

      blue = self.childNode(withName: "blue") as! SKSpriteNode 
      blue.position = CGPoint(x: self.frame.width/2, y: self.frame.height/2) 
      blue.name = "blue" 
      blue.isUserInteractionEnabled = true 

      red = self.childNode(withName: "red") as! SKSpriteNode 
      red.position = CGPoint(x: self.frame.width/2 + 100, y: self.frame.height/2) 
      red.name = "red" 
      red.isUserInteractionEnabled = true 

      green = self.childNode(withName: "green") as! SKSpriteNode 
      green.position = CGPoint(x: self.frame.width/2 - 100, y: self.frame.height/2) 
      green.name = "green" 
      green.isUserInteractionEnabled = true 

      help = self.childNode(withName: "help") as! SKLabelNode 
      help.position = CGPoint(x: self.frame.width/2, y: self.frame.height/4 * 3) 
      help.name = "help" 
      help.isUserInteractionEnabled = false 

      score = self.childNode(withName: "score") as! SKLabelNode 
      score.position = CGPoint(x: self.frame.width/2, y: self.frame.height - 40) 
      score.name = "score" 
      score.text = "\(points)" 
      score.isUserInteractionEnabled = false 

     } 

     func randomMove() { 
      blue.position = CGPoint(x:Int(arc4random_uniform(244)+38),y:Int(arc4random_uniform(404)+38)) 
      red.position = CGPoint(x:Int(arc4random_uniform(244)+38),y:Int(arc4random_uniform(404)+38)) 
      green.position = CGPoint(x:Int(arc4random_uniform(244)+38),y:Int(arc4random_uniform(404)+38)) 

     } 

     func advance() { 
      if (firstAdvance == 0) { 
       firstAdvance = 1 
       help.removeFromParent() 
       points += 1 
       playPointSound() 
       randomMove() 
       loseTimer = Timer.scheduledTimer(timeInterval: loseAmount, target: self, selector: #selector(GameScene.lose), userInfo: nil, repeats: true) 

      } else if (firstAdvance == 1) { 
       points += 1 
       loseAmount -= 0.01 
       playPointSound() 
       self.loseTimer.invalidate() 
       loseTimer = Timer.scheduledTimer(timeInterval: loseAmount, target: self, selector: #selector(GameScene.lose), userInfo: nil, repeats: true) 

      } 

     } 

     func lose() { 
      playLoseSound() 
      let endSceneTemp = EndScene(fileNamed: "EndScene") 
      self.scene?.view?.presentScene(endSceneTemp!, transition: SKTransition.crossFade(withDuration: 0.1)) 
     } 

     func playPointSound() { 
      let path = Bundle.main.path(forResource: "", ofType:nil)! 
      let url = URL(fileURLWithPath: path) 

      do { 
       let sound = try AVAudioPlayer(contentsOf: url) 
       pointSound = sound 
       sound.play() 
      } catch { 
       // couldn't load file :(
      } 
     } 

     func playLoseSound() { 
      let path = Bundle.main.path(forResource: "", ofType:nil)! 
      let url = URL(fileURLWithPath: path) 

      do { 
       let sound = try AVAudioPlayer(contentsOf: url) 
       loseSound = sound 
       sound.play() 
      } catch { 
       // couldn't load file 
      } 
     } 

     override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
      for touch in (touches) { 
       let positionInScene = touch.location(in: self) 
       let touchedNode = self.atPoint(positionInScene) 
       if let name = touchedNode.name { 
        if name == "blue" { 
         advance() 
        } 
        if name == "red" || name == "green"{ 
         lose() 
        } 
       } 
      } 
     } 

     override func update(_ currentTime: TimeInterval) { 

     } 
    } 
+1

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

+0

@Confused Мои спрайты создаются через .sks-файл. На сцене не так много, кроме красного узла, синего узла и зеленого узла. Надеюсь это поможет. – DJDJ

ответ

1

вам просто нужно присвоить имя для спрайтов:

let redSpriteNode = SKSpriteNode(imageNamed: "red") // add sprite by code 
//let redSpriteNode = self.childNode(withName: "red") as! SKSpriteNode // for adding from .sks file 
redSpriteNode.name = "red" 
let blueSpriteNode = SKSpriteNode(imageNamed: "blue") 
redSpriteNode.name = "blue" 

и прикосновения начал метод активации функции желания.

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     for touch in (touches) { 
      let positionInScene = touch.location(in: self) 
      let touchedNode = self.atPoint(positionInScene) 
      if let name = touchedNode.name { 
       if name == "red" { 
        red() 
       } 
       if name == "blue" { 
        blue() 
       } 
      } 
     } 
    } 

вы можете найти все узлы с таким же именем, как это: (reference)

self.enumerateChildNodes(withName: "red") {_,_ in 
    print(count) 
    count = count + 1 
} 
+0

Это, кажется, не работает для меня по какой-то причине. Да, я использую узлы из файла .sks. Однако это все еще не работает для меня. – DJDJ

+0

@DJDJ Вы назначили имя каждому узлу, используя редактор .sks? – 0x141E

+0

Как @ 0x141E сказал, что вы должны установить имя для узлов – Mina

0

Что работало лучше для меня, чтобы добавить UITapGestureRecognizer к SKView, а затем обрабатывать кран жесты на том, что в сцена.

Когда краны сделаны вы можете получить место в виду, а затем преобразовать его в место на сцене. С этим вы можете найти nodeAtPoint: для местоположения крана.

Если у вас есть этот узел, а затем проверить свое имя и выполнять действия по этому SKSpriteNode, если его имя является тот, который вы хотите сделать что-то на кране.

В то время как вы можете сделать это с переопределение touchesBegan:, touchesMoved: и такие сэкономить немного усилий, когда вы пытаетесь захватить более сложные штрихи, такие как пинч, как вам не нужно, чтобы выяснить, что кран против долго сначала нажмите против пинча.

+0

В настоящее время у меня нет моего кода, но я попробую это сделать. – DJDJ

+0

Я не могу найти UITapGestureRecognizer, чтобы добавить, извините. Не могли бы вы рассказать или показать мне, где это добавить. – DJDJ

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