2

我正在尝试使用 SiriRemote 上的暂停按钮来暂停我的游戏(SpriteKit、一个 ViewController、多个 SKScenes)。

我使用与菜单按钮相同的方法:

  1. 在我的GameViewController中覆盖pressesBeganpressesEnded
  2. 通过UIPresType播放暂停UIPressTypePlayPause事件到当前场景,通过skView.scene 访问!作为!PilotButtonDelegate(这是我处理那些该死的按钮的代表)
  3. 在我的场景中,我处理事件并将 Bool 返回给GameViewController建议pressesBeganpressesEnded调用superpressesBegan ( 或 Ended) 取决于我是否在我的场景中处理了这个。

上面的作品就像 Menu 的魅力(我很好地浏览场景),但 Pause 确实以某种方式传播回 TVOS 并暂停我的背景音乐,即使我确实拦截了它(即不要调用 super)。任何想法我做错了什么?

令人惊讶的是,再次按下 PlayPause 并不会开始播放音乐。

PS。我已经检查过,当我在任何其他应用程序(例如搜索/计算机、照片)中使用 PlayPause 按钮​​时,会发生相同的行为(例如音乐暂停但不恢复)。

4

1 回答 1

1

详细说明我上面的评论,这取决于你想要/需要什么样的手势。识别器的优点是您可以将它们添加到任何 SKScene,而不是通过 gameViewController 和委托/协议管理按钮按下。它更容易并且效果很好。

func loadTVGameControls() {

    // main (select) button
    let tapMain = UITapGestureRecognizer()
    tapMain.addTarget(self, action: "pressedTVRemoteSelectButton")
    tapMain.allowedPressTypes = [NSNumber (integer: UIPressType.Select.rawValue)]
    self.view!.addGestureRecognizer(tapMain)

    // play pause
    let tapPlayPause = UITapGestureRecognizer()
    tapPlayPause.addTarget(self, action: "pressedTVRemotePlayPauseButton")
    tapPlayPause.allowedPressTypes = [NSNumber (integer: UIPressType.PlayPause.rawValue)]
    self.view!.addGestureRecognizer(tapPlayPause)

     // menu
    let tapMenu = UITapGestureRecognizer()
    tapMenu.addTarget(self, action: "pressedTVRemoteMenuButton")
    tapMenu.allowedPressTypes = [NSNumber (integer: UIPressType.Menu.rawValue)]
    self.view!.addGestureRecognizer(tapMenu)

    // swipe right
    let rightSwipe = UISwipeGestureRecognizer(target: self, action: "swipedRightTVRemote")
    rightSwipe.direction = UISwipeGestureRecognizerDirection.Right
    self.view!.addGestureRecognizer(rightSwipe)

    // swipe left ...
    // swipe up ...
    // swipe down ...
}


func pressedTVRemoteSelectButton() {
     // do something
}

func pressedTVRemotePlayPauseButton() {
     // do something
}

func pressedTVRemoteMenuButton() {
     // do something
}

func swipedRightTVRemote() {
    // do something
}

您可以针对不同的场景执行不同的方法。在我的游戏中,我刚刚转换为 tvOS,我有 1 个像上面的例子,而在我的 GameScene.swift 中有 2 个像这样

1) loadTVPauseControls() // 游戏暂停时的新手势

2) loadTVGameOverControls() // 游戏结束时的新手势

在更改手势或转换到新场景之前,只需使用以下方法禁用手势。

// MARK: - Disable All Gestures
func disableAllGestures() {
    guard let view = view else { return }
    guard view.gestureRecognizers != nil else { return }
    for gesture in view.gestureRecognizers! {
        if let tapRecognizer = gesture as? UITapGestureRecognizer {
            view.removeGestureRecognizer(tapRecognizer)
        }
        if let swipeRecognizer = gesture as? UISwipeGestureRecognizer {
            view.removeGestureRecognizer(swipeRecognizer)
        }
    }
}
于 2015-11-13T11:33:33.393 回答