【问题标题】:GCVirtualController not displaying with SKSceneGCVirtualController 不与 SKScene 一起显示
【发布时间】:2021-11-26 00:45:29
【问题描述】:

虚拟控制器出现,但随后被添加到视图中的对象遮挡。我也尝试在 UIViewController 中添加虚拟控制器,但这也不起作用。

SKScene 可以直接使用 GCVirtualController 吗?

class GameScene: SKScene {
    private var _virtualController: Any?
    public var virtualController: GCVirtualController? {
        get { return self._virtualController as? GCVirtualController }
        set { self._virtualController = newValue }
    }
    override func didMove(to view: SKView) {
    let background = SKSpriteNode(imageNamed: ".jpg")
        background.zPosition = -1
        addChild(background)

        let virtualConfig = GCVirtualController.Configuration()
        virtualConfig.elements = [GCInputLeftThumbstick, GCInputRightThumbstick, GCInputButtonA, GCInputButtonB]
        virtualController = GCVirtualController(configuration: virtualConfig)
        virtualController?.connect()
    }
}

似乎只有从一个 ViewController 推送到 GameViewController 时才会出现此问题。

当启动到 GameViewController 时,问题不会发生。

【问题讨论】:

  • 将问题中的代码复制粘贴到 Xcode 13.1 中的默认“游戏”模板中会为我显示虚拟控制器(iOS 15,iPod touch 第 7 代模拟器)。
  • 嗨,Brendan,我没有意识到这个问题只发生在 GameViewController 不是启动目标时。当 GameViewController 是 Storyboard 上的入口点时,该代码确实有效,但如果另一个 ViewController 是,然后我从该 ViewController 显示我会遇到问题。我已经更新了问题以显示这一点,感谢您查看:)
  • 是的,我看到了同样的行为。我能够确定虚拟控制器确实出现了,但它出现在第二个视图控制器正在渲染的视图下方(我将第二个视图的 alpha 设置为 0.5,并且可以看到下方的控件)。不知道为什么!

标签: sprite-kit 2d-games skscene gamecontroller


【解决方案1】:

虚拟游戏控制器至少可以在任何运行 iOS 15 的视图控制器上运行,但出于工作目的,最好在横向查看,但您需要将代码作为物理游戏手柄完成。

要让虚拟游戏手柄出现,您需要注册一个物理游戏手柄,并在连接和断开控制器时应用通知功能,就像您使用物理控制器一样。

这是设置和注册我使用的虚拟和物理游戏控制器的代码,它适用于我。

首先你需要导入游戏控制器库

import GameController

然后你在你的控制器类下定义虚拟控制器

class GameViewController: UIViewController {

// Virtual Onscreen Controller
private var _virtualController: Any?
@available(iOS 15.0, *)
public var virtualController: GCVirtualController? {
  get { return self._virtualController as? GCVirtualController }
  set { self._virtualController = newValue }
}

然后你在你的 ViewDidLoad() 中调用 setupGameController 函数

override func viewDidLoad() {
    super.viewDidLoad() 

    //your code 

    setupGameController()
}

这是设置虚拟和物理游戏控制器的主要功能

func setupGameController() {
        NotificationCenter.default.addObserver(
            self, selector: #selector(self.handleControllerDidConnect),
            name: NSNotification.Name.GCControllerDidBecomeCurrent, object: nil)

        NotificationCenter.default.addObserver(
        self, selector: #selector(self.handleControllerDidDisconnect),
        name: NSNotification.Name.GCControllerDidStopBeingCurrent, object: nil)

        if #available(iOS 15.0, *)
        {
            let virtualConfiguration = GCVirtualController.Configuration()
            virtualConfiguration.elements = [GCInputLeftThumbstick,
                                         GCInputRightThumbstick,
                                         GCInputButtonA,
                                         GCInputButtonB]
            virtualController = GCVirtualController(configuration: virtualConfiguration)
        
            // Connect to the virtual controller if no physical controllers are available.
            if GCController.controllers().isEmpty {
                virtualController?.connect()
            }
        }
    
    guard let controller = GCController.controllers().first else {
        return
    }
    registerGameController(controller)
}

然后要执行虚拟或物理游戏手柄操作,您需要分配连接并注册游戏控制器 作为

func handleControllerDidConnect(_ notification: Notification) {
    guard let gameController = notification.object as? GCController else
    {
        return
    }
    unregisterGameController()
    
    if #available(iOS 15.0, *)
    {
        if gameController != virtualController?.controller
        {
            virtualController?.disconnect()
        }
    }
    registerGameController(gameController)
}

func handleControllerDidDisconnect(_ notification: Notification) {
    unregisterGameController()
    
    if #available(iOS 15.0, *) {
        if GCController.controllers().isEmpty
        {
            virtualController?.connect()
        }
    }
}

func registerGameController(_ gameController: GCController) {

    var buttonA: GCControllerButtonInput?
    var buttonB: GCControllerButtonInput?
    
    if let gamepad = gameController.extendedGamepad
    {
        buttonA = gamepad.buttonA
        buttonB = gamepad.buttonB
    }
    
    buttonA?.valueChangedHandler = {(_ button: GCControllerButtonInput, _ value: Float, _ pressed: Bool) -> Void in
        // Put here the codes to run when button A clicked
        print("Button A Pressed")
    }

    buttonB?.valueChangedHandler = {(_ button: GCControllerButtonInput, _ value: Float, _ pressed: Bool) -> Void in
        // Put here the codes to run when button B clicked
        print("Button B Pressed")
    }
}

func unregisterGameController()
{
    
}

这是一个非常基本的 Xcode 船舶样本的代码结果

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 2011-01-26
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    相关资源
    最近更新 更多