2014-01-04 2 views
1

Я хотел бы сделать программу, которая использует входы контроллера XBox 360, чтобы дать результаты, например, если вы нажмете на контроллере, она будет таким же, как нажатие на клавиатуре. Я планирую использовать это для разработки игр и не хочу, чтобы выходные данные настраивались, но я хочу, чтобы окно было видимым, чтобы его можно было закрыть в любое время. Как я могу сделать эту программу (для Windows) и прост в использовании.XBox 360 контроллер не настраиваемое отображение

ответ

1

Я бы посоветовал использовать входной абстрактный класс и преобразовать типы ввода, которые вам нужны, с использованием конкретных классов для преобразования ввода (A на клавиатуре или RTrigger на Xbox) в действие ввода в вашей игре (нажмите кнопку пуансона, нажмите кнопку перехода, Движение в направлении X и т. Д.).

В C# это можно сделать относительно легко. Создайте класс/struct, чтобы стать объектом возврата конверсии. В моем случае я сделал боевую платформу игры с действиями и движением с управлением камерой, я называю это InputState:

public class InputState 
{ 
    public struct Axis 
    { 
     public float X; 
     public float Y; 

     public float XNorm 
     { 
      get{ return Math.Abs(X); } 
     } 

     public float YNorm 
     { 
      get{ return Math.Abs(Y); } 
     } 
    } 

    public struct ActionStates 
    { 
     public bool Jump; 
     public bool Punch; 
     public bool Kick; 
     public bool Special; 
     public bool Grab; 
     public bool Guard; 
    } 

    public Axis MovementAxis; 
    public Axis CameraAxis; 
    public ActionStates Actions; 
} 

Вы можете создать абстрактный InputConverter класс, который принимает входной сигнал некоторого типа и возвращает этот InputState класс:

public abstract class InputConverter 
{ 
    public abstract InputState Convert(); 
} 

Вы можете расширить этот класс в другие, например, в Unity3D я использую этот класс, который я создал, чтобы сделать вход с контроллером XBox преобразования в InputState класс выше. При инициализации требуется идентификатор игрока для получения правильного контроллера. Наиболее импорт часть здесь является public override InputState Convert, который возвращает ваши игры InputState объект:

using XInputDotNetPure; 
public class XInputConverter : InputConverter 
{  

    bool playerIndexSet = false; 
    PlayerIndex playerIndex; 
    GamePadState gamePadState; 
    GamePadState prevState; 

    public XInputConverter(int playerSlot) 
    { 
     VerifyControllerConnected(playerSlot); 

    } 

    private void VerifyControllerConnected(int playerSlot) 
    { 
     // Find a PlayerIndex, for a single player game 
     if (!playerIndexSet || !prevState.IsConnected) 
     { 
      PlayerIndex testPlayerIndex = (PlayerIndex)playerSlot - 1; 
      GamePadState testState = GamePad.GetState(testPlayerIndex); 
      if (testState.IsConnected) 
      { 
       //Debug.Log (string.Format ("GamePad found {0}", testPlayerIndex)); 
       playerIndex = testPlayerIndex; 
       playerIndexSet = true; 
      } else 
      { 
       throw new Exception(string.Format("GamePad {0} has been unplugged or is not connecting properly", testPlayerIndex)); 
      } 
     } 
    } 

    public override InputState Convert() 
    { 
     InputState outputState = new InputState(); 

     gamePadState = GamePad.GetState(playerIndex); 

     //Actions 
     outputState.Actions.Jump = gamePadState.Buttons.Y == ButtonState.Pressed; 

     //Offense 
     outputState.Actions.Punch = gamePadState.Buttons.X == ButtonState.Pressed; 
     outputState.Actions.Kick = gamePadState.Buttons.A == ButtonState.Pressed; 
     outputState.Actions.Special = gamePadState.Buttons.B == ButtonState.Pressed; 

     //Defense 
     outputState.Actions.Grab = gamePadState.Buttons.LeftShoulder == ButtonState.Pressed || gamePadState.Buttons.RightShoulder == ButtonState.Pressed; 
     outputState.Actions.Guard = gamePadState.Triggers.Left > 0 || gamePadState.Triggers.Right > 0; 

     //Movement from DPad 
     short xAxis = 0; 
     short yAxis = 0; 

     //Determine if Dpad has any input 
     if (gamePadState.DPad.Right == ButtonState.Pressed) 
      xAxis += 1; 
     if (gamePadState.DPad.Left == ButtonState.Pressed) 
      xAxis -= 1; 
     if (gamePadState.DPad.Up == ButtonState.Pressed) 
      yAxis += 1; 
     if (gamePadState.DPad.Down == ButtonState.Pressed) 
      yAxis -= 1; 

     //Set the movement to either the Thumsticks or the DPad 
     outputState.MovementAxis.X = xAxis == 0 ? gamePadState.ThumbSticks.Left.X : xAxis; 
     outputState.MovementAxis.Y = yAxis == 0 ? gamePadState.ThumbSticks.Left.Y : yAxis; 

     //Camera 
     outputState.CameraAxis.X = gamePadState.ThumbSticks.Right.X; 
     outputState.CameraAxis.X = gamePadState.ThumbSticks.Right.Y; 

     return outputState;  
    }    
} 

