int updatedragpos(SDL_TouchFingerEvent &e, Uint32 et, const int2 &screensize) { int numfingers = SDL_GetNumTouchFingers(e.touchId); //assert(numfingers && e.fingerId < numfingers); for (int i = 0; i < numfingers; i++) { auto finger = SDL_GetTouchFinger(e.touchId, i); if (finger->id == e.fingerId) { // this is a bit clumsy as SDL has a list of fingers and so do we, but they work a bit differently int j = findfinger(e.fingerId, et == SDL_FINGERUP); auto &f = fingers[j]; auto ep = float2(e.x, e.y); auto ed = float2(e.dx, e.dy); auto xy = ep * float2(screensize); // FIXME: converting back to int coords even though touch theoretically may have higher res f.mousepos = int2(xy * float(screenscalefactor)); f.mousedelta += int2(ed * float2(screensize)); return j; } } //assert(0); return 0; }
void input_uevents(void) { SDL_Event peek; #if SDL_VERSION_ATLEAST(1,3,0) while (SDL_PeepEvents(&peek, 1, SDL_GETEVENT, SDL_USEREVENT, SDL_USEREVENT) > 0) { #else while (SDL_PeepEvents(&peek, 1, SDL_GETEVENT, SDL_EVENTMASK (SDL_USEREVENT)) > 0) { #endif void (*p) (void*) = (void (*)(void*)) peek.user.data1; p(peek.user.data2); } } #if SDL_VERSION_ATLEAST(1,3,0) static void key_compat(struct inp_event *inp) { if (!strcmp(inp->sym, "pageup")) strcpy(inp->sym, "page up"); else if (!strcmp(inp->sym, "pagedown")) strcpy(inp->sym, "page down"); } #endif #ifdef IOS static unsigned long touch_stamp = 0; static int touch_num = 0; #endif int finger_pos(const char *finger, int *x, int *y, float *pressure) { #if SDL_VERSION_ATLEAST(2,0,0) SDL_TouchID tid; SDL_FingerID fid; SDL_Finger *f; int i, n; #ifndef PRIx64 if (sscanf(finger, "%llx:%llx", &fid, &tid) != 2) return -1; #else if (sscanf(finger, "%"PRIx64":%"PRIx64, &fid, &tid) != 2) return -1; #endif n = SDL_GetNumTouchFingers(tid); if (n <= 0) return -1; for (i = 0; i < n; i++) { f = SDL_GetTouchFinger(tid, i); if (f->id == fid) { if (pressure) *pressure = f->pressure; gfx_finger_pos_scale(f->x, f->y, x, y); return 0; } } return -1; #else return -1; #endif }
//touch funcs void Card::scale(SDL_Event* e) { SDL_Finger* finger = SDL_GetTouchFinger(e->mgesture.touchId, 0); double scaleFactor = (sqrt(pow(finger->x - e->mgesture.x,2) + pow(finger->y - e->mgesture.y, 2))+e->mgesture.dDist) /sqrt(pow(finger->x - e->mgesture.x,2) + pow(finger->y - e->mgesture.y, 2)); width *= scaleFactor; height *= scaleFactor; }
void CInput::processMouse(SDL_Event& ev) { SDL_Rect screenRect; //SDL_Touch* touch = SDL_GetTouch(ev.tfinger.touchId); SDL_Finger* touch = SDL_GetTouchFinger(ev.tfinger.touchId, 0); int x, y, dx, dy, w, h; if(SDL_GetDisplayBounds(0, &screenRect) == 0) { w = screenRect.w; h = screenRect.h; } if(touch == NULL) return; //The touch has been removed //float fx = ((float)ev.tfinger.x)/touch->xres; //float fy = ((float)ev.tfinger.y)/touch->yres; float fx = ((float)ev.tfinger.x)/touch->x; float fy = ((float)ev.tfinger.y)/touch->y; x = (int)(fx*w); y = (int)(fy*h); switch(ev.type) { case SDL_FINGERDOWN: processMouse(x, y, true, ev.tfinger.fingerId); break; case SDL_FINGERUP: processMouse(x, y, false, ev.tfinger.fingerId); break; case SDL_FINGERMOTION: //float fdx = ((float)ev.tfinger.dx)/touch->xres; //float fdy = ((float)ev.tfinger.dy)/touch->yres; float fdx = ((float)ev.tfinger.dx)/touch->x; float fdy = ((float)ev.tfinger.dy)/touch->y; dx = (int)(fdx*w); dy = (int)(fdy*h); processMouse(x - dx, y - dy, false, ev.tfinger.fingerId); processMouse(x, y, true, ev.tfinger.fingerId); break; } //#endif }
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 }
int main(int argc, char *argv[]) { seed(); // extern bool pause; SDL_Init(SDL_INIT_EVERYTHING); IMG_Init(IMG_INIT_PNG); TTF_Init(); audio_engine::init(); SDL_LogSetAllPriority(SDL_LOG_PRIORITY_WARN); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_SetHint("SDL_HINT_ORIENTATIONS", "LandscapeRight"); SDL_DisplayMode mode; SDL_GetDisplayMode(0, 0, &mode); int scale_factor = 1; #if MOBILE SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); pool::get().screen = vec2(mode.w, mode.h); // sw = mode.w; // sh = mode.h; cout << pool::get().screen.x << " sdf " << pool::get().screen.y << endl; SDL_Window *window = SDL_CreateWindow(NULL, 0, 0, pool::get().screen.w, pool::get().screen.h, SDL_WINDOW_OPENGL | SDL_WINDOW_BORDERLESS | SDL_WINDOW_ALLOW_HIGHDPI); // sw *= 2; // sh *= 2; SDL_Joystick *accelerometer = SDL_JoystickOpen(0); #elif __WINDOWS__ pool::get().screen = vec2(1136, 640); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); // don't think about high dpi monitors on windows for now SDL_Window *window = SDL_CreateWindow(NULL, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, pool::get().screen.w, pool::get().screen.h, SDL_WINDOW_OPENGL); #elif __MACOSX__ pool::get().screen = vec2(1136 * 1.5, 640 * 1.5); SDL_Window *window = SDL_CreateWindow(NULL, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, pool::get().screen.w / 2, pool::get().screen.h / 2, SDL_WINDOW_OPENGL | SDL_WINDOW_ALLOW_HIGHDPI); scale_factor = 2; #endif SDL_GLContext context = SDL_GL_CreateContext(window); if (!context) cout << "Couldn't create context: " << SDL_GetError() << endl; #if __WINDOWS__ // Initialize GLEW glewExperimental = GL_TRUE; GLenum glewError = glewInit(); if (glewError != GLEW_OK) { printf("Error initializing GLEW! %s\n", glewGetErrorString(glewError)); } #endif SDL_GL_SetSwapInterval(1); SDL_Event event; int sw, sh; SDL_GL_GetDrawableSize(window, &sw, &sh); cout << "DRAWABLE SIZE: width: " << sw << " height: " << sh << endl; // glClearColor(0.1, 0.3, 0.8, 1.0); glClearColor(0.1, 0.1, 0.18, 0.0); // glEnable(GL_CULL_FACE); glEnable(GL_BLEND); // glEnable(GL_DEPTH_TEST); // glEnable(GL_ALPHA_TEST); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glViewport(0, 0, pool::get().screen.w, pool::get().screen.h); load_at_start(); // load the spritesheets required throught the game world *w; game_state game; //game.set_next(GS_TITLE); game.set_next(GS_RUN); w = game.switch_state(); #if PC w->keys = SDL_GetKeyboardState(NULL); #endif glClear(GL_COLOR_BUFFER_BIT); while (true) { renderer::frames++; Uint32 frame_time; Uint32 start_time; Uint32 end_time; SDL_PumpEvents(); while (SDL_PollEvent(&event)) { #if MOBILE if (event.type == SDL_FINGERDOWN) { w->touch_down(touchFromtfinger(event.tfinger)); } if (event.type == SDL_FINGERUP) { w->touch_up(touchFromtfinger(event.tfinger)); } if (event.type == SDL_FINGERMOTION) { w->touch_moved(touchFromtfinger(event.tfinger)); } #endif #if PC if (event.type == SDL_MOUSEBUTTONUP) { int x, y; SDL_GetMouseState(&x, &y); x = x * scale_factor; y = (pool::get().screen.h / 2 - y) * scale_factor; touch t; t.pos = vec2(x, y); w->touch_up(t); } if (event.type == SDL_MOUSEBUTTONDOWN) { int x, y; SDL_GetMouseState(&x, &y); x = x * 2; y = (pool::get().screen.h / 2 - y) * scale_factor; // SDL_GetMouseState(&x, &y); touch t; t.pos = vec2(x, y); w->touch_down(t); } if (event.type == SDL_MOUSEMOTION) { int x, y; SDL_GetMouseState(&x, &y); x = x * scale_factor; y = (pool::get().screen.h / 2 - y) * scale_factor; touch t; t.pos = vec2(x, y); w->touch_moved(t); } if (event.type == SDL_KEYDOWN) { const Uint8 *state = SDL_GetKeyboardState(NULL); if (state[SDL_SCANCODE_P]) { cout << "Pause status1:efdff " << pause::value << endl; pause::toggle(); // game.set_next(GS_PAUSE); cout << "Pause status1:efdff " << pause::value << endl; } } #endif if (event.type == SDL_QUIT) goto quit; } #if MOBILE SDL_TouchID tId = SDL_GetTouchDevice(0); int numTouches = SDL_GetNumTouchFingers(tId); w->touches.clear(); for (int i = 0; i < numTouches; i++) { SDL_Finger *finger = SDL_GetTouchFinger(tId, i); touch t; t.pos = vec2(finger->x * pool::get().screen.w, (1 - finger->y) * pool::get().screen.h); w->touches.push_back(t); } #endif #if __IPHONEOS__ float ax = SDL_JoystickGetAxis(accelerometer, 0); float ay = SDL_JoystickGetAxis(accelerometer, 1); float az = SDL_JoystickGetAxis(accelerometer, 2); float k = 0x7FFF; ax *= SDL_IPHONE_MAX_GFORCE / k; ay *= SDL_IPHONE_MAX_GFORCE / k; az *= SDL_IPHONE_MAX_GFORCE / k; w->accel_update(vec3(ax, ay, az)); #endif // cout << "Pause status1:efdff " << pause << endl; #if PC //if (!pause::value) { w->keyboard_update(w->keys); //} #endif start_time = SDL_GetTicks(); //if (!pause::value) { w->update(); w->process_entities(); //} if (pause::value) { vec2 screen = pool::get().screen; vec2 max_scale = screen / vec2(100.0f, 100.0f); int x_center = pool::get().screen.x / 2; int y_center = pool::get().screen.y / 2; pool::get().draw("tap.png").pos(vec2(x_center, y_center)).scale(max_scale).cam(nullptr).alpha(pause::alpha); pool::get().draw("pause.png").pos(vec2(x_center, y_center)).cam(nullptr); } if (pause::unpausing) { cout << "unpausing " << pause::alpha << endl; if (pause::alpha >= 1.0f) { pause::value = false; pause::unpausing = false; pause::alpha = 0.4f; } else { pause::alpha = pause::alpha+0.1f; } } end_time = SDL_GetTicks(); frame_time = end_time - start_time; w->frame_time = frame_time; SDL_GL_SwapWindow(window); glClear(GL_COLOR_BUFFER_BIT); // glAlphaFunc(GL_GREATER, 0); if (tutorial_state::tutorial_level == 2) { game.set_next(GS_TUTORIAL2); } else if (tutorial_state::tutorial_level == 3) { game.set_next(GS_TUTORIAL3); } else if (tutorial_state::tutorial_level == 4) { tutorial_state::tutorial_level = 1; game.set_next(GS_RUN); } if (game.update(w)) { w = game.switch_state(); } } quit: io::save_settings(); audio_engine::close(); SDL_Quit(); IMG_Quit(); TTF_Quit(); return 0; }
void FASTCALL Joystick_Update(void) { #if defined(PSP) BYTE ret0 = 0xff, ret1 = 0xff; int num = 0; //xxx とりあえずJOY1のみ。 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; } JoyState0[num] = ret0; JoyState1[num] = ret1; #elif defined(ANDROID) SDL_Finger *finger; SDL_FingerID fid; float fx, fy; int i, j; if (touchId == -1) return; // 使用中の物は全てオフにリセットする for (i = 0; i < VBTN_MAX; i++) { if (vbtn_state[i] != VBTN_NOUSE) { vbtn_state[i] = VBTN_OFF; } } // この瞬間押されているボタンだけをオンにする 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 / 800.0 > fx) continue; if (vbtn_rect[j].x2 / 800.0 < fx) continue; if (vbtn_rect[j].y / 600.0 > fy) continue; if (vbtn_rect[j].y2 / 600.0 < fy) continue; //マッチしたらオンにする vbtn_state[j] = VBTN_ON; //仮想ボタンは重ならない break; } } BYTE ret0 = 0xff, ret1 = 0xff; int num = 0; //xxx とりあえずJOY1のみ。 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 ^= JOY_TRG1; } if (vbtn_state[5] == VBTN_ON) { ret0 ^= JOY_TRG2; } JoyState0[num] = ret0; JoyState1[num] = ret1; #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 }
bool inputSystem::processUnbufferedTouchInput() // reads in unbuffered touch input { renderEngine *render = renderEngine::Instance(); int state = -1; SDL_TouchFingerEvent touchMotion; //SDL_Event evt; // SDL_SetWindowGrab(renderE->getSDLWindow(), SDL_TRUE); // logMsg("sdl grab = " +Ogre::StringConverter::toString(SDL_GetWindowGrab(renderE->getSDLWindow()))); SDL_PumpEvents(); int numDevs = SDL_GetNumTouchDevices(); logMsg("numTouchDevices = " +Ogre::StringConverter::toString(numDevs)); int evtState = 0; evtState = SDL_EventState(SDL_FINGERMOTION, SDL_QUERY); logMsg("evtState FINGERMOTION = " +Ogre::StringConverter::toString(evtState)); evtState = 0; evtState = SDL_EventState(SDL_FINGERDOWN, SDL_QUERY); logMsg("evtState FINGERDOWN = " +Ogre::StringConverter::toString(evtState)); SDL_Finger *finger = SDL_GetTouchFinger(0,0); logMsg("Finger = " +Ogre::StringConverter::toString(finger)); evtState = 0; evtState = SDL_EventState(SDL_FINGERUP, SDL_QUERY); if (evtState > 0) { logMsg("evtState FINGERUP = " +Ogre::StringConverter::toString(evtState)); // exit(0); } int x = inputEvent.tfinger.x*render->getWindowWidth(); int y = inputEvent.tfinger.y*render->getWindowHeight(); // if (MyGUI::InputManager::getInstance().isFocusMouse()) // { // exit(0); // std::cout << "focused" << std::endl; if(SDL_EventState(SDL_FINGERDOWN, SDL_QUERY) == 1) { mouseLeftClick = 1; // exit(0); MyGUI::InputManager::getInstance().injectMousePress(x, y, MyGUI::MouseButton::Enum(0)); // exit(0); } if (SDL_EventState(SDL_FINGERUP, SDL_QUERY) == 1) //if (SDL_GetMouseState(NULL, NULL)&SDL_BUTTON(1) == 0) { // exit(0); mouseLeftClick = 0; MyGUI::InputManager::getInstance().injectMouseRelease(x, y, MyGUI::MouseButton::Enum(0)); } // } // SDL_GetWindowSize( /* while (SDL_PollEvent(&inputEvent) > 0) { switch (inputEvent.type) { case SDL_FINGERMOTION: logMsg("Motion!"); exit(0); break; case SDL_FINGERDOWN: logMsg("Finger Down!"); exit(0); break; case SDL_FINGERUP: logMsg("Finger Up!"); exit(0); break; case SDL_MULTIGESTURE: logMsg("Multigesture!"); exit(0); break; case SDL_KEYDOWN: logMsg("Keydown!"); exit(0); break; case SDL_MOUSEBUTTONDOWN: logMsg("MouseButtondown!"); exit(0); break; case SDL_MOUSEMOTION: logMsg("MouseMotion!"); exit(0); break; case SDL_MOUSEWHEEL: logMsg("MouseWheel!"); exit(0); break; case SDL_JOYAXISMOTION: case SDL_JOYBALLMOTION: case SDL_JOYHATMOTION: case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONUP: logMsg("Joystick!"); exit(0); break; case SDL_WINDOWEVENT: logMsg("Window!"); exit(0); break; default: break; } } */ // state = return true; }