diff --git a/Sources/JolkEngine/Application.swift b/Sources/JolkEngine/Application.swift index c43b179..e72023e 100644 --- a/Sources/JolkEngine/Application.swift +++ b/Sources/JolkEngine/Application.swift @@ -84,7 +84,7 @@ public class Application for idx in 0...SDL_NumJoysticks() { if SDL_IsGameController(idx) != SDL_TRUE { continue } - Input.instance.padConnectedEvent(index: idx) + Input.instance.padConnectedEvent(deviceIndex: idx) } do @@ -129,9 +129,9 @@ public class Application Input.instance.releaseEvent(scan: event.key.keysym.scancode) case SDL_CONTROLLERDEVICEADDED: if SDL_IsGameController(event.cdevice.which) != SDL_TRUE { break } - Input.instance.padConnectedEvent(index: event.cdevice.which) + Input.instance.padConnectedEvent(deviceIndex: event.cdevice.which) case SDL_CONTROLLERDEVICEREMOVED: - Input.instance.padRemovedEvent(index: event.cdevice.which) + Input.instance.padRemovedEvent(id: event.cdevice.which) case SDL_CONTROLLERBUTTONDOWN: Input.instance.padButtonPressEvent(id: event.cbutton.which, btn: event.cbutton.button) case SDL_CONTROLLERBUTTONUP: diff --git a/Sources/JolkEngine/Input/GamePad.swift b/Sources/JolkEngine/Input/GamePad.swift index 29ea950..c98b1fa 100644 --- a/Sources/JolkEngine/Input/GamePad.swift +++ b/Sources/JolkEngine/Input/GamePad.swift @@ -69,10 +69,21 @@ public class GamePad private var _btns = [UInt8](repeating: 0, count: Int(SDL_CONTROLLER_BUTTON_MAX.rawValue)) private var _axes = [Int16](repeating: 0, count: Int(SDL_CONTROLLER_AXIS_MAX.rawValue)) - private var _sdlPad: OpaquePointer + private var _joyID: SDL_JoystickID, _sdlPad: OpaquePointer - internal init(pad: OpaquePointer) + internal var instanceID: SDL_JoystickID { _joyID } + public var name: String { String(cString: SDL_GameControllerName(_sdlPad)) } + + internal static func open(device: Int32) -> GamePad? { + guard let sdlPad = SDL_GameControllerOpen(device) else { return nil } + let joyID = SDL_JoystickGetDeviceInstanceID(device) + return GamePad(instance: joyID, pad: sdlPad) + } + + private init(instance: SDL_JoystickID, pad: OpaquePointer) + { + self._joyID = instance self._sdlPad = pad } diff --git a/Sources/JolkEngine/Input/Input.swift b/Sources/JolkEngine/Input/Input.swift index 1445d94..efa3ec8 100644 --- a/Sources/JolkEngine/Input/Input.swift +++ b/Sources/JolkEngine/Input/Input.swift @@ -19,20 +19,25 @@ public class Input internal func pressEvent(scan: SDL_Scancode, repeat r: Bool) { keyboard.pressEvent(scan: scan, repeat: r) } internal func releaseEvent(scan: SDL_Scancode) { keyboard.releaseEvent(scan: scan) } - internal func padConnectedEvent(index: Int32) + internal func padConnectedEvent(deviceIndex: Int32) { - guard let sdlPad = SDL_GameControllerOpen(index) - else { return } - let id = SDL_JoystickGetDeviceInstanceID(index) - _pads[id] = GamePad(pad: sdlPad) - print("Using gamepad #\(id), \"\(String(cString: SDL_GameControllerName(sdlPad)))\"") - if _firstJoyID < 0 { _firstJoyID = id } + if let pad = GamePad.open(device: deviceIndex) + { + print("Using gamepad #\(pad.instanceID), \"\(pad.name)\"") + if _firstJoyID < 0 + { + _firstJoyID = pad.instanceID + } + _pads[pad.instanceID] = pad + } } - internal func padRemovedEvent(index: Int32) + internal func padRemovedEvent(id: Int32) { - let id = SDL_JoystickGetDeviceInstanceID(index) - _pads.removeValue(forKey: id) + if let pad = _pads.removeValue(forKey: id) + { + pad.close() + } if id == _firstJoyID { _firstJoyID = _pads.keys.first ?? -1