TVOS: обнаружение касаний с помощью нажатия и функций (Swift Spritekit)

#sprite-kit #swift3 #tvos

#sprite-kit #swift3 #tvos

Вопрос:

я пытаюсь определить касания в TVOS с помощью нажатия, но это не работает.

я хочу подключить 3 функции

  • Запуск игры
  • Воспроизведение, приостановка музыки
  • Перезапустить игру

Игровая сцена TVOS:

  func StartGameRecognizer(gesture: UITapGestureRecognizer) {

        if isGameOver {
        } else if !isStarted {
            start()
        } else {
            hero.flip()
        }

    }

 func playPauseMusicRecognizer(gesture: UITapGestureRecognizer) {

            let onoroff = UserDefaults.standard.bool(forKey: "onoroff")

            if !onoroff { //playing is false
                Singleton.sharedInstance().pauseBackgroundMusic()
                SoundOnOff.texture = SKTexture(imageNamed:"Sound-off.png")
                UserDefaults.standard.set(true, forKey: "onoroff")
            }
            else {
                Singleton.sharedInstance().resumeBackgroundMusic()
                SoundOnOff.texture = SKTexture(imageNamed:"Sound-on.png")
                UserDefaults.standard.set(false, forKey: "onoroff")
            }
        }

func RestartGameRecognizer(gesture: UISwipeGestureRecognizer){
    print("RestartGame")
    //Re-open GameScene

    GameViewController().TitleGameOver.isHidden = true
    GameViewController().RestartButton.isHidden = true
    GameViewController().scoreTextLabel.isHidden = true
    GameViewController().highscoreTextLabel.isHidden = true
    GameViewController().ScoreBoardTV.isHidden = true
    GameViewController().Score.isHidden = true
    GameViewController().HighScore.isHidden = true
    GameViewController().NewhighscoreTextLabel.isHidden = true
    GameViewController().HomeButton.isHidden = true
    // Singleton.sharedInstance().resumeSoundEffectClickedButton()
    GameViewController().gameDidStart()


}
  

GameViewControllerTVOS:

  override func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?) {
    for press in presses {
        switch press.type {
        case .upArrow:
            print("Up Arrow")
        case .downArrow:
            print("Down arrow")
        case .leftArrow:
            print("Left arrow")
        case .rightArrow:
            print("Right arrow")
        case .select:
            print("Select")
        case .menu:
            print("Menu")
        case .playPause:
            print("Play/Pause")

        default:
        print("")
        }
    }
}
  
  • Как я могу правильно его использовать?
  • Как я могу передавать функции между сценой и контроллером просмотра?

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

Обновить:

GameSceneTvOS:

     override func didMove(to view: SKView) {

        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(GameSceneTVOS.StartGameRecognizer(gesture:)))
        tapGesture.allowedPressTypes = [NSNumber(value: UIPressType.Select.rawValue)]
        view.addGestureRecognizer(tapGesture)

        let tapGesture1 = UITapGestureRecognizer(target: self, action: #selector(GameSceneTVOS.PlaypauseMusicRecognizer(gesture:)))
        tapGesture1.allowedPressTypes = [NSNumber(value: UIPressType.PlayPause.rawValue)]
        view.addGestureRecognizer(tapGesture1)

        let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(GameSceneTVOS.RestartGameRecognizer(gesture:)))
        swipeUp.direction = UISwipeGestureRecognizerDirection.up
        self.view?.addGestureRecognizer(swipeUp)
}

**Functions :**

func StartGameRecognizer(gesture: UITapGestureRecognizer) {
        print("StartGame")

            if isGameOver {
                } else if !isStarted {
                    start()
                } else {
                    hero.flip()
                }

            }

    func PlaypauseMusicRecognizer(gesture: UITapGestureRecognizer) {
        print("PlaypauseMusic")


       let onoroff = UserDefaults.standard.bool(forKey: "onoroff")

        if !onoroff { //playing is false
            Singleton.sharedInstance().pauseBackgroundMusic()
            SoundOnOff.texture = SKTexture(imageNamed:"Sound-off.png")
            UserDefaults.standard.set(true, forKey: "onoroff")
        }
        else {
            Singleton.sharedInstance().resumeBackgroundMusic()
            SoundOnOff.texture = SKTexture(imageNamed:"Sound-on.png")
            UserDefaults.standard.set(false, forKey: "onoroff")
        }
    }


    func RestartGameRecognizer(gesture: UISwipeGestureRecognizer){
        print("RestartGame")
        //Re-open GameScene

        GameViewController().TitleGameOver.isHidden = true
        GameViewController().RestartButton.isHidden = true
        GameViewController().scoreTextLabel.isHidden = true
        GameViewController().highscoreTextLabel.isHidden = true
        GameViewController().ScoreBoardTV.isHidden = true
        GameViewController().Score.isHidden = true
        GameViewController().HighScore.isHidden = true
        GameViewController().NewhighscoreTextLabel.isHidden = true
        GameViewController().HomeButton.isHidden = true
        // Singleton.sharedInstance().resumeSoundEffectClickedButton()
        GameViewController().gameDidStart()


    }
  

