Example #1
0
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;
}
Example #2
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
}
Example #3
0
//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;
}
Example #4
0
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
}
Example #5
0
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
}
Example #6
0
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;
}
Example #7
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
}
Example #8
0
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
}
Example #9
0
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;
}