1
0

引入IDeviceBinder接口,以利用编译报错补充应该编写的代码,避免漏掉

This commit is contained in:
ALIENJACK\alien 2025-03-31 18:25:07 +08:00
parent fbe47bce1b
commit 6cc7b2fb4b
10 changed files with 447 additions and 226 deletions
AxibugEmuOnline.Client/Assets/Script/AppMain/Manager

View File

@ -22,57 +22,113 @@ namespace AxibugEmuOnline.Client.Settings
public abstract class EssgeeKeyBinding : EmuCoreControllerKeyBinding<EssgeeSingleKey>
{
protected override void OnRegistDevices(InputDevice_D device, BindingPage binding)
public override void Bind(Keyboard_D device, ControllerBinder controller)
{
if (device is Keyboard_D keyboard)
switch (controller.ControllerIndex)
{
switch (binding.ControllerIndex)
{
case 0:
binding.SetBinding(EssgeeSingleKey.OPTION_1, keyboard.Return, 0);
binding.SetBinding(EssgeeSingleKey.OPTION_2, keyboard.RightShift, 0);
binding.SetBinding(EssgeeSingleKey.UP, keyboard.W, 0);
binding.SetBinding(EssgeeSingleKey.DOWN, keyboard.S, 0);
binding.SetBinding(EssgeeSingleKey.LEFT, keyboard.A, 0);
binding.SetBinding(EssgeeSingleKey.RIGHT, keyboard.D, 0);
binding.SetBinding(EssgeeSingleKey.BTN_1, keyboard.J, 0);
binding.SetBinding(EssgeeSingleKey.BTN_2, keyboard.K, 0);
binding.SetBinding(EssgeeSingleKey.BTN_3, keyboard.U, 0);
binding.SetBinding(EssgeeSingleKey.BTN_4, keyboard.I, 0);
break;
case 1:
binding.SetBinding(EssgeeSingleKey.OPTION_1, keyboard.Keypad0, 0);
binding.SetBinding(EssgeeSingleKey.OPTION_2, keyboard.Delete, 0);
binding.SetBinding(EssgeeSingleKey.UP, keyboard.UpArrow, 0);
binding.SetBinding(EssgeeSingleKey.DOWN, keyboard.DownArrow, 0);
binding.SetBinding(EssgeeSingleKey.LEFT, keyboard.LeftArrow, 0);
binding.SetBinding(EssgeeSingleKey.RIGHT, keyboard.RightArrow, 0);
binding.SetBinding(EssgeeSingleKey.BTN_1, keyboard.Keypad1, 0);
binding.SetBinding(EssgeeSingleKey.BTN_2, keyboard.Keypad2, 0);
binding.SetBinding(EssgeeSingleKey.BTN_3, keyboard.Keypad3, 0);
binding.SetBinding(EssgeeSingleKey.BTN_4, keyboard.Keypad4, 0);
break;
}
case 0:
controller.SetBinding(EssgeeSingleKey.OPTION_1, device.Return, 0);
controller.SetBinding(EssgeeSingleKey.OPTION_2, device.RightShift, 0);
controller.SetBinding(EssgeeSingleKey.UP, device.W, 0);
controller.SetBinding(EssgeeSingleKey.DOWN, device.S, 0);
controller.SetBinding(EssgeeSingleKey.LEFT, device.A, 0);
controller.SetBinding(EssgeeSingleKey.RIGHT, device.D, 0);
controller.SetBinding(EssgeeSingleKey.BTN_1, device.J, 0);
controller.SetBinding(EssgeeSingleKey.BTN_2, device.K, 0);
controller.SetBinding(EssgeeSingleKey.BTN_3, device.U, 0);
controller.SetBinding(EssgeeSingleKey.BTN_4, device.I, 0);
break;
case 1:
controller.SetBinding(EssgeeSingleKey.OPTION_1, device.Keypad0, 0);
controller.SetBinding(EssgeeSingleKey.OPTION_2, device.Delete, 0);
controller.SetBinding(EssgeeSingleKey.UP, device.UpArrow, 0);
controller.SetBinding(EssgeeSingleKey.DOWN, device.DownArrow, 0);
controller.SetBinding(EssgeeSingleKey.LEFT, device.LeftArrow, 0);
controller.SetBinding(EssgeeSingleKey.RIGHT, device.RightArrow, 0);
controller.SetBinding(EssgeeSingleKey.BTN_1, device.Keypad1, 0);
controller.SetBinding(EssgeeSingleKey.BTN_2, device.Keypad2, 0);
controller.SetBinding(EssgeeSingleKey.BTN_3, device.Keypad3, 0);
controller.SetBinding(EssgeeSingleKey.BTN_4, device.Keypad4, 0);
break;
}
else if (device is PSVController_D psvCon && binding.ControllerIndex == 0)
}
public override void Bind(PSVController_D device, ControllerBinder controller)
{
switch (controller.ControllerIndex)
{
binding.SetBinding(EssgeeSingleKey.OPTION_1, psvCon.Start, 0);
binding.SetBinding(EssgeeSingleKey.OPTION_2, psvCon.Select, 0);
binding.SetBinding(EssgeeSingleKey.UP, psvCon.Up, 0);
binding.SetBinding(EssgeeSingleKey.DOWN, psvCon.Down, 0);
binding.SetBinding(EssgeeSingleKey.LEFT, psvCon.Left, 0);
binding.SetBinding(EssgeeSingleKey.RIGHT, psvCon.Right, 0);
binding.SetBinding(EssgeeSingleKey.BTN_1, psvCon.Cross, 0);
binding.SetBinding(EssgeeSingleKey.BTN_2, psvCon.Circle, 0);
binding.SetBinding(EssgeeSingleKey.BTN_3, psvCon.Square, 0);
binding.SetBinding(EssgeeSingleKey.BTN_4, psvCon.Triangle, 0);
//PSV 摇杆
binding.SetBinding(EssgeeSingleKey.UP, psvCon.LeftStick.UP, 1);
binding.SetBinding(EssgeeSingleKey.DOWN, psvCon.LeftStick.Down, 1);
binding.SetBinding(EssgeeSingleKey.LEFT, psvCon.LeftStick.Left, 1);
binding.SetBinding(EssgeeSingleKey.RIGHT, psvCon.LeftStick.Right, 1);
case 0:
controller.SetBinding(EssgeeSingleKey.OPTION_1, device.Start, 0);
controller.SetBinding(EssgeeSingleKey.OPTION_2, device.Select, 0);
controller.SetBinding(EssgeeSingleKey.UP, device.Up, 0);
controller.SetBinding(EssgeeSingleKey.DOWN, device.Down, 0);
controller.SetBinding(EssgeeSingleKey.LEFT, device.Left, 0);
controller.SetBinding(EssgeeSingleKey.RIGHT, device.Right, 0);
controller.SetBinding(EssgeeSingleKey.BTN_1, device.Cross, 0);
controller.SetBinding(EssgeeSingleKey.BTN_2, device.Circle, 0);
controller.SetBinding(EssgeeSingleKey.BTN_3, device.Square, 0);
controller.SetBinding(EssgeeSingleKey.BTN_4, device.Triangle, 0);
controller.SetBinding(EssgeeSingleKey.UP, device.LeftStick.Up, 1);
controller.SetBinding(EssgeeSingleKey.DOWN, device.LeftStick.Down, 1);
controller.SetBinding(EssgeeSingleKey.LEFT, device.LeftStick.Left, 1);
controller.SetBinding(EssgeeSingleKey.RIGHT, device.LeftStick.Right, 1);
break;
}
}
public override void Bind(DualShockController_D device, ControllerBinder controller)
{
controller.SetBinding(EssgeeSingleKey.OPTION_1, device.Options, 0);
controller.SetBinding(EssgeeSingleKey.OPTION_2, device.Share, 0);
controller.SetBinding(EssgeeSingleKey.UP, device.Up, 0);
controller.SetBinding(EssgeeSingleKey.DOWN, device.Down, 0);
controller.SetBinding(EssgeeSingleKey.LEFT, device.Left, 0);
controller.SetBinding(EssgeeSingleKey.RIGHT, device.Right, 0);
controller.SetBinding(EssgeeSingleKey.BTN_1, device.Cross, 0);
controller.SetBinding(EssgeeSingleKey.BTN_2, device.Circle, 0);
controller.SetBinding(EssgeeSingleKey.BTN_3, device.Square, 0);
controller.SetBinding(EssgeeSingleKey.BTN_4, device.Triangle, 0);
controller.SetBinding(EssgeeSingleKey.UP, device.LeftStick.Up, 1);
controller.SetBinding(EssgeeSingleKey.DOWN, device.LeftStick.Down, 1);
controller.SetBinding(EssgeeSingleKey.LEFT, device.LeftStick.Left, 1);
controller.SetBinding(EssgeeSingleKey.RIGHT, device.LeftStick.Right, 1);
}
public override void Bind(GamePad_D device, ControllerBinder controller)
{
controller.SetBinding(EssgeeSingleKey.OPTION_1, device.Start, 0);
controller.SetBinding(EssgeeSingleKey.OPTION_2, device.Select, 0);
controller.SetBinding(EssgeeSingleKey.UP, device.Up, 0);
controller.SetBinding(EssgeeSingleKey.DOWN, device.Down, 0);
controller.SetBinding(EssgeeSingleKey.LEFT, device.Left, 0);
controller.SetBinding(EssgeeSingleKey.RIGHT, device.Right, 0);
controller.SetBinding(EssgeeSingleKey.BTN_1, device.South, 0);
controller.SetBinding(EssgeeSingleKey.BTN_2, device.East, 0);
controller.SetBinding(EssgeeSingleKey.BTN_3, device.West, 0);
controller.SetBinding(EssgeeSingleKey.BTN_4, device.North, 0);
controller.SetBinding(EssgeeSingleKey.UP, device.LeftStick.Up, 1);
controller.SetBinding(EssgeeSingleKey.DOWN, device.LeftStick.Down, 1);
controller.SetBinding(EssgeeSingleKey.LEFT, device.LeftStick.Left, 1);
controller.SetBinding(EssgeeSingleKey.RIGHT, device.LeftStick.Right, 1);
}
public override void Bind(XboxController_D device, ControllerBinder controller)
{
controller.SetBinding(EssgeeSingleKey.OPTION_1, device.Menu, 0);
controller.SetBinding(EssgeeSingleKey.OPTION_2, device.View, 0);
controller.SetBinding(EssgeeSingleKey.UP, device.Up, 0);
controller.SetBinding(EssgeeSingleKey.DOWN, device.Down, 0);
controller.SetBinding(EssgeeSingleKey.LEFT, device.Left, 0);
controller.SetBinding(EssgeeSingleKey.RIGHT, device.Right, 0);
controller.SetBinding(EssgeeSingleKey.BTN_1, device.A, 0);
controller.SetBinding(EssgeeSingleKey.BTN_2, device.B, 0);
controller.SetBinding(EssgeeSingleKey.BTN_3, device.X, 0);
controller.SetBinding(EssgeeSingleKey.BTN_4, device.Y, 0);
controller.SetBinding(EssgeeSingleKey.UP, device.LeftStick.Up, 1);
controller.SetBinding(EssgeeSingleKey.DOWN, device.LeftStick.Down, 1);
controller.SetBinding(EssgeeSingleKey.LEFT, device.LeftStick.Left, 1);
controller.SetBinding(EssgeeSingleKey.RIGHT, device.LeftStick.Right, 1);
}
}
public class MasterSystemKeyBinding : EssgeeKeyBinding
@ -97,55 +153,11 @@ namespace AxibugEmuOnline.Client.Settings
{
public override RomPlatformType Platform => RomPlatformType.GameBoyColor;
public override int ControllerCount => 1;
protected override void OnRegistDevices(InputDevice_D device, BindingPage binding)
{
if (device is Keyboard_D keyboard)
{
switch (binding.ControllerIndex)
{
case 0:
binding.SetBinding(EssgeeSingleKey.OPTION_1, keyboard.Return, 0);
binding.SetBinding(EssgeeSingleKey.OPTION_2, keyboard.RightShift, 0);
binding.SetBinding(EssgeeSingleKey.UP, keyboard.W, 0);
binding.SetBinding(EssgeeSingleKey.DOWN, keyboard.S, 0);
binding.SetBinding(EssgeeSingleKey.LEFT, keyboard.A, 0);
binding.SetBinding(EssgeeSingleKey.RIGHT, keyboard.D, 0);
binding.SetBinding(EssgeeSingleKey.BTN_1, keyboard.J, 0);
binding.SetBinding(EssgeeSingleKey.BTN_2, keyboard.K, 0);
binding.SetBinding(EssgeeSingleKey.BTN_3, keyboard.U, 0);
binding.SetBinding(EssgeeSingleKey.BTN_4, keyboard.I, 0);
break;
}
}
}
}
public class GameBoyKeyBinding : EssgeeKeyBinding
{
public override RomPlatformType Platform => RomPlatformType.GameBoy;
public override int ControllerCount => 1;
protected override void OnRegistDevices(InputDevice_D device, BindingPage binding)
{
if (device is Keyboard_D keyboard)
{
switch (binding.ControllerIndex)
{
case 0:
binding.SetBinding(EssgeeSingleKey.OPTION_1, keyboard.Return, 0);
binding.SetBinding(EssgeeSingleKey.OPTION_2, keyboard.RightShift, 0);
binding.SetBinding(EssgeeSingleKey.UP, keyboard.W, 0);
binding.SetBinding(EssgeeSingleKey.DOWN, keyboard.S, 0);
binding.SetBinding(EssgeeSingleKey.LEFT, keyboard.A, 0);
binding.SetBinding(EssgeeSingleKey.RIGHT, keyboard.D, 0);
binding.SetBinding(EssgeeSingleKey.BTN_1, keyboard.J, 0);
binding.SetBinding(EssgeeSingleKey.BTN_2, keyboard.K, 0);
binding.SetBinding(EssgeeSingleKey.BTN_3, keyboard.U, 0);
binding.SetBinding(EssgeeSingleKey.BTN_4, keyboard.I, 0);
break;
}
}
}
}
public class GameGearKeyBinding : EssgeeKeyBinding

