handleSdlEvent method

  1. @mustCallSuper
void handleSdlEvent(
  1. Event event
)

Handle SDL events.

This method will be passed one event at a time.

Implementation

@mustCallSuper
void handleSdlEvent(final Event event) {
  final sdl = event.sdl;
  if (event is QuitEvent) {
    stop();
  } else if (event is ControllerDeviceEvent) {
    switch (event.state) {
      case DeviceState.added:
        final controller = sdl.openGameController(event.joystickId);
        gameControllers[event.joystickId] = controller;
        break;
      case DeviceState.removed:
        gameControllers.remove(event.joystickId);
        break;
      case DeviceState.remapped:
        // Do nothing.
        break;
    }
  } else if (event is JoyDeviceEvent) {
    final id = event.joystickId;
    switch (event.state) {
      case DeviceState.added:
        final joystick = sdl.openJoystick(id);
        joysticks[id] = joystick;
        break;
      case DeviceState.removed:
        joysticks.remove(id);
        break;
      case DeviceState.remapped:
        // Do nothing.
        break;
    }
  } else {
    final level = currentLevel;
    if (level != null) {
      for (final commandTrigger in triggerMap.triggers) {
        final name = commandTrigger.name;
        final key = commandTrigger.keyboardKey;
        final button = commandTrigger.button;
        if ((event is KeyboardEvent &&
                event.repeat == false &&
                key != null &&
                event.key.scancode == key.scanCode &&
                (key.altKey == false ||
                    event.key.modifiers.contains(KeyMod.alt)) &&
                (key.controlKey == false ||
                    event.key.modifiers.contains(KeyMod.ctrl)) &&
                (key.shiftKey == false ||
                    event.key.modifiers.contains(KeyMod.shift))) ||
            (event is ControllerButtonEvent &&
                button != null &&
                event.button == button)) {
          final PressedState state;
          if (event is KeyboardEvent) {
            state = event.state;
          } else if (event is ControllerButtonEvent) {
            state = event.state;
          } else {
            throw Exception('Internal error.');
          }
          final bool value;
          switch (state) {
            case PressedState.pressed:
              value = level.startCommand(name);
              break;
            case PressedState.released:
              value = level.stopCommand(name);
              break;
          }
          if (value == true) {
            return;
          }
        }
      }
      level.handleSdlEvent(event);
    }
  }
}