我正在创建一个Android项目,我必须将android wearable智能手表作为游戏控制器,它可以向连接到该智能手表的手持设备上运行的游戏发送命令BLE(Bluetooth Low Energy).
我在可穿戴设备上设计了控制器垫,可以在控制器键盘的软按钮上发送一些硬编码文本到手持设备应用程序.问题是,我必须用手持设备上运行的游戏所期望的游戏命令格式替换该文本.并且,在手持设备上运行的应用程序可以通过可穿戴服务来收听文本.我知道,第三方游戏不会运行任何可穿戴服务,因此第三方游戏将如何接受/收听可穿戴智能手表发送的命令.
我将如何创建一个"游戏手柄",它似乎是DirectInput应用程序作为普通游戏控制器,但其控件的状态实际上是由软件定义的?
我在这里遵循了这个教程:https://cartoonsmart.com/how-to-support-external-game-controllers-with-swift-2-and-sprite-kit-for-the-new-apple-tv/ to在sprite工具包中将外部游戏控制器连接到apple tv,但我无法使用教程代码.我没有得到任何错误消息,但它根本无法正常工作.这是我的代码:
func setUpControllerObservers() {
NotificationCenter.default.addObserver(self, selector: #selector(connectControllers), name: NSNotification.Name.GCControllerDidConnect, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(disconnectController), name: NSNotification.Name.GCControllerDidDisconnect, object: nil)
}
func connectControllers() {
var count = 0
for controller in GCController.controllers() {
count = count + 1
print(count)
print(controller.extendedGamepad != nil)
print(controller.microGamepad != nil)
print(controller.gamepad != nil)
if (controller.extendedGamepad != nil && controller.playerIndex == .indexUnset) {
if (count == 1) {
controller.playerIndex = .index1
}
else if (count == 2) {
controller.playerIndex = .index2
}
else …Run Code Online (Sandbox Code Playgroud) 我正在尝试将以下代码用作 macOS 命令行工具。重要的是这不是 Cocoa 应用程序,所以这不是一个选项。
相同的代码在具有 Cocoa App 目标的同一个项目中完美运行并检测到兼容的控制器,但是当作为命令行工具目标运行时,没有任何反应并且 API 显示没有连接控制器。
显然,其中一些是人为设计的……这只是我可以将其归结为最简单的方法,并在实际工作时对发生的事情有一些指示。
#import <Cocoa/Cocoa.h>
#import <GameController/GameController.h>
int main( int argc, const char * argv[] )
{
@autoreleasepool
{
NSApplication * application = [NSApplication sharedApplication];
NSNotificationCenter * center = [NSNotificationCenter defaultCenter];
[center addObserverForName: GCControllerDidConnectNotification
object: nil
queue: nil
usingBlock: ^(NSNotification * note) {
GCController * controller = note.object;
printf( "ATTACHED: %s\n", controller.vendorName.UTF8String );
}
];
[application finishLaunching];
bool shouldKeepRunning = true;
while (shouldKeepRunning)
{
printf( "." );
while (true)
{
NSEvent …Run Code Online (Sandbox Code Playgroud) 到目前为止,我一直在使用 Apple 的 GameController 框架,但不可能使控制器振动。我正在寻找类似于 Unity 的东西Handheld.Vibrate(),但最后几个小时的研究让我相信没有简单的 API。
是否可以使用 Xcode 使与 macOS/iOS 配对的游戏控制器振动?(可能通过直接向控制器发送信号)
我想映射Xbox 360控制器上的Xbox指南按钮.
我一直在寻找可能的解决方案一段时间,从我的谷歌搜索结果的外观来看,似乎唯一的方法是使用自定义驱动程序.
但是,我今天尝试使用Steam Big Picture模式,并惊讶地发现Valve已经设法实现了这个以打开Steam Overlay.那么为什么我找不到有关如何做到这一点的任何信息呢?有没有人知道他们是如何做到的?
除了自定义驱动程序之外,我想过可能的解决方案,我想知道你是否可以从控制器读取原始数据?按钮必须发送一个信号,以便可以检测到它被按下的时间,对吧?
任何帮助深表感谢.
B默认情况下,游戏控制器按钮会退出应用程序并导航回 tvOS 主屏幕。起初我认为这很直观,但很快意识到这就是 Nimbus MENU 按钮(控制器的中间部分)的用途,而且我实际上想B在游戏中使用按钮。
为按钮设置更改处理程序B有效,但释放按钮时应用程序仍会退出。
GCControllerButtonValueChangedHandler buttonBHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
NSLog(@"B");
};
Run Code Online (Sandbox Code Playgroud) 我在拦截键盘事件时遇到问题。我已经将我的iOS与SteelSeries Free(游戏手柄控制器)相连,当连接到iOS时,它将被检测为蓝牙键盘。当我打开Notes时进行了测试,按下游戏手柄中的任何按钮都会写一个字母。
我需要拦截此按钮的按下并运行自己的功能,但不幸的是我无法这样做。
我一直在尝试使用GCController,但显然未将其检测为Game Controller对象。当我打印计数时,它显示为0。下面是我的代码。
let gameControllers = GCController.controllers() as! [GCController]
println("configureConnectedGameControllers count: \(gameControllers.count)")
Run Code Online (Sandbox Code Playgroud)
因此,我认为这是因为游戏手柄被检测为蓝牙键盘,因此未将其检测为游戏控制器。因此,我尝试改用UIKeyCommand。下面是我的代码:
override func viewDidLoad() {
super.viewDidLoad()
var keys = [UIKeyCommand]()
for digit in "abcdefghijklmnopqrstuvwxyz"
{
keys.append(UIKeyCommand(input: String(digit), modifierFlags: .Command, action: Selector("keyPressed:")))
keys.append(UIKeyCommand(input: String(digit), modifierFlags: .Control, action: Selector("keyPressed:")))
keys.append(UIKeyCommand(input: String(digit), modifierFlags: nil, action: "pressKey"))
}
}
override func canBecomeFirstResponder() -> Bool {
return true
}
func keyPressed(command: UIKeyCommand) {
println("another key is pressed") //never gets called
}
func pressKey() {
println("a key is pressed")
}
Run Code Online (Sandbox Code Playgroud)
但是即使使用上述实现,当我按下游戏手柄上的按钮时,控制台上也不会打印任何内容。
这使我感到困惑。因此,如果您对此有任何答案,请帮助我。提前致谢!
我正在开发支持游戏控制器的 OS X 应用程序。它必须支持源自 IOKit HID 和 GameController.framework 的控制器。我面临的问题是大多数 MFi GameController.framework 兼容控制器也是隐藏设备。因此,MFi 控制器在控制器列表中出现了两次,分别是 GCController 和 IOHIDDevice。有没有办法在它们之间建立连接,忽略 HID 设备?
GCController 对象拥有私有属性deviceRef,指向底层 hid 设备,使得在 HID 层识别和忽略设备成为可能。问题是这deviceRef是一个私有财产,所以我不能在 App Store 应用程序中使用它。
理想的解决方案是识别 IOHIDDeviceRef 是 MFi 设备的一种方法,因此我可以在我的 HID 层中完全跳过它。
在UIKit中,我们可以使用GCEventViewController通过设置controllerUserInteractionEnabled = false来拦截游戏控制器将Home按钮按下传播给响应者(并让他们退出我们的应用程序)
SwiftUI 应用程序不使用 ViewController,因此,除了复活一个将整个应用程序嵌入其中之外,我们无法使用上述解决方案来避免玩家因按错按钮而意外遗漏游戏/应用程序(我们不能使用按钮B)
有谁知道这个难题的解决方案?Apple 是否已经实施了一种新方法来拦截高级事件,以便我们可以在内部处理它们?
谢谢!
我正在尝试在物理游戏控制器设备和虚拟设备 (vJoy) 之间建立 1 对 1 的映射。我想要实现的是,当在物理设备上按下没有 X 的按钮时,使在虚拟设备上按下没有 X 的按钮。
由于我正在尝试在物理和虚拟控制器按钮和轴之间进行 1-1 映射,因此我不应该与映射有任何关系。所以我决定使用 SDL2 库的“Joystick”相关函数而不是“GameController”相关函数。
输入(物理)=> MyApp => 输出(vJoy)
我可以与几乎所有控制器实现一一对应,除了一个 PS4 控制器。
通过 SDL 输入读取函数(下面的代码),我得到这些:
当我按下左肩按钮时,event.jbutton.button 显示 9
当我按下右肩按钮时,event.jbutton.button显示10
(它还在游戏控制器模式下显示 9 和 10,而不是操纵杆模式,相同。我确认我没有错误地使用控制器模式,通过在其他控制器上尝试相同的方法而不进行任何更改)
SDL_Init(SDL_INIT_JOYSTICK | SDL_INIT_EVENTS);
SDL_JoystickEventState(SDL_ENABLE);
SDL_Event event;
while(SDL_WaitEventTimeout(&event, 50))
{
switch(event.type){
case SDL_JOYDEVICEADDED:
m_Joystick = SDL_JoystickOpen(device);
break;
//
case SDL_JOYBUTTONDOWN:
case SDL_JOYBUTTONUP:
qDebug() << "JoystickButton(" << QString(SDL_GameControllerGetStringForButton((SDL_GameControllerButton)event.jbutton.button)) << ")" << event.jbutton.button<< " -> " << event.jbutton.state;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我用其他工具测试它时,他们给出了左肩 4 和右肩 5 作为按钮编号。
0-) …