Используя этот класс, вы можете специально использовать кнопки, которые вы хотите для действий, которые необходимо и сделать это с любыми входами вы выбираете. Здесь есть единство клавиатура преобразователь:

using UnityEngine; 
public class UnityKeyboardInputConverter : InputConverter 
{ 
    public override InputState Convert() 
    { 
     InputState state = new InputState(); 

     //Actions 
     state.Actions.Jump = Input.GetKey(KeyCode.Space); 

     //Offense 
     state.Actions.Punch = Input.GetKey(KeyCode.J); 
     state.Actions.Kick = Input.GetKey(KeyCode.K); 
     state.Actions.Special = Input.GetKey(KeyCode.L); 

     //Defense 
     state.Actions.Grab = Input.GetKey(KeyCode.RightShift); 
     state.Actions.Guard = Input.GetKey(KeyCode.LeftShift); 

     //Movement 
     state.MovementAxis.X = Input.GetAxisRaw("Horizontal"); 
     state.MovementAxis.Y = Input.GetAxisRaw("Vertical"); 

     //Camera 
     state.CameraAxis.X = Input.GetAxisRaw("Mouse X"); 
     state.CameraAxis.X = Input.GetAxisRaw("Mouse Y"); 

     return state;  
    }   
} 

Наконец

В зависимости от выбора игрока, я могу просто инстанцирую входной преобразователь моего выбора, используя перечислитель и использовать InputHandler класс для вызова обновления и извлечение состояние ввода от соответствующего, без необходимости знать, какой из них он использовал. Это очень важно, как вы хотите, чтобы вызвать только эти входы, когда ваш игровой движок готов и используя настройки выбрали игрок (XBox, клавиатура + мышь, PC геймпад и т.д.):

public class InputHandler 
{ 
    //Controller handlers and properties 
    private int playerNumber; 

    public enum InputType 
    { 
     None = 0, 
     KeyboardMouse, 
     XBoxController, 
     PCGamePad 
    } 

    public InputType SelectedInputType = InputType.None; 
    public InputState CommandState; 

    //Ambiguous Abstract input converter allows us to assign Xbox or keyboard as input 
    private InputConverter converter; 

    public InputHandler(int playerNumber, InputType inputType) 
    { 
     SelectedInputType = inputType; 
     this.playerNumber = playerNumber; 
     if (playerNumber > 4 || playerNumber < 1) 
     { 
      throw new Exception("Player must be set to 1, 2, 3 or 4"); 
     } 
     //Check type and load converter 
     switch (SelectedInputType) 
     { 
     case InputType.XBoxController: 
      converter = new XInputConverter(playerNumber); 
      break; 
     case InputType.KeyboardMouse 
      converter = new UnityKeyboardInputConverter(); 
      break; 
     case InputType.PCGamePad: 
      converter = new PCGamePadInputConverter(playerNumber); 
      break; 
     case InputType.None: 
      //Do nothing but would be a good idea to handle it in game 
     } 

    } 

    // Update is called once per frame by Unity Update functions 
    public void InputUpdate() 
    { 
     if (converter != null) 
     { 
      CommandState = converter.Convert(); 
     } 

     //Debug if in the Unity editor 
     #if UNITY_EDITOR 
     Debug.Log(CommandState.ToString()); 
     #endif 
    } 
} 

Надеется, что это помогает.

Смежные вопросы