예제 #1
0
 private void RefreshJoysticksAndGamepads()
 {
     for (var i = 0; i < Sdl.NumJoysticks(); i++)
     {
         var instanceId = Sdl.JoystickGetDeviceInstanceID(i);
         if (Sdl.IsGameController(i) == SdlBool.True)
         {
             if (!SdlGamepads.TryGetValue(instanceId, out var gp))
             {
                 SdlGamepads.Add(instanceId, new SdlGamepad(this, i, instanceId));
             }
             else
             {
                 gp.ActualIndex = i;
             }
         }
         else
         {
             if (!SdlJoysticks.TryGetValue(instanceId, out var joy))
             {
                 SdlJoysticks.Add(instanceId, new SdlJoystick(this, i, instanceId));
             }
             else
             {
                 joy.ActualIndex = i;
             }
         }
     }
 }
예제 #2
0
        public override void ProcessEvents()
        {
            if (Window.Handle == 0)
            {
                throw new InvalidOperationException("Input update event fired without an underlying window.");
            }

            if (_lastHandle != Window.Handle)
            {
                RefreshJoysticksAndGamepads();
                _lastHandle = Window.Handle;
            }

            var i = 0;
            var c = _sdlView.Events.Count;

            for (var j = 0; j < c; j++)
            {
                var @event  = _sdlView.Events[i];
                var skipped = false;
                var r       = 0;
                switch ((EventType)@event.Type)
                {
                case EventType.Keydown:
                case EventType.Keyup:
                case EventType.Textediting:
                case EventType.Textinput:
                {
                    ((SdlKeyboard)Keyboards[0]).DoEvent(@event);
                    break;
                }

                case EventType.Mousemotion:
                case EventType.Mousebuttondown:
                case EventType.Mousebuttonup:
                case EventType.Mousewheel:
                {
                    ((SdlMouse)Mice[0]).DoEvent(@event);
                    break;
                }

                case EventType.Joyaxismotion:
                {
                    if (SdlJoysticks.TryGetValue(@event.Jaxis.Which, out var joy))
                    {
                        joy.DoEvent(@event);
                        break;
                    }

                    if (r > 0)
                    {
                        // discard this event
                        skipped = true;
                        break;
                    }

                    RefreshJoysticksAndGamepads();
                    r++;
                    goto case EventType.Joyaxismotion;
                }

                case EventType.Joyballmotion:
                {
                    if (SdlJoysticks.TryGetValue(@event.Jball.Which, out var joy))
                    {
                        joy.DoEvent(@event);
                        break;
                    }

                    if (r > 0)
                    {
                        // discard this event, this joystick does not exist
                        skipped = true;
                        break;
                    }

                    RefreshJoysticksAndGamepads();
                    r++;
                    goto case EventType.Joyballmotion;
                }

                case EventType.Joyhatmotion:
                {
                    if (SdlJoysticks.TryGetValue(@event.Jhat.Which, out var joy))
                    {
                        joy.DoEvent(@event);
                        break;
                    }

                    if (r > 0)
                    {
                        // discard this event, this joystick does not exist
                        skipped = true;
                        break;
                    }

                    RefreshJoysticksAndGamepads();
                    r++;
                    goto case EventType.Joyhatmotion;
                }

                case EventType.Joybuttondown:
                case EventType.Joybuttonup:
                {
                    if (SdlJoysticks.TryGetValue(@event.Jbutton.Which, out var joy))
                    {
                        joy.DoEvent(@event);
                        break;
                    }

                    if (r > 0)
                    {
                        // discard this event, this joystick does not exist
                        skipped = true;
                        break;
                    }

                    RefreshJoysticksAndGamepads();
                    r++;
                    goto case EventType.Joybuttonup;
                }

                case EventType.Joydeviceadded:
                case EventType.Joydeviceremoved:
                {
                    RefreshJoysticksAndGamepads();
                    if (SdlJoysticks.TryGetValue(@event.Jbutton.Which, out var joy))
                    {
                        ConnectionChanged?.Invoke(joy, @event.Type != (ulong)EventType.Joydeviceremoved);
                    }

                    break;
                }

                case EventType.Controlleraxismotion:
                {
                    if (SdlGamepads.TryGetValue(@event.Caxis.Which, out var gp))
                    {
                        gp.DoEvent(@event);
                        break;
                    }

                    if (r > 0)
                    {
                        // discard this event, this gamepad does not exist
                        skipped = true;
                        break;
                    }

                    RefreshJoysticksAndGamepads();
                    r++;
                    goto case EventType.Controlleraxismotion;
                }

                case EventType.Controllerbuttondown:
                case EventType.Controllerbuttonup:
                {
                    if (SdlGamepads.TryGetValue(@event.Cbutton.Which, out var gp))
                    {
                        gp.DoEvent(@event);
                        break;
                    }

                    if (r > 0)
                    {
                        // discard this event, this gamepad does not exist
                        skipped = true;
                        break;
                    }

                    RefreshJoysticksAndGamepads();
                    r++;
                    goto case EventType.Controllerbuttonup;
                }

                case EventType.Controllerdeviceadded:
                case EventType.Controllerdeviceremoved:
                case EventType.Controllerdeviceremapped:
                {
                    if (SdlGamepads.TryGetValue(@event.Cdevice.Which, out var gp))
                    {
                        gp.DoEvent(@event);
                        break;
                    }

                    if (r > 0)
                    {
                        // discard this event, this gamepad does not exist
                        skipped = true;
                        break;
                    }

                    RefreshJoysticksAndGamepads();
                    r++;
                    goto case EventType.Controllerdeviceremapped;
                }

                case EventType.Fingerdown:
                case EventType.Fingerup:
                case EventType.Fingermotion:
                case EventType.Dollargesture:
                case EventType.Dollarrecord:
                case EventType.Multigesture:
                {
                    // TODO touch input
                    break;
                }

                default:
                {
                    skipped = true;
                    break;
                }
                }

                if (!skipped)
                {
                    _sdlView.Events.RemoveAt(i);
                }
                else
                {
                    i++;
                }
            }

            ((SdlMouse)Mice[0]).Update();
            foreach (var gp in SdlGamepads.Values)
            {
                gp.Update();
            }

            // There's actually nowhere here that will raise an SDL error that we cause.
            // Sdl.ThrowError();
        }