введите описание изображения здесь

Ответ №1:

В вашем коде есть некоторые проблемы.

1) Этот код неверен в методе restartGame.

   GameViewController().TitleGameOver.isHidden = true
  GameViewController().RestartButton.isHidden = true
  ...
  

Вы создаете новый экземпляр GameViewController в каждой строке, вы не ссылаетесь на текущий контроллер просмотра игры.

2) Вы не должны использовать свой GameViewController для создания своего пользовательского интерфейса, вы должны делать это непосредственно в соответствующих SKScenes, используя только API SpriteKit (SKLabelNodes, SKSpriteNodes, SKNodes и т. Д.). Использование UIKit в SpriteKit, за исключением некоторых случаев, является плохой практикой.

3) Вы должны использовать touchesBegan, touchesMoved и т. Д. Непосредственно в SKScenes Для получения сенсорного ввода, не используйте метод GameViewController. Они заполняют огонь так же, как и на iOS.

Вы также можете создать распознаватели жестов в своей SKScene, чтобы получать нажатия кнопок из SiriRemote.

 /// Pressed, not tapped, main touch pad
let pressedMain = UITapGestureRecognizer(target: self, action: #selector(SOMEMETHOD))
pressedMain.allowedPressTypes = [NSNumber(value: UIPressType.select.rawValue)]
view?.addGestureRecognizer(pressedMain)

/// Pressed play pause button
let pressedPlayPause = UITapGestureRecognizer(target: self, action: #selector(SOMEMETHOD))
pressedPlayPause.allowedPressTypes = [NSNumber(value: UIPressType.playPause.rawValue)]
view?.addGestureRecognizer(pressedPlayPause)

 /// Pressed menu button
let pressedMenu = UITapGestureRecognizer(target: self, action: #selector(SOMEMETHOD))
pressedMenu.allowedPressTypes = [NSNumber(value: UIPressType.menu.rawValue)]
view?.addGestureRecognizer(pressedMenu)
  

Вы также можете использовать распознаватели жестов, если хотите

 let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(SOMEMETHOD))
rightSwipe.direction = .right
view?.addGestureRecognizer(rightSwipe)

let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(SOMEMETHOD))
leftSwipe.direction = .left
view?.addGestureRecognizer(leftSwipe)

let upSwipe = UISwipeGestureRecognizer(target: self, action: #selector(SOMEMETHOD))
upSwipe.direction = .up
view?.addGestureRecognizer(upSwipe)

let downSwipe = UISwipeGestureRecognizer(target: self, action: #selector(SOMEMETHOD))
downSwipe.direction = .down
view?.addGestureRecognizer(downSwipe)
  

Если вы используете распознаватели жестов, помните, что они добавляются в GameViewController (просмотр?.addGesture …) поэтому рекомендуется удалять их при добавлении новых или при переходе к новой сцене, где вам могут понадобиться другие.

Вызывайте этот код при выходе из сцены или добавляйте новые средства распознавания жестов.

  for gestureRecognizer in view?.gestureRecognizers ?? [] {
        view?.removeGestureRecognizer(gestureRecognizer)
    }
  

Если вы ищете полноценную поддержку micro gamepad, вам нужно будет посмотреть несколько руководств о платформе GameController.

4) Попробуйте поместить свои строковые ключи, подобные тем, которые используются для UserDefaults, в какое-либо свойство.

  enum Key: String {
     case onoroff
 }
  

и чем использовать его так

  UserDefaults.standard.set(true, forKey: Key.onoroff.rawValue)
  

чтобы избежать опечаток.

5) Вы должны последовательно следовать соглашениям Swift, некоторые из ваших методов и свойств начинаются с заглавных букв, но они не должны.

Я бы посоветовал вам реструктурировать свой код и не продолжать этот подход, пытаясь использовать GameViewController для всего этого. Все это должно быть сделано непосредственно в соответствующей SKScene.

Редактировать. Я думаю, вы неправильно вызываете селектор, попробуйте это. Если в вашей функции есть параметр, который вы бы использовали (_:), вы пытаетесь использовать (жест:) . Попробуйте это вместо этого.

  ... action: #selector(startGameRecognizer(_:))
  

Надеюсь, это поможет

Комментарии:

1. я не могу определить выбор и воспроизведение / приостановку, он не работает

2. Вам нужно добавить это в didMoveToView в вашей сцене.

3. Это то, что я сделал, оно тоже не реагирует на консоль

4. Вы должны сделать шаг назад и сначала исправить свой код. Ваш пример кода абсолютно не может быть использован в производстве. Это включает в себя удаление всего, что у вас есть в GameViewController, кроме кода по умолчанию. Сначала воссоздайте свой пользовательский интерфейс в своих SKScenes, а затем повторите попытку с помощью жестов для управления телевизором.

5. Я сделал, и только салфетки не работают на симуляторе, нажатие работает!