c++ - SDL is sending a wrong controller index -
i'm creating simple game , i'm using sdl2 handling inputs controllers. issue sdl not giving me correct index controller causes game crash.
/receive controller index given sdl int cidx = evt.cdevice.which; switch (evt.type) { case sdl_controlleraxismotion: { //......... break; } case sdl_controllerbuttonup: { inputbutton sender = inputbutton(evt.cbutton.button); controllerstates[cidx]->setbuttonstate(sender, false); break; } case sdl_controllerbuttondown: { if (evt.cbutton.button != sdl_controller_button_invalid) { inputbutton sender = inputbutton(evt.cbutton.button); controllerstates[cidx]->setbuttonstate(sender, true); } break; } case sdl_controllerdeviceadded: { if (sdl_isgamecontroller(cidx)) { sdl_gamecontroller * controller = sdl_gamecontrolleropen(cidx); addcontroller(controller); } break; } case sdl_controllerdeviceremoved: { removecontroller(controllers[(cidx)]); break; }
}
this works fine when user add controller first time, sdl sending me 0 index in sdl_controllerdeviceadded event , 0 other events. problem if user tries disconnect , reconnect controller sdl send 0 index in sdl_controllerdeviceadded event , 1 other events causes game crash.
i can make simple check if index avoid crash useless since controller events ignored.
any appreciated.
thanks
according sdl documentation, index used on sdl_gamecontrolleropen not index identify controller in future events. need use joystick id instead.
switch (evt.type) { case sdl_controlleraxismotion: { //... break; } case sdl_controllerbuttonup: { //get joystick id controller index //.... break; } case sdl_controllerbuttondown: { //get joystick id controller index //.... break; } case sdl_controllerdeviceadded: { if (sdl_isgamecontroller(cidx)) { sdl_gamecontroller * controller = sdl_gamecontrolleropen(cidx); sdl_joystick* j = sdl_gamecontrollergetjoystick(controller); sdl_joystickid joyid = sdl_joystickinstanceid(j); //save joystick id used in future events addcontroller(controller); } break; } case sdl_controllerdeviceremoved: { //get joystick id controller index break; } }
Comments
Post a Comment