Squeak.ru - шаблоны программирования

TVOS: обнаружение касаний с нажатием начала и функций (Swift Spritekit)

Я пытаюсь определить касания в 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()


    }

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

03.10.2016

Ответы:


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 (view?.addGesture...), поэтому рекомендуется удалять их при добавлении новых или переходе на новую сцену, где вам могут понадобиться другие те.

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

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

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

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

 enum Key: String {
     case onoroff
 }

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

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

чтобы не делать опечаток.

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

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

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

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

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

03.10.2016
  • я не могу определить Select и Play/Pause, он не работает 03.10.2016
  • Вам нужно добавить это в DidMoveToView в вашей сцене. 03.10.2016
  • Это то, что я сделал, он тоже не отвечает в консоли 03.10.2016
  • Вы должны сделать шаг назад и сначала исправить свой код. Ваш пример кода абсолютно не может быть использован в производстве. Это включает в себя удаление всего, что у вас есть в GameViewController, кроме кода по умолчанию. Сначала воссоздайте свой пользовательский интерфейс в SKScenes, а затем повторите попытку с помощью жестов для управления телевизором. 04.10.2016
  • Я сделал, и только свайп не работает на симуляторе, тап работает! 04.10.2016
  • Для свайпа обычно можно использовать перемещенные касания. Трекпад на пульте siri будет автоматически вызывать TouchesBegan, TouchesMoved, TouchesCancelled, TouchesEnded в ваших SKSenes. Это то же самое, как если бы вы разрабатывали игру для iPhone и хотели бы использовать сенсорный ввод. Жесты — это простой способ узнать, действительно ли вы нажимаете (не нажимаете) трекпад, кнопку паузы/воспроизведения или кнопку меню. Я обновлю свой ответ, если вам нужны определенные жесты смахивания, это тоже возможно. Дай мне 1 минуту. 04.10.2016
  • Да, я хочу использовать жест смахивания вверх. спасибо вам 04.10.2016
  • Хорошо, я поставил печать (RestartGame), но она не отображается в консоли. 04.10.2016
  • Я не знаю, это очень простой код. Добавьте его в то же место, где вы добавили другие распознаватели жестов в SKScene. Убедитесь, что вы удалили метод override func pressesBegan в вашем GameViewController. 04.10.2016
  • я удалил метод pressesBegan из GameViewController 04.10.2016
  • Не знаю, могу только предположить. Можете ли вы обновить свой вопрос своим новым кодом как для GameViewController, так и для вашего SKScene с моими предложениями. Не удаляйте свой текущий вопрос, просто добавьте новый код внизу. 04.10.2016
  • Хорошо, я добавил то, что изменил 04.10.2016
  • Куда это поставить? дляgestureRecognizers в представлении?.gestureRecognizers ?? [] {просмотреть?.removeGestureRecognizer(gestureRecognizer)} 04.10.2016
  • Обычно вы вызываете это, когда добавляете новые распознаватели или когда меняете сцену, и они больше не нужны. В вашем коде также, похоже, нет ошибки, просто меня оттолкнуло форматирование. 04.10.2016
  • Проверьте мой отредактированный ответ в конце, я считаю, что вы неправильно называете #selector. 04.10.2016
  • И вы все еще пытаетесь сделать этот GameViewController()... так что вы не изменили свой код. 04.10.2016
  • Вы не читаете мой ответ. Вы создаете новый экземпляр GameViewController в каждой строке, вы не вызываете свой текущий экземпляр. Вы вообще НЕ должны использовать UILabels, UIButtons и другие API UIKit, вы должны создавать свой пользовательский интерфейс с помощью SKLabelNodes, SKSpriteNodes и т. д. непосредственно в своих SKScenes. 04.10.2016
  • Я знаю, и это то, что я сделал. 04.10.2016
  • Нет . У вас все еще есть метки и кнопки, созданные в вашем GameViewController с помощью UIKit, а затем попробуйте вызвать их так: GameViewController().TitleGameOver.isHidden = true 04.10.2016
  • Может быть, возьмем мою электронную почту: [email protected], напиши мне и объясни, что я не в порядке 04.10.2016
  • Я не особо утруждаюсь объяснять все это. Это означает, что вы не читали/не смотрели ни одного базового руководства по SpriteKit. SKLabelNodes = hackingwithswift.com/example-code/ games/ Кнопки = nathandemick.com/2014/09 /buttons-sprite-kit-using-swift 04.10.2016
  • вам нужно увидеть мой код и, возможно, понять, почему я это сделал. зритель команды? 04.10.2016
  • Я точно знаю, что ты сделал. Вы создали весь свой пользовательский интерфейс в GameViewController, используя UIKit, а затем из своей сцены вы пытаетесь вызвать их так: GameViewController().someLabel.... . Во-первых, этот код не будет работать, потому что вы создаете новый экземпляр GameViewController, а во-вторых, вам не следует даже пытаться это сделать, потому что ваш пользовательский интерфейс должен быть выполнен в SKScenes. Поэтому, прежде чем вы продолжите использовать сенсорный ввод, вы должны удалить ВСЕ свои метки и код кнопок из GameViewController и воссоздать их в своих SKScenes с помощью SKLabelNodes, SKSpriteNodes и т. д. 04.10.2016
  • В вашем методе #selector замените жест на _ и посмотрите, что произойдет. Вы действительно должны исправить свою игру, прежде чем продолжить с SiriRemote. 04.10.2016
  • Исправьте свой пользовательский интерфейс, как я предложил, прежде чем продолжить. Прежде чем ваш проект станет больше и больше 04.10.2016
  • Прохладный. В вашем GameViewController не должно быть кода, кроме кода по умолчанию, который вы получаете с игровым шаблоном. Все должно быть сделано в SKScenes. Вы должны представить, что GameViewController управляет всеми вашими сценами. Поэтому, если у вас есть несколько сцен, которые в конечном итоге у вас будут, все ваши метки будут отображаться на всех сценах, и вам придется вручную удалить их. И это будет безумие. Если вы используете API-интерфейсы SpriteKit, вам не нужно ни о чем беспокоиться, сцена всегда запускается в чистом состоянии. 04.10.2016
  • Если материал селектора по-прежнему не работает, синтаксис google #selector в swift. 04.10.2016
  • В SpriteKit на TvOS мне нужно использовать только в игровой сцене. Нет игрового контроллера 04.10.2016
  • Да, вы никогда не используете GameViewController в играх SpriteKit. Единственная работа GameViewControllers — представлять/управлять всеми сценами, вот и все. На данный момент у вас есть только 1 GameScene, но что произойдет, если вам понадобится MenuScene, ShopScene, SettingsScene и т. д.? С твоим старым способом все начало бы разваливаться в этот момент, потому что твои ярлыки появлялись бы во всех сценах. Вот почему вы должны использовать только API-интерфейсы SpriteKit, такие как SKLabelNodes, SKSpriteNodes, чтобы этого не произошло. 04.10.2016
  • Вы также должны прочитать этот вопрос, на который я недавно ответил «быстро, как обращаться с контроллерами представления для моей игры»> stackoverflow.com/questions/39085221/ 04.10.2016
  • Привет, я все исправил, но смахивание вверх для перезапуска игры не работает. 12.10.2016
  • Не знаю, проверьте ваше утверждение if. То, что вы написали, на самом деле не имеет смысла if isGameOver { } else if !isStarted { start() } else { hero.flip() } } 12.10.2016
  • Вы вызываете правильный селектор жестом смахивания вверх? 12.10.2016
  • Может быть, мне нужно использовать UIButton, чтобы перезапустить игру? 12.10.2016
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...