예제 #1
0
        static unsafe void Main(string[] args)
        {
            bool list     = false;
            bool dump     = false; //show state and controller name
            int  index    = 0;     //current device
            bool checkold = true;  //compare last state
            bool axis     = false; //due to bad calibration axis can report data all the time


            for (int i = 0; i < args.Length; ++i)
            {
                string arg = args[i];

                if (arg == "-l" || arg == "--list")
                {
                    list = true;
                }
                else if (arg == "--no-check-state")
                {
                    checkold = false;
                }
                else if (arg == "-a" || arg == "--axis")
                {
                    axis = true;
                }
                else if (arg == "-i" || arg == "--index")
                {
                    if (i + 1 >= args.Length)
                    {
                        Logger.Error?.Print(LogClass.Application, $"Invalid option '{arg}'");

                        continue;
                    }

                    string i = args[++i];
                    index = Int32.Parse(i);
                }
                else if (arg == "-d" || arg == "--debug")
                {
                    dump = true;
                }
                else
                {
                    index = Int32.Parse(arg);
                }
            }

            NativeWindowSettings nativeSettings = NativeWindowSettings.Default;

            nativeSettings.Size            = new Vector2i(1280, 720);
            nativeSettings.Title           = "Game";
            nativeSettings.WindowState     = WindowState.Normal;
            nativeSettings.WindowBorder    = WindowBorder.Resizable;
            nativeSettings.NumberOfSamples = 4;

            GameWindow gameWindow = new GameWindow(GameWindowSettings.Default, nativeSettings);

            if (list)
            {
                for (int i = 0; i < gameWindow.JoystickStates.Count; i++)
                {
                    JoystickState state = gameWindow.JoystickStates[i];
                    if (dump)
                    {
                        Console.WriteLine($"testing {index} {state}");
                    }

                    if (state != null)
                    {
                        var name = GLFW.GetJoystickName(i);

                        Console.WriteLine($"Controller/{i} ({name})");
                    }
                }
                gameWindow.ProcessEvents();
                return;
            }

            while (true)
            {
                JoystickState state = gameWindow.JoystickStates[index];
                if (dump)
                {
                    Console.WriteLine($"Controller/{index} ({state})");
                }

                if (state != null)
                {
                    GLFW.GetJoystickHatsRaw(index, out var hatCount);
                    GLFW.GetJoystickAxesRaw(index, out var axisCount);
                    GLFW.GetJoystickButtonsRaw(index, out var buttonCount);
                    var name = GLFW.GetJoystickName(index);

                    Console.WriteLine($"Controller/{index} ({name})");
                    if (list)
                    {
                        continue;
                    }
                    Console.WriteLine($"{hatCount} {axisCount} {buttonCount}");
                    for (int j = 0; j < hatCount; j++)
                    {
                        Console.WriteLine($"hat{j}: {state.GetHat(j)}");
                    }

                    for (int j = 0; j < axisCount; j++)
                    {
                        Console.WriteLine($"axis{j}: {state.GetAxis(j)}");
                    }

                    for (int j = 0; j < buttonCount; j++)
                    {
                        if (state.IsButtonDown(j))
                        {
                            Console.WriteLine($"button {j}: down");
                        }
                    }
                }
                //Thread.Sleep(2000);
                gameWindow.ProcessEvents();
                if (list)
                {
                    break;
                }
            }
        }