void FASTCALL Joystick_Update(int is_menu, SDL_Keycode key) #endif { BYTE ret0 = 0xff, ret1 = 0xff; BYTE mret0 = 0xff, mret1 = 0xff; int num = 0; //xxx only joy1 static BYTE pre_ret0 = 0xff, pre_mret0 = 0xff; #if defined(PSP) static DWORD button_down = 0; DWORD button_changing; SceCtrlData psppad; sceCtrlPeekBufferPositive(&psppad, 1); if (is_menu || !Config.JoyOrMouse || Keyboard_IsSwKeyboard()) { if (psppad.Buttons & PSP_CTRL_LEFT) { ret0 ^= JOY_LEFT; } if (psppad.Buttons & PSP_CTRL_RIGHT) { ret0 ^= JOY_RIGHT; } if (psppad.Buttons & PSP_CTRL_UP) { ret0 ^= JOY_UP; } if (psppad.Buttons & PSP_CTRL_DOWN) { ret0 ^= JOY_DOWN; } if (psppad.Buttons & PSP_CTRL_CIRCLE) { ret0 ^= JOY_TRG1; } if (psppad.Buttons & PSP_CTRL_CROSS) { ret0 ^= JOY_TRG2; } } else { if (psppad.Buttons & PSP_CTRL_CIRCLE) { mret0 ^= JOY_TRG1; } if (psppad.Buttons & PSP_CTRL_CROSS) { mret0 ^= JOY_TRG2; } } JoyDownState0 = ~(ret0 ^ pre_ret0) | ret0; JoyUpState0 = (ret0 ^ pre_ret0) & ret0; pre_ret0 = ret0; MouseDownState0 = ~(mret0 ^ pre_mret0) | mret0; MouseUpState0 = (mret0 ^ pre_mret0) & mret0; pre_mret0 = mret0; // up the bits which changed the states button_changing = psppad.Buttons ^ button_down; // first down = changing the state & down now JoyDownStatePSP = button_changing & psppad.Buttons; // invert the bits which changed the states button_down ^= button_changing; // save the states of Analog pad JoyAnaPadX = psppad.Lx; JoyAnaPadY = psppad.Ly; #else //defined(PSP) signed int x, y; UINT8 hat; #if defined(ANDROID) || TARGET_OS_IPHONE SDL_Finger *finger; SDL_FingerID fid; float fx, fy; int i, j; float scale, asb_x, asb_y; // play x, play y of a button // all active buttons are set to off for (i = 0; i < VBTN_MAX; i++) { if (vbtn_state[i] != VBTN_NOUSE) { vbtn_state[i] = VBTN_OFF; } } if (touchId == -1) goto skip_vpad; // A play of the button changes size according to scale. scale = WinUI_get_vkscale(); asb_x = (float)20 * scale / 800.0; asb_y = (float)20 * scale / 600.0; // set the button on, only which is pushed just now for (i = 0; i < FINGER_MAX; i++) { finger = SDL_GetTouchFinger(touchId, i); if (!finger) continue; fx = finger->x; fy = finger->y; //p6logd("id: %d x: %f y: %f", i, fx, fy); for (j = 0; j < VBTN_MAX; j++) { if (vbtn_state[j] == VBTN_NOUSE) continue; if (vbtn_rect[j].x - asb_x > fx) continue; if (vbtn_rect[j].x2 + asb_x < fx) continue; if (vbtn_rect[j].y - asb_y > fy) continue; if (vbtn_rect[j].y2 + asb_y < fy) continue; vbtn_state[j] = VBTN_ON; // The buttons don't overlap. break; } } if (need_Vpad()) { if (vbtn_state[0] == VBTN_ON) { ret0 ^= JOY_LEFT; } if (vbtn_state[1] == VBTN_ON) { ret0 ^= JOY_RIGHT; } if (vbtn_state[2] == VBTN_ON) { ret0 ^= JOY_UP; } if (vbtn_state[3] == VBTN_ON) { ret0 ^= JOY_DOWN; } if (vbtn_state[4] == VBTN_ON) { ret0 ^= (Config.VbtnSwap == 0)? JOY_TRG1 : JOY_TRG2; } if (vbtn_state[5] == VBTN_ON) { ret0 ^= (Config.VbtnSwap == 0)? JOY_TRG2 : JOY_TRG1; } } else if (Config.JoyOrMouse) { if (vbtn_state[4] == VBTN_ON) { mret0 ^= (Config.VbtnSwap == 0)? JOY_TRG1 : JOY_TRG2; } if (vbtn_state[5] == VBTN_ON) { mret0 ^= (Config.VbtnSwap == 0)? JOY_TRG2 : JOY_TRG1; } } skip_vpad: #endif //defined(ANDROID) || TARGET_OS_IPHONE // Hardware Joystick if (sdl_joy) { SDL_JoystickUpdate(); x = SDL_JoystickGetAxis(sdl_joy, Config.HwJoyAxis[0]); y = SDL_JoystickGetAxis(sdl_joy, Config.HwJoyAxis[1]); if (x < -JOYAXISPLAY) { ret0 ^= JOY_LEFT; } if (x > JOYAXISPLAY) { ret0 ^= JOY_RIGHT; } if (y < -JOYAXISPLAY) { ret0 ^= JOY_UP; } if (y > JOYAXISPLAY) { ret0 ^= JOY_DOWN; } hat = SDL_JoystickGetHat(sdl_joy, Config.HwJoyHat); if (hat) { switch (hat) { case SDL_HAT_RIGHTUP: ret0 ^= JOY_RIGHT; case SDL_HAT_UP: ret0 ^= JOY_UP; break; case SDL_HAT_RIGHTDOWN: ret0 ^= JOY_DOWN; case SDL_HAT_RIGHT: ret0 ^= JOY_RIGHT; break; case SDL_HAT_LEFTUP: ret0 ^= JOY_UP; case SDL_HAT_LEFT: ret0 ^= JOY_LEFT; break; case SDL_HAT_LEFTDOWN: ret0 ^= JOY_LEFT; case SDL_HAT_DOWN: ret0 ^= JOY_DOWN; break; } } if (SDL_JoystickGetButton(sdl_joy, Config.HwJoyBtn[0])) { ret0 ^= JOY_TRG1; } if (SDL_JoystickGetButton(sdl_joy, Config.HwJoyBtn[1])) { ret0 ^= JOY_TRG2; } if (SDL_JoystickGetButton(sdl_joy, Config.HwJoyBtn[2])) { ret1 ^= JOY_TRG3; } if (SDL_JoystickGetButton(sdl_joy, Config.HwJoyBtn[3])) { ret1 ^= JOY_TRG4; } if (SDL_JoystickGetButton(sdl_joy, Config.HwJoyBtn[4])) { ret1 ^= JOY_TRG5; } if (SDL_JoystickGetButton(sdl_joy, Config.HwJoyBtn[5])) { ret1 ^= JOY_TRG6; } if (SDL_JoystickGetButton(sdl_joy, Config.HwJoyBtn[6])) { ret1 ^= JOY_TRG7; } if (SDL_JoystickGetButton(sdl_joy, Config.HwJoyBtn[7])) { ret1 ^= JOY_TRG8; } } // scan keycode for menu UI if (key != SDLK_UNKNOWN) { switch (key) { case SDLK_UP : ret0 ^= JOY_UP; break; case SDLK_DOWN: ret0 ^= JOY_DOWN; break; case SDLK_LEFT: ret0 ^= JOY_LEFT; break; case SDLK_RIGHT: ret0 ^= JOY_RIGHT; break; case SDLK_RETURN: ret0 ^= JOY_TRG1; break; case SDLK_ESCAPE: ret0 ^= JOY_TRG2; break; } } JoyDownState0 = ~(ret0 ^ pre_ret0) | ret0; JoyUpState0 = (ret0 ^ pre_ret0) & ret0; pre_ret0 = ret0; MouseDownState0 = ~(mret0 ^ pre_mret0) | mret0; MouseUpState0 = (mret0 ^ pre_mret0) & mret0; pre_mret0 = mret0; #endif //defined(PSP) // disable Joystick when software keyboard is active if (!is_menu && !Keyboard_IsSwKeyboard()) { JoyState0[num] = ret0; JoyState1[num] = ret1; } #if defined(USE_OGLES11) || defined(PSP) // update the states of the mouse buttons if (!(MouseDownState0 & JOY_TRG1) | (MouseUpState0 & JOY_TRG1)) { printf("mouse btn1 event\n"); Mouse_Event(1, (MouseUpState0 & JOY_TRG1)? 0 : 1.0, 0); } if (!(MouseDownState0 & JOY_TRG2) | (MouseUpState0 & JOY_TRG2)) { printf("mouse btn2 event\n"); Mouse_Event(2, (MouseUpState0 & JOY_TRG2)? 0 : 1.0, 0); } #ifdef PSP mouse_update_psp(psppad); #endif #endif }
void FASTCALL Joystick_Update(void) { #if defined(PSP) BYTE ret0 = 0xff, ret1 = 0xff; int num = 0; //xxx とりあえずJOY1のみ。 static BYTE pre_ret0 = 0xff; static DWORD button_down = 0; DWORD button_changing; SceCtrlData psppad; sceCtrlPeekBufferPositive(&psppad, 1); if (psppad.Buttons & PSP_CTRL_LEFT) { ret0 ^= JOY_LEFT; } if (psppad.Buttons & PSP_CTRL_RIGHT) { ret0 ^= JOY_RIGHT; } if (psppad.Buttons & PSP_CTRL_UP) { ret0 ^= JOY_UP; } if (psppad.Buttons & PSP_CTRL_DOWN) { ret0 ^= JOY_DOWN; } if (psppad.Buttons & PSP_CTRL_CIRCLE) { ret0 ^= JOY_TRG1; } if (psppad.Buttons & PSP_CTRL_CROSS) { ret0 ^= JOY_TRG2; } JoyDownState0 = ~(ret0 ^ pre_ret0) | ret0; pre_ret0 = ret0; // 前回と変化のあったbitを立てる button_changing = psppad.Buttons ^ button_down; // 今回初めて押された = 前回と変化がある & 今ボタンが押されている JoyDownStatePSP = button_changing & psppad.Buttons; // 変化のあったbitを反転させる button_down ^= button_changing; // ソフトウェアキーボードを出しているときにはJoystick無効 if (!Keyboard_IsSwKeyboard()) { JoyState0[num] = ret0; JoyState1[num] = ret1; } #elif defined(ANDROID) BYTE ret0 = 0xff, ret1 = 0xff; int num = 0; //xxx とりあえずJOY1のみ。 static BYTE pre_ret0 = 0xff; SDL_Finger *finger; SDL_FingerID fid; float fx, fy; int i, j; float scale, asb_x, asb_y; // あそびx, あそびy if (touchId == -1) return; // 使用中の物は全てオフにリセットする for (i = 0; i < VBTN_MAX; i++) { if (vbtn_state[i] != VBTN_NOUSE) { vbtn_state[i] = VBTN_OFF; } } // 仮想キーの大きさに従ってあそびも大きくする scale = WinUI_get_vkscale(); asb_x = (float)20 * scale / 800.0; asb_y = (float)20 * scale / 600.0; // この瞬間押されているボタンだけをオンにする for (i = 0; i < FINGER_MAX; i++) { finger = SDL_GetTouchFinger(touchId, i); if (!finger) continue; fx = finger->x; fy = finger->y; //__android_log_print(ANDROID_LOG_DEBUG,"Tag","id: %d x: %f y: %f", i, fx, fy); for (j = 0; j < VBTN_MAX; j++) { if (vbtn_state[j] == VBTN_NOUSE) continue; // 性能を考え一個ずつ判定。少し遊びをもたせる。 if (vbtn_rect[j].x - asb_x > fx) continue; if (vbtn_rect[j].x2 + asb_x < fx) continue; if (vbtn_rect[j].y - asb_y > fy) continue; if (vbtn_rect[j].y2 + asb_y < fy) continue; //マッチしたらオンにする vbtn_state[j] = VBTN_ON; //仮想ボタンは重ならない break; } } if (vbtn_state[0] == VBTN_ON) { ret0 ^= JOY_LEFT; } if (vbtn_state[1] == VBTN_ON) { ret0 ^= JOY_RIGHT; } if (vbtn_state[2] == VBTN_ON) { ret0 ^= JOY_UP; } if (vbtn_state[3] == VBTN_ON) { ret0 ^= JOY_DOWN; } if (vbtn_state[4] == VBTN_ON) { ret0 ^= (Config.VbtnSwap == 0)? JOY_TRG1 : JOY_TRG2; } if (vbtn_state[5] == VBTN_ON) { ret0 ^= (Config.VbtnSwap == 0)? JOY_TRG2 : JOY_TRG1; } JoyDownState0 = ~(ret0 ^ pre_ret0) | ret0; pre_ret0 = ret0; // ソフトウェアキーボードを出しているときにはJoystick無効 if (!Keyboard_IsSwKeyboard()) { JoyState0[num] = ret0; JoyState1[num] = ret1; } #endif }