sprite-kit - GCVirtualController 不与 SKScene 一起显示
问题描述
虚拟控制器出现,但随后被添加到视图中的对象遮挡。我也尝试在 UIViewController 中添加虚拟控制器,但这也不起作用。
是否可以直接将 GCVirtualController 与 SKScene 一起使用?
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 时不会发生此问题。
解决方案
虚拟游戏控制器至少可以在运行 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 船舶样本的代码结果
推荐阅读
- javascript - 如何根据另一个 div jQuery 中的内容显示 div
- javascript - 带有 Vue.js 的 Laravel 5.7
- angular - firebase 身份验证无法从 iPhone 上的 facebook Messenger 工作
- r - R string matching and replace
- javascript - SOCKET.IO 不是向客户端发送新数据,而是向客户端发送旧数据(JavaScript 客户端)
- sockets - 在 Python 2.6.6 上通过代理授权 SSL 连接
- php - 根据ID点击时在网页中显示不同的数据
- android - AWS Cognito 规则无法匹配使用 aws amplify (Android) 的插入式身份验证 UI
- ruby-on-rails - Rails 5.2 急切加载多态嵌套
- node.js - fastify 在模型中未定义