1
0
AxibugEmuOnline/AxibugEmuOnline.Client/Assets/Script/AppMain/AxiInputSP/UGUI/AxiIptJoystick.cs

122 lines
5.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using UnityEngine;
namespace AxiInputSP.UGUI
{
public class AxiIptJoystick : IDisposable
{
enum AxiIptJoystickState
{
None,
KeyUp,
KeyDown,
KeyHold
}
static long LastCheckFrame = -1;
static Func<Vector2Int> RawJoy;
AxiInputUGUIHandle[] handles = new AxiInputUGUIHandle[4];
static Dictionary<AxiInputUGuiBtnType, AxiIptJoystickState> mAxis2State = new Dictionary<AxiInputUGuiBtnType, AxiIptJoystickState>();
public AxiIptJoystick(Func<Vector2Int> getRawJoy)
{
RawJoy = getRawJoy;
handles[0] = new AxiInputUGUIHandle(AxiInputUGuiBtnType.UP);
handles[0].GetKeyHandle = (() => { return GetKey(AxiInputUGuiBtnType.UP); });
handles[0].GetKeyUpHandle = (() => { return GetKeyUp(AxiInputUGuiBtnType.UP); });
handles[0].GetKeyDownHandle = (() => { return GetKeyDown(AxiInputUGuiBtnType.UP); });
mAxis2State[AxiInputUGuiBtnType.UP] = AxiIptJoystickState.None;
handles[1] = new AxiInputUGUIHandle(AxiInputUGuiBtnType.DOWN);
handles[1].GetKeyHandle = (() => { return GetKey(AxiInputUGuiBtnType.DOWN); });
handles[1].GetKeyUpHandle = (() => { return GetKeyUp(AxiInputUGuiBtnType.DOWN); });
handles[1].GetKeyDownHandle = (() => { return GetKeyDown(AxiInputUGuiBtnType.DOWN); });
mAxis2State[AxiInputUGuiBtnType.DOWN] = AxiIptJoystickState.None;
handles[2] = new AxiInputUGUIHandle(AxiInputUGuiBtnType.LEFT);
handles[2].GetKeyHandle = (() => { return GetKey(AxiInputUGuiBtnType.LEFT); });
handles[2].GetKeyUpHandle = (() => { return GetKeyUp(AxiInputUGuiBtnType.LEFT); });
handles[2].GetKeyDownHandle = (() => { return GetKeyDown(AxiInputUGuiBtnType.LEFT); });
mAxis2State[AxiInputUGuiBtnType.LEFT] = AxiIptJoystickState.None;
handles[3] = new AxiInputUGUIHandle(AxiInputUGuiBtnType.RIGHT);
handles[3].GetKeyHandle = (() => { return GetKey(AxiInputUGuiBtnType.RIGHT); });
handles[3].GetKeyUpHandle = (() => { return GetKeyUp(AxiInputUGuiBtnType.RIGHT); });
handles[3].GetKeyDownHandle = (() => { return GetKeyDown(AxiInputUGuiBtnType.RIGHT); });
mAxis2State[AxiInputUGuiBtnType.RIGHT] = AxiIptJoystickState.None;
}
public void Dispose()
{
for (int i = 0; i < handles.Length; i++)
{
handles[i].Dispose();
handles[i] = null;
}
mAxis2State.Clear();
}
public static void UpdateState()
{
if (LastCheckFrame == Time.frameCount)
return;
LastCheckFrame = Time.frameCount;
RecheckSingleState(AxiInputUGuiBtnType.RIGHT);
RecheckSingleState(AxiInputUGuiBtnType.LEFT);
RecheckSingleState(AxiInputUGuiBtnType.UP);
RecheckSingleState(AxiInputUGuiBtnType.DOWN);
}
static void RecheckSingleState(AxiInputUGuiBtnType axisType)
{
bool bKey = false;
Vector2Int inputV2 = RawJoy.Invoke();
switch (axisType)
{
case AxiInputUGuiBtnType.RIGHT: bKey = inputV2.x > 0; break;
case AxiInputUGuiBtnType.LEFT: bKey = inputV2.x < 0; break;
case AxiInputUGuiBtnType.UP: bKey = inputV2.y > 0; break;
case AxiInputUGuiBtnType.DOWN: bKey = inputV2.y < 0; break;
}
//按下
if (bKey)
{
//如果之前帧是KeyUp或None则为KeyDown|KeyHold
if (mAxis2State[axisType] <= AxiIptJoystickState.KeyUp)
mAxis2State[axisType] = AxiIptJoystickState.KeyDown;
//如果之前帧是KeyDown则为KeyHold
else if (mAxis2State[axisType] == AxiIptJoystickState.KeyDown)
mAxis2State[axisType] = AxiIptJoystickState.KeyHold;
}
//未按下
else
{
//如果之前帧是KeyDown|KeyHold则为KeyUp|None
if (mAxis2State[axisType] >= AxiIptJoystickState.KeyDown)
mAxis2State[axisType] = AxiIptJoystickState.KeyUp;
//如果之前帧是KeyUp则为None
else if (mAxis2State[axisType] == AxiIptJoystickState.KeyUp)
mAxis2State[axisType] = AxiIptJoystickState.None;
}
}
bool GetKey(AxiInputUGuiBtnType key)
{
UpdateState();
return mAxis2State[key] >= AxiIptJoystickState.KeyDown;
}
bool GetKeyUp(AxiInputUGuiBtnType key)
{
UpdateState();
return mAxis2State[key] == AxiIptJoystickState.KeyUp;
}
bool GetKeyDown(AxiInputUGuiBtnType key)
{
UpdateState();
return mAxis2State[key] == AxiIptJoystickState.KeyDown;
}
}
}