View File

@ -0,0 +1,17 @@
using AxibugEmuOnline.Client.InputDevices;
using System;
namespace AxibugEmuOnline.Client.Settings
{
/// <summary>
/// 在所有<see cref="EmuCoreControllerKeyBinding{T}"/>的派生类中实现此接口以支持一种设备的绑定
/// <para>一种<see cref="EmuCoreControllerKeyBinding{T}"/>
/// 一个<see cref="EmuCoreControllerKeyBinding{T}.ControllerBinder"/>可以与多种设备建立绑定,但设备类型不可重复</para>
/// </summary>
public interface IDeviceBinder<ENUM, DEVICE>
where ENUM : Enum
where DEVICE : InputDevice_D
{
void Bind(DEVICE device, EmuCoreControllerKeyBinding<ENUM>.ControllerBinder controller);
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: b7c859b1adea6a5448ba60e43af3ccc6

View File

@ -2,7 +2,6 @@
using AxibugEmuOnline.Client.InputDevices;
using AxibugProtobuf;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
@ -58,33 +57,31 @@ namespace AxibugEmuOnline.Client.Settings
/// 模拟器核心控制器键位绑定器
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class EmuCoreControllerKeyBinding<T> : EmuCoreControllerKeyBinding
public abstract class EmuCoreControllerKeyBinding<T> : EmuCoreControllerKeyBinding,
IDeviceBinder<T, Keyboard_D>,
IDeviceBinder<T, GamePad_D>,
IDeviceBinder<T, DualShockController_D>,
IDeviceBinder<T, XboxController_D>,
IDeviceBinder<T, PSVController_D>
where T : Enum
{
List<BindingPage> m_bindingPages = new List<BindingPage>();
//每一个实例代表一个对应模拟器平台的控制器索引
List<ControllerBinder> m_bindingPages = new List<ControllerBinder>();
public EmuCoreControllerKeyBinding()
{
var types = GetType().GetInterfaces();
for (int i = 0; i < ControllerCount; i++)
{
m_bindingPages.Add(new BindingPage(i, this));
m_bindingPages.Add(new ControllerBinder(i, this));
}
var keyboard = App.input.GetDevice<Keyboard_D>();
if (keyboard != null)
foreach (var device in App.input.GetDevices())
{
foreach (var binding in m_bindingPages)
{
binding.RegistInputDevice(keyboard);
}
}
var psvController = App.input.GetDevice<PSVController_D>();
if (psvController != null)
{
foreach (var binding in m_bindingPages)
{
binding.RegistInputDevice(psvController);
binding.RegistInputDevice(device);
}
}
@ -94,12 +91,9 @@ namespace AxibugEmuOnline.Client.Settings
private void InputDevicesMgr_OnDeviceConnected(InputDevice_D connectDevice)
{
if (connectDevice is Keyboard_D)
foreach (var binding in m_bindingPages)
{
foreach (var binding in m_bindingPages)
{
binding.RegistInputDevice(connectDevice);
}
binding.RegistInputDevice(connectDevice);
}
}
@ -109,30 +103,18 @@ namespace AxibugEmuOnline.Client.Settings
{
binding.UnregistInputDevice(lostDevice);
}
if (lostDevice is Keyboard_D) //键盘丢失,立即查找还存在的键盘并建立连接
{
var anotherKeyboard = App.input.GetDevice<Keyboard_D>();
if (anotherKeyboard != null)
{
foreach (var binding in m_bindingPages)
{
binding.UnregistInputDevice(lostDevice);
}
}
}
}
IEnumerable<T> DefineKeys()
internal void RaiseDeviceRegist(InputDevice_D device, ControllerBinder binding)
{
return Enum.GetValues(typeof(T)).Cast<T>();
if (device is Keyboard_D keyboard && this is IDeviceBinder<T, Keyboard_D> keyboardIn) keyboardIn.Bind(keyboard, binding);
if (device is GamePad_D gamePad && this is IDeviceBinder<T, GamePad_D> gamepadIn) gamepadIn.Bind(gamePad, binding);
if (device is DualShockController_D dsC && this is IDeviceBinder<T, DualShockController_D> dsIn) dsIn.Bind(dsC, binding);
if (device is XboxController_D xbC && this is IDeviceBinder<T, XboxController_D> xbIn) xbIn.Bind(xbC, binding);
if (device is PSVController_D psvC && this is IDeviceBinder<T, PSVController_D> psvIn) psvIn.Bind(psvC, binding);
else throw new NotImplementedException($"{device.GetType()}");
}
internal void RaiseDeviceRegist(InputDevice_D device, BindingPage binding)
{
OnRegistDevices(device, binding);
}
protected abstract void OnRegistDevices(InputDevice_D device, BindingPage binding);
public bool Start(T emuControl, int controllerIndex)
{
var binding = m_bindingPages[controllerIndex];
@ -234,7 +216,7 @@ namespace AxibugEmuOnline.Client.Settings
public class MapSetting : Dictionary<T, List<InputControl_C>> { }
public class BindingPage
public class ControllerBinder
{
Dictionary<Type, InputDevice_D> m_registedDevices = new Dictionary<Type, InputDevice_D>();
Dictionary<InputDevice_D, MapSetting> m_mapSetting = new Dictionary<InputDevice_D, MapSetting>();
@ -242,7 +224,7 @@ namespace AxibugEmuOnline.Client.Settings
public int ControllerIndex { get; }
public EmuCoreControllerKeyBinding<T> Host { get; }
internal BindingPage(int controllerIndex, EmuCoreControllerKeyBinding<T> host)
internal ControllerBinder(int controllerIndex, EmuCoreControllerKeyBinding<T> host)
{
ControllerIndex = controllerIndex;
Host = host;
@ -342,5 +324,10 @@ namespace AxibugEmuOnline.Client.Settings
}
}
public abstract void Bind(Keyboard_D device, ControllerBinder controller);
public abstract void Bind(GamePad_D device, ControllerBinder controller);
public abstract void Bind(DualShockController_D device, ControllerBinder controller);
public abstract void Bind(XboxController_D device, ControllerBinder controller);
public abstract void Bind(PSVController_D device, ControllerBinder controller);
}
}

View File

@ -1,5 +1,6 @@
using AxibugEmuOnline.Client.InputDevices;
using AxibugProtobuf;
using UnityEngine.UIElements;
namespace AxibugEmuOnline.Client.Settings
{
@ -23,43 +24,120 @@ namespace AxibugEmuOnline.Client.Settings
{
public override int ControllerCount => 4;
protected override void OnRegistDevices(InputDevice_D device, BindingPage binding)
public override void Bind(Keyboard_D device, ControllerBinder controller)
{
if (device is Keyboard_D keyboard)
switch (controller.ControllerIndex)
{
switch (binding.ControllerIndex)
{
case 0:
binding.SetBinding(UMAMEKSingleKey.INSERT_COIN, keyboard.Q, 0);
binding.SetBinding(UMAMEKSingleKey.GAMESTART, keyboard.E, 0);
binding.SetBinding(UMAMEKSingleKey.UP, keyboard.W, 0);
binding.SetBinding(UMAMEKSingleKey.DOWN, keyboard.S, 0);
binding.SetBinding(UMAMEKSingleKey.LEFT, keyboard.A, 0);
binding.SetBinding(UMAMEKSingleKey.RIGHT, keyboard.D, 0);
binding.SetBinding(UMAMEKSingleKey.BTN_A, keyboard.J, 0);
binding.SetBinding(UMAMEKSingleKey.BTN_B, keyboard.K, 0);
binding.SetBinding(UMAMEKSingleKey.BTN_C, keyboard.L, 0);
binding.SetBinding(UMAMEKSingleKey.BTN_D, keyboard.U, 0);
binding.SetBinding(UMAMEKSingleKey.BTN_E, keyboard.I, 0);
binding.SetBinding(UMAMEKSingleKey.BTN_F, keyboard.O, 0);
break;
case 1:
binding.SetBinding(UMAMEKSingleKey.INSERT_COIN, keyboard.Delete, 0);
binding.SetBinding(UMAMEKSingleKey.GAMESTART, keyboard.PageDown, 0);
binding.SetBinding(UMAMEKSingleKey.UP, keyboard.UpArrow, 0);
binding.SetBinding(UMAMEKSingleKey.DOWN, keyboard.DownArrow, 0);
binding.SetBinding(UMAMEKSingleKey.LEFT, keyboard.LeftArrow, 0);
binding.SetBinding(UMAMEKSingleKey.RIGHT, keyboard.RightArrow, 0);
binding.SetBinding(UMAMEKSingleKey.BTN_A, keyboard.Keypad1, 0);
binding.SetBinding(UMAMEKSingleKey.BTN_B, keyboard.Keypad2, 0);
binding.SetBinding(UMAMEKSingleKey.BTN_C, keyboard.Keypad3, 0);
binding.SetBinding(UMAMEKSingleKey.BTN_D, keyboard.Keypad4, 0);
binding.SetBinding(UMAMEKSingleKey.BTN_E, keyboard.Keypad5, 0);
binding.SetBinding(UMAMEKSingleKey.BTN_F, keyboard.Keypad6, 0);
break;
}
case 0:
controller.SetBinding(UMAMEKSingleKey.INSERT_COIN, device.Q, 0);
controller.SetBinding(UMAMEKSingleKey.GAMESTART, device.E, 0);
controller.SetBinding(UMAMEKSingleKey.UP, device.W, 0);
controller.SetBinding(UMAMEKSingleKey.DOWN, device.S, 0);
controller.SetBinding(UMAMEKSingleKey.LEFT, device.A, 0);
controller.SetBinding(UMAMEKSingleKey.RIGHT, device.D, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_A, device.J, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_B, device.K, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_C, device.L, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_D, device.U, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_E, device.I, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_F, device.O, 0);
break;
case 1:
controller.SetBinding(UMAMEKSingleKey.INSERT_COIN, device.Delete, 0);
controller.SetBinding(UMAMEKSingleKey.GAMESTART, device.PageDown, 0);
controller.SetBinding(UMAMEKSingleKey.UP, device.UpArrow, 0);
controller.SetBinding(UMAMEKSingleKey.DOWN, device.DownArrow, 0);
controller.SetBinding(UMAMEKSingleKey.LEFT, device.LeftArrow, 0);
controller.SetBinding(UMAMEKSingleKey.RIGHT, device.RightArrow, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_A, device.Keypad1, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_B, device.Keypad2, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_C, device.Keypad3, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_D, device.Keypad4, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_E, device.Keypad5, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_F, device.Keypad6, 0);
break;
}
}
public override void Bind(DualShockController_D device, ControllerBinder controller)
{
controller.SetBinding(UMAMEKSingleKey.INSERT_COIN, device.Share, 0);
controller.SetBinding(UMAMEKSingleKey.GAMESTART, device.Options, 0);
controller.SetBinding(UMAMEKSingleKey.UP, device.Up, 0);
controller.SetBinding(UMAMEKSingleKey.DOWN, device.Down, 0);
controller.SetBinding(UMAMEKSingleKey.LEFT, device.Left, 0);
controller.SetBinding(UMAMEKSingleKey.RIGHT, device.Right, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_A, device.Square, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_B, device.Cross, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_C, device.Circle, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_D, device.Triangle, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_E, device.R1, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_F, device.R2, 0);
controller.SetBinding(UMAMEKSingleKey.UP, device.LeftStick.Up, 1);
controller.SetBinding(UMAMEKSingleKey.DOWN, device.LeftStick.Down, 1);
controller.SetBinding(UMAMEKSingleKey.LEFT, device.LeftStick.Left, 1);
controller.SetBinding(UMAMEKSingleKey.RIGHT, device.LeftStick.Right, 1);
}
public override void Bind(GamePad_D device, ControllerBinder controller)
{
controller.SetBinding(UMAMEKSingleKey.INSERT_COIN, device.Select, 0);
controller.SetBinding(UMAMEKSingleKey.GAMESTART, device.Start, 0);
controller.SetBinding(UMAMEKSingleKey.UP, device.Up, 0);
controller.SetBinding(UMAMEKSingleKey.DOWN, device.Down, 0);
controller.SetBinding(UMAMEKSingleKey.LEFT, device.Left, 0);
controller.SetBinding(UMAMEKSingleKey.RIGHT, device.Right, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_A, device.West, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_B, device.South, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_C, device.East, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_D, device.North, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_E, device.RightShoulder, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_F, device.RightTrigger, 0);
controller.SetBinding(UMAMEKSingleKey.UP, device.LeftStick.Up, 1);
controller.SetBinding(UMAMEKSingleKey.DOWN, device.LeftStick.Down, 1);
controller.SetBinding(UMAMEKSingleKey.LEFT, device.LeftStick.Left, 1);
controller.SetBinding(UMAMEKSingleKey.RIGHT, device.LeftStick.Right, 1);
}
public override void Bind(PSVController_D device, ControllerBinder controller)
{
controller.SetBinding(UMAMEKSingleKey.INSERT_COIN, device.Select, 0);
controller.SetBinding(UMAMEKSingleKey.GAMESTART, device.Start, 0);
controller.SetBinding(UMAMEKSingleKey.UP, device.Up, 0);
controller.SetBinding(UMAMEKSingleKey.DOWN, device.Down, 0);
controller.SetBinding(UMAMEKSingleKey.LEFT, device.Left, 0);
controller.SetBinding(UMAMEKSingleKey.RIGHT, device.Right, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_A, device.Square, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_B, device.Cross, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_C, device.Circle, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_D, device.Triangle, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_E, device.L, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_F, device.R, 0);
controller.SetBinding(UMAMEKSingleKey.UP, device.LeftStick.Up, 1);
controller.SetBinding(UMAMEKSingleKey.DOWN, device.LeftStick.Down, 1);
controller.SetBinding(UMAMEKSingleKey.LEFT, device.LeftStick.Left, 1);
controller.SetBinding(UMAMEKSingleKey.RIGHT, device.LeftStick.Right, 1);
}
public override void Bind(XboxController_D device, ControllerBinder controller)
{
controller.SetBinding(UMAMEKSingleKey.INSERT_COIN, device.View, 0);
controller.SetBinding(UMAMEKSingleKey.GAMESTART, device.Menu, 0);
controller.SetBinding(UMAMEKSingleKey.UP, device.Up, 0);
controller.SetBinding(UMAMEKSingleKey.DOWN, device.Down, 0);
controller.SetBinding(UMAMEKSingleKey.LEFT, device.Left, 0);
controller.SetBinding(UMAMEKSingleKey.RIGHT, device.Right, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_A, device.X, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_B, device.A, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_C, device.B, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_D, device.Y, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_E, device.RightBumper, 0);
controller.SetBinding(UMAMEKSingleKey.BTN_F, device.RightTrigger, 0);
controller.SetBinding(UMAMEKSingleKey.UP, device.LeftStick.Up, 1);
controller.SetBinding(UMAMEKSingleKey.DOWN, device.LeftStick.Down, 1);
controller.SetBinding(UMAMEKSingleKey.LEFT, device.LeftStick.Left, 1);
controller.SetBinding(UMAMEKSingleKey.RIGHT, device.LeftStick.Right, 1);
}
}
public class NEOGEOKeyBinding : MAMEKeyBinding

View File

@ -9,35 +9,100 @@ namespace AxibugEmuOnline.Client.Settings
public override RomPlatformType Platform => RomPlatformType.Nes;
public override int ControllerCount => 4;
protected override void OnRegistDevices(InputDevice_D device, BindingPage binding)
public override void Bind(Keyboard_D device, ControllerBinder controller)
{
if (device is Keyboard_D keyboard)
switch (controller.ControllerIndex)
{
switch (binding.ControllerIndex)
{
case 0:
binding.SetBinding(EnumButtonType.LEFT, keyboard.A, 0);
binding.SetBinding(EnumButtonType.RIGHT, keyboard.D, 0);
binding.SetBinding(EnumButtonType.UP, keyboard.W, 0);
binding.SetBinding(EnumButtonType.DOWN, keyboard.S, 0);
binding.SetBinding(EnumButtonType.A, keyboard.K, 0);
binding.SetBinding(EnumButtonType.B, keyboard.J, 0);
binding.SetBinding(EnumButtonType.SELECT, keyboard.V, 0);
binding.SetBinding(EnumButtonType.START, keyboard.B, 0);
binding.SetBinding(EnumButtonType.MIC, keyboard.M, 0);
break;
case 1:
binding.SetBinding(EnumButtonType.UP, keyboard.UpArrow, 0);
binding.SetBinding(EnumButtonType.DOWN, keyboard.DownArrow, 0);
binding.SetBinding(EnumButtonType.LEFT, keyboard.LeftArrow, 0);
binding.SetBinding(EnumButtonType.RIGHT, keyboard.RightArrow, 0);
binding.SetBinding(EnumButtonType.A, keyboard.Keypad2, 0);
binding.SetBinding(EnumButtonType.B, keyboard.Keypad1, 0);
binding.SetBinding(EnumButtonType.SELECT, keyboard.Keypad0, 0);
binding.SetBinding(EnumButtonType.START, keyboard.KeypadPeriod, 0);
break;
}
case 0:
controller.SetBinding(EnumButtonType.LEFT, device.A, 0);
controller.SetBinding(EnumButtonType.RIGHT, device.D, 0);
controller.SetBinding(EnumButtonType.UP, device.W, 0);
controller.SetBinding(EnumButtonType.DOWN, device.S, 0);
controller.SetBinding(EnumButtonType.A, device.K, 0);
controller.SetBinding(EnumButtonType.B, device.J, 0);
controller.SetBinding(EnumButtonType.SELECT, device.V, 0);
controller.SetBinding(EnumButtonType.START, device.B, 0);
controller.SetBinding(EnumButtonType.MIC, device.M, 0);
break;
case 1:
controller.SetBinding(EnumButtonType.UP, device.UpArrow, 0);
controller.SetBinding(EnumButtonType.DOWN, device.DownArrow, 0);
controller.SetBinding(EnumButtonType.LEFT, device.LeftArrow, 0);
controller.SetBinding(EnumButtonType.RIGHT, device.RightArrow, 0);
controller.SetBinding(EnumButtonType.A, device.Keypad2, 0);
controller.SetBinding(EnumButtonType.B, device.Keypad1, 0);
controller.SetBinding(EnumButtonType.SELECT, device.Keypad0, 0);
controller.SetBinding(EnumButtonType.START, device.KeypadPeriod, 0);
break;
}
}
public override void Bind(DualShockController_D device, ControllerBinder controller)
{
controller.SetBinding(EnumButtonType.LEFT, device.Left, 0);
controller.SetBinding(EnumButtonType.RIGHT, device.Right, 0);
controller.SetBinding(EnumButtonType.UP, device.Up, 0);
controller.SetBinding(EnumButtonType.DOWN, device.Down, 0);
controller.SetBinding(EnumButtonType.A, device.Cross, 0);
controller.SetBinding(EnumButtonType.B, device.Square, 0);
controller.SetBinding(EnumButtonType.SELECT, device.Share, 0);
controller.SetBinding(EnumButtonType.START, device.Options, 0);
controller.SetBinding(EnumButtonType.MIC, device.L1, 0);
controller.SetBinding(EnumButtonType.LEFT, device.LeftStick.Left, 1);
controller.SetBinding(EnumButtonType.RIGHT, device.LeftStick.Right, 1);
controller.SetBinding(EnumButtonType.UP, device.LeftStick.Up, 1);
controller.SetBinding(EnumButtonType.DOWN, device.LeftStick.Down, 1);
}
public override void Bind(GamePad_D device, ControllerBinder controller)
{
controller.SetBinding(EnumButtonType.LEFT, device.Left, 0);
controller.SetBinding(EnumButtonType.RIGHT, device.Right, 0);
controller.SetBinding(EnumButtonType.UP, device.Up, 0);
controller.SetBinding(EnumButtonType.DOWN, device.Down, 0);
controller.SetBinding(EnumButtonType.A, device.South, 0);
controller.SetBinding(EnumButtonType.B, device.West, 0);
controller.SetBinding(EnumButtonType.SELECT, device.Select, 0);
controller.SetBinding(EnumButtonType.START, device.Start, 0);
controller.SetBinding(EnumButtonType.MIC, device.LeftShoulder, 0);
controller.SetBinding(EnumButtonType.LEFT, device.LeftStick.Left, 1);
controller.SetBinding(EnumButtonType.RIGHT, device.LeftStick.Right, 1);
controller.SetBinding(EnumButtonType.UP, device.LeftStick.Up, 1);
controller.SetBinding(EnumButtonType.DOWN, device.LeftStick.Down, 1);
}
public override void Bind(PSVController_D device, ControllerBinder controller)
{
controller.SetBinding(EnumButtonType.LEFT, device.Left, 0);
controller.SetBinding(EnumButtonType.RIGHT, device.Right, 0);
controller.SetBinding(EnumButtonType.UP, device.Up, 0);
controller.SetBinding(EnumButtonType.DOWN, device.Down, 0);
controller.SetBinding(EnumButtonType.A, device.Cross, 0);
controller.SetBinding(EnumButtonType.B, device.Square, 0);
controller.SetBinding(EnumButtonType.SELECT, device.Select, 0);
controller.SetBinding(EnumButtonType.START, device.Start, 0);
controller.SetBinding(EnumButtonType.MIC, device.L, 0);
controller.SetBinding(EnumButtonType.LEFT, device.LeftStick.Left, 0);
controller.SetBinding(EnumButtonType.RIGHT, device.LeftStick.Right, 0);
controller.SetBinding(EnumButtonType.UP, device.LeftStick.Up, 0);
controller.SetBinding(EnumButtonType.DOWN, device.LeftStick.Down, 0);
}
public override void Bind(XboxController_D device, ControllerBinder controller)
{
controller.SetBinding(EnumButtonType.LEFT, device.Left, 0);
controller.SetBinding(EnumButtonType.RIGHT, device.Right, 0);
controller.SetBinding(EnumButtonType.UP, device.Up, 0);
controller.SetBinding(EnumButtonType.DOWN, device.Down, 0);
controller.SetBinding(EnumButtonType.A, device.A, 0);
controller.SetBinding(EnumButtonType.B, device.X, 0);
controller.SetBinding(EnumButtonType.SELECT, device.View, 0);
controller.SetBinding(EnumButtonType.START, device.Menu, 0);
controller.SetBinding(EnumButtonType.MIC, device.LeftBumper, 0);
controller.SetBinding(EnumButtonType.LEFT, device.LeftStick.Left, 0);
controller.SetBinding(EnumButtonType.RIGHT, device.LeftStick.Right, 0);
controller.SetBinding(EnumButtonType.UP, device.LeftStick.Up, 0);
controller.SetBinding(EnumButtonType.DOWN, device.LeftStick.Down, 0);
}
}
}

View File

@ -9,38 +9,94 @@ namespace AxibugEmuOnline.Client
public override RomPlatformType Platform => RomPlatformType.Invalid;
public override int ControllerCount => 2;
protected override void OnRegistDevices(InputDevice_D device, BindingPage binding)
public override void Bind(Keyboard_D device, ControllerBinder controller)
{
if (device is Keyboard_D keyboard)
switch (controller.ControllerIndex)
{
switch (binding.ControllerIndex)
{
case 0://设置标准UI控制
//第一套控制布局 WSAD+JKLI
binding.SetBinding(EnumCommand.Back, keyboard.L, 0);
binding.SetBinding(EnumCommand.Enter, keyboard.K, 0);
binding.SetBinding(EnumCommand.OptionMenu, keyboard.I, 0);
binding.SetBinding(EnumCommand.SelectItemDown, keyboard.S, 0);
binding.SetBinding(EnumCommand.SelectItemLeft, keyboard.A, 0);
binding.SetBinding(EnumCommand.SelectItemRight, keyboard.D, 0);
binding.SetBinding(EnumCommand.SelectItemUp, keyboard.W, 0);
case 0://设置标准UI控制 //第一套控制布局 WSAD+JKLI
controller.SetBinding(EnumCommand.Back, device.L, 0);
controller.SetBinding(EnumCommand.Enter, device.K, 0);
controller.SetBinding(EnumCommand.OptionMenu, device.I, 0);
controller.SetBinding(EnumCommand.SelectItemDown, device.S, 0);
controller.SetBinding(EnumCommand.SelectItemLeft, device.A, 0);
controller.SetBinding(EnumCommand.SelectItemRight, device.D, 0);
controller.SetBinding(EnumCommand.SelectItemUp, device.W, 0);
//第二套控制布局 LOWB用
binding.SetBinding(EnumCommand.Back, keyboard.Escape, 1);
binding.SetBinding(EnumCommand.Back, keyboard.Backspace, 2);
binding.SetBinding(EnumCommand.Enter, keyboard.Return, 1);
binding.SetBinding(EnumCommand.OptionMenu, keyboard.LeftShift, 1);
binding.SetBinding(EnumCommand.OptionMenu, keyboard.RightShift, 2);
binding.SetBinding(EnumCommand.SelectItemDown, keyboard.DownArrow, 1);
binding.SetBinding(EnumCommand.SelectItemLeft, keyboard.LeftArrow, 1);
binding.SetBinding(EnumCommand.SelectItemRight, keyboard.RightArrow, 1);
binding.SetBinding(EnumCommand.SelectItemUp, keyboard.UpArrow, 1);
break;
case 1://游戏中UI控制
binding.SetBinding(EnumCommand.OptionMenu, keyboard.Escape, 0);
break;
}
//第二套控制布局 LOWB用
controller.SetBinding(EnumCommand.Back, device.Escape, 1);
controller.SetBinding(EnumCommand.Back, device.Backspace, 2);
controller.SetBinding(EnumCommand.Enter, device.Return, 1);
controller.SetBinding(EnumCommand.OptionMenu, device.LeftShift, 1);
controller.SetBinding(EnumCommand.OptionMenu, device.RightShift, 2);
controller.SetBinding(EnumCommand.SelectItemDown, device.DownArrow, 1);
controller.SetBinding(EnumCommand.SelectItemLeft, device.LeftArrow, 1);
controller.SetBinding(EnumCommand.SelectItemRight, device.RightArrow, 1);
controller.SetBinding(EnumCommand.SelectItemUp, device.UpArrow, 1);
break;
case 1://游戏中UI控制
controller.SetBinding(EnumCommand.OptionMenu, device.Escape, 0);
break;
}
}
public override void Bind(DualShockController_D device, ControllerBinder controller)
{
controller.SetBinding(EnumCommand.Back, device.Circle, 0);
controller.SetBinding(EnumCommand.Enter, device.Cross, 0);
controller.SetBinding(EnumCommand.OptionMenu, device.Options, 0);
controller.SetBinding(EnumCommand.SelectItemDown, device.Down, 0);
controller.SetBinding(EnumCommand.SelectItemLeft, device.Left, 0);
controller.SetBinding(EnumCommand.SelectItemRight, device.Right, 0);
controller.SetBinding(EnumCommand.SelectItemUp, device.Up, 0);
controller.SetBinding(EnumCommand.SelectItemDown, device.LeftStick.Down, 1);
controller.SetBinding(EnumCommand.SelectItemLeft, device.LeftStick.Left, 1);
controller.SetBinding(EnumCommand.SelectItemRight, device.LeftStick.Right, 1);
controller.SetBinding(EnumCommand.SelectItemUp, device.LeftStick.Up, 1);
}
public override void Bind(GamePad_D device, ControllerBinder controller)
{
controller.SetBinding(EnumCommand.Back, device.East, 0);
controller.SetBinding(EnumCommand.Enter, device.South, 0);
controller.SetBinding(EnumCommand.OptionMenu, device.Start, 0);
controller.SetBinding(EnumCommand.SelectItemDown, device.Down, 0);
controller.SetBinding(EnumCommand.SelectItemLeft, device.Left, 0);
controller.SetBinding(EnumCommand.SelectItemRight, device.Right, 0);
controller.SetBinding(EnumCommand.SelectItemUp, device.Up, 0);
controller.SetBinding(EnumCommand.SelectItemDown, device.LeftStick.Down, 1);
controller.SetBinding(EnumCommand.SelectItemLeft, device.LeftStick.Left, 1);
controller.SetBinding(EnumCommand.SelectItemRight, device.LeftStick.Right, 1);
controller.SetBinding(EnumCommand.SelectItemUp, device.LeftStick.Up, 1);
}
public override void Bind(PSVController_D device, ControllerBinder controller)
{
controller.SetBinding(EnumCommand.Back, device.Circle, 0);
controller.SetBinding(EnumCommand.Enter, device.Cross, 0);
controller.SetBinding(EnumCommand.OptionMenu, device.Start, 0);
controller.SetBinding(EnumCommand.SelectItemDown, device.Down, 0);
controller.SetBinding(EnumCommand.SelectItemLeft, device.Left, 0);
controller.SetBinding(EnumCommand.SelectItemRight, device.Right, 0);
controller.SetBinding(EnumCommand.SelectItemUp, device.Up, 0);
controller.SetBinding(EnumCommand.SelectItemDown, device.LeftStick.Down, 1);
controller.SetBinding(EnumCommand.SelectItemLeft, device.LeftStick.Left, 1);
controller.SetBinding(EnumCommand.SelectItemRight, device.LeftStick.Right, 1);
controller.SetBinding(EnumCommand.SelectItemUp, device.LeftStick.Up, 1);
}
public override void Bind(XboxController_D device, ControllerBinder controller)
{
controller.SetBinding(EnumCommand.Back, device.B, 0);
controller.SetBinding(EnumCommand.Enter, device.A, 0);
controller.SetBinding(EnumCommand.OptionMenu, device.Menu, 0);
controller.SetBinding(EnumCommand.SelectItemDown, device.Down, 0);
controller.SetBinding(EnumCommand.SelectItemLeft, device.Left, 0);
controller.SetBinding(EnumCommand.SelectItemRight, device.Right, 0);
controller.SetBinding(EnumCommand.SelectItemUp, device.Up, 0);
controller.SetBinding(EnumCommand.SelectItemDown, device.LeftStick.Down, 1);
controller.SetBinding(EnumCommand.SelectItemLeft, device.LeftStick.Left, 1);
controller.SetBinding(EnumCommand.SelectItemRight, device.LeftStick.Right, 1);
controller.SetBinding(EnumCommand.SelectItemUp, device.LeftStick.Up, 1);
}
}
}

