Skip to content

Instantly share code, notes, and snippets.

@sverrirs
Created November 11, 2015 23:57
Show Gist options
  • Select an option

  • Save sverrirs/0a0181fb17b29d070003 to your computer and use it in GitHub Desktop.

Select an option

Save sverrirs/0a0181fb17b29d070003 to your computer and use it in GitHub Desktop.

Revisions

  1. sverrirs created this gist Nov 11, 2015.
    124 changes: 124 additions & 0 deletions XboxBigButtonJoystick.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,124 @@
    using System;
    using UnityEngine;
    using XboxBigButton;

    public class XboxBigButtonJoystick : MonoBehaviour
    {
    private XboxBigButtonDevice _device;
    private Buttons[] _state = new Buttons[4];

    private static XboxBigButtonJoystick _instance;

    public static bool GetButton(Controller playerColor, Buttons button)
    {
    bool success = (_instance._state[(int)playerColor] & button ) == button;
    _instance._state[(int)playerColor] &= ~button; // Consume the button state
    return success;
    }

    public static bool GetPlayer(Controller playerColor)
    {
    return _instance._state[(int) playerColor] > 0;
    }

    private float _hor = 0f;
    private float _easeStrength = 0.5f;

    public static float GetAxis(Controller playerColor, string axisName )
    {
    int amount = 0;

    if (axisName == "Horizontal")
    {
    if ((_instance._state[(int) playerColor] & Buttons.Right) == Buttons.Right)
    {
    amount += 1;
    _instance._state[(int)playerColor] &= ~Buttons.Right;
    }

    if ((_instance._state[(int) playerColor] & Buttons.Left) == Buttons.Left)
    {
    amount += -1;
    _instance._state[(int)playerColor] &= ~Buttons.Left;
    }
    }
    else if( axisName == "Vertical")
    {
    if ((_instance._state[(int)playerColor] & Buttons.Up) == Buttons.Up)
    {
    amount += 1;
    _instance._state[(int)playerColor] &= ~Buttons.Up;
    }

    if ((_instance._state[(int)playerColor] & Buttons.Down) == Buttons.Down)
    {
    amount += -1;
    _instance._state[(int)playerColor] &= ~Buttons.Down;
    }
    }

    if (amount == 0)
    return 0.0f;

    // Attempt to do some easing of the movement, yeah this doesn't really work that well
    float val = 1.0f * amount;
    _instance._hor = Mathf.Lerp(_instance._hor, val, _instance._easeStrength);
    return _instance._hor;
    }

    // Use this for initialization
    void Start ()
    {
    // Must have a dummy line to instantiate Loom correctly (sets up the dummy game object that we will invoke everuthing on)
    var tmp = Loom.Current.GetComponent<Loom>();

    // Store the singleton
    _instance = this;

    if (_device == null)
    {
    _state = new Buttons[4];
    _device = new XboxBigButtonDevice();
    _device.ButtonStateChanged += _device_ButtonStateChanged;
    _device.Connect();
    }
    }

    private void CleanUpJoystickDevice()
    {
    if (_device != null)
    {
    _device.ButtonStateChanged -= _device_ButtonStateChanged;
    _device.Disconnect();
    _device.Dispose();
    _device = null;
    _state = null;
    }
    }

    void OnApplicationQuit()
    {
    CleanUpJoystickDevice();
    }

    void OnDestroy()
    {
    CleanUpJoystickDevice();
    }

    private void _device_ButtonStateChanged(object sender, XboxBigButtonDeviceEventArgs e)
    {
    var controller = e.Controller;
    var buttonState = e.ButtonState;

    Loom.QueueOnMainThread(() =>
    {
    UpdateButtonStateDictionary(controller, buttonState);
    });
    }

    private void UpdateButtonStateDictionary(Controller c, Buttons b)
    {
    _instance._state[(int) c] |= b;
    }
    }