SFML / SFML.Net

Official binding of SFML for .Net languages

Home Page:https://www.sfml-dev.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Joystick won't update without Joystick.Update() even when calling window.DispatchEvents()

andre-sampaio opened this issue · comments

Despite polling window events the Joystick status is not updated unless explicitly calling Joystick.Update().

Minimal working sample (with one joystick connected):

        static void Main(string[] args)
        {
            var window = new RenderWindow(new VideoMode(200, 200), "Joystick doesn't read :(");
            
            while (window.IsOpen)
            {
                window.DispatchEvents();

                Console.SetCursorPosition(0, 0);

                for (uint i = 0; i < Joystick.Count; i++)
                {
                    var isConnected = Joystick.IsConnected(i);
                    Console.WriteLine($"{i}: {isConnected}");
                }
            }
        }

Expected result: One joystick is connected
Actual result: No joystick connected

Calling Joystick.Update before the loop will update the joystick status and will achieve the desired result.

The same applies to actually getting the Joystick state:

        static void Main(string[] args)
        {
            var window = new RenderWindow(new VideoMode(200, 200), "Joystick doesn't read :(");
            Joystick.Update();

            uint connectedJoystick = 0;
            for (uint i = 0; i < Joystick.Count; i++)
            {
                var isConnected = Joystick.IsConnected(i);
                if (isConnected)
                    connectedJoystick = i;
            }

            while (window.IsOpen)
            {
                window.DispatchEvents();

                Console.SetCursorPosition(0, 0);

                for (uint i = 0; i < Joystick.AxisCount; i++)
                {
                    var position = Joystick.GetAxisPosition(connectedJoystick, (Joystick.Axis)i);
                    Console.WriteLine($"Axis {(Joystick.Axis)i}: {position}");
                }
            }
        }

Expected behavior: Axis position gets tracked accordingly to controller
Actual behavior: All axis values stuck

Again, calling Joystick.Update() inside the event loop will update the values correctly.

IDE: Visual Studio 2019
.Net SDK: .NET Core 3.1.301
Platform: x64
Configuration: Debug
OS: Windows 10

After building CSFML locally and using this DLL instead of the one from Nuget the code started to work as expected, updating the controller status without needing to call Joystick.Update(). But if I go back to the Nuget version of SFML it stops working again.

I'll try to investigate this a bit more over the weekend, but it looks somehow related to CSFML Nuget package.

After taking a look at the build file for CSFML Nuget package, I noticed that the package is linking statically to SFML. After building it statically I was able to reproduce the error.

Since this is clearly related to CSFML I'll open this issue over there.