View File

@ -7,7 +7,7 @@ namespace AxibugEmuOnline.Client.InputDevices
/// </summary>
public class Stick_C : InputControl_C
{
public VirtualButton UP;
public VirtualButton Up;
public VirtualButton Down;
public VirtualButton Left;
public VirtualButton Right;
@ -20,8 +20,8 @@ namespace AxibugEmuOnline.Client.InputDevices
{
var axis = GetVector2();
UP.m_performing = axis.y > 0f;
UP.Update();
Up.m_performing = axis.y > 0f;
Up.Update();
Down.m_performing = axis.y < 0f;
Down.Update();

View File

@ -55,6 +55,14 @@ namespace AxibugEmuOnline.Client.InputDevices
return null;
}
/// <summary>
/// 获得所有存在的输入设备
/// </summary>
/// <returns></returns>
public IEnumerable<InputDevice_D> GetDevices()
{
return m_devices.Values;
}
/// <summary> 由外部驱动的逻辑更新入口 </summary>
public void Update()

View File

@ -1,12 +1,8 @@
#if ENABLE_INPUT_SYSTEM
using Google.Protobuf.WellKnownTypes;
using NUnit.Framework.Internal;
using System.Collections.Generic;
using UnityEditor.Experimental.GraphView;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.DualShock;
using UnityEngine.InputSystem.Haptics;
using UnityEngine.InputSystem.XInput;
namespace AxibugEmuOnline.Client.InputDevices.ForInputSystem
@ -249,7 +245,7 @@ namespace AxibugEmuOnline.Client.InputDevices.ForInputSystem
mapper[ds_d.LeftStick] = ipDsGamePad.leftStick;
mapper[ds_d.RightStick] = ipDsGamePad.rightStick;
}
else if(device_d is XboxController_D xbox_d)
else if (device_d is XboxController_D xbox_d)
{
var ipXInputGamePad = ipdevice as XInputController;
mapper[xbox_d.X] = ipXInputGamePad.xButton;