#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. Я сделал, и только салфетки не работают на симуляторе, нажатие работает!