Android 上的触摸事件 SDL2

Touch events SDL2 on Android

我正在利用 SDL2 的可移植性使用 C++ 为 Android 开发俄罗斯方块,问题是当我从触摸界面获取事件时有很多延迟,就像函数 SDL_PollEvent() 不像在 PC 上那样工作,我已经在我的获取事件方法中写了这个。

float x = 0, y = 0;

while (SDL_PollEvent(&event)){

    switch (event.type) {

        case SDL_QUIT: { gameState = false; break;}

        case SDL_FINGERDOWN: {

            x = event.tfinger.x;
            y = event.tfinger.y;

            SDL_Log("\nDesplazamiento x: %f desplazamiento y: %f.\n", x, y);

            window.get_AbsPixels(&x, &y);

            if (x >= keys->U.getX() && x <= (keys->U.getX() + keys->U.getW()) &&
                y >= keys->U.getY() && x <= keys->U.getY() + keys->U.getH())
                return Up;

            if (x >= keys->D.getX() && x <= (keys->D.getX() + keys->D.getW()) &&
                y >= keys->D.getY() && x <= keys->D.getY() + keys->D.getH())
                return Down;

            if (x >= keys->L.getX() && x <= (keys->L.getX() + keys->L.getW()) &&
                y >= keys->L.getY() && x <= keys->L.getY() + keys->L.getH())
                return Left;

            if (x >= keys->R.getX() && x <= (keys->R.getX() + keys->R.getW()) &&
                y >= keys->R.getY() && x <= keys->R.getY() + keys->R.getH())
                return Right;

            break;
        }

        default: break;
    }

    return None;
}

但是当我在 android 上调试我的应用程序时,尽管事件应该已经返回并且应该在动画之前收到,但事件仍然延迟,所以我猜想它们是否在 Android 的另一个线程中处理或其他原因,因为它们的行为独立于动画。

之前用这个试过:

float x = 0, y = 0, tmpx = 0, tmpy = 0;

while (SDL_PollEvent(&event)){

    if (event.type == SDL_QUIT){ gameState = false; }

    switch (event.type) {

        case SDL_FINGERMOTION: {

            tmpx = event.tfinger.dx;
            tmpy = event.tfinger.dy;

            window.get_AbsPixels(&tmpx, &tmpy);

            x += tmpx; y += tmpy;
            tmpx = tmpy = 0;

            SDL_Log("\nDesplazamiento x: %f desplazamiento y: %f.\n", x, y);

            break;
        }

        default: break;
    }

    if ((x > 70 || x < -70) || (y > 70 || y < -70))
        return window.process_Dplcmnt(x, y);
}

return None;

..但它也比新的给了我很多延迟。

所以为了让一切都清楚并可以根据,有人可以解释一下应该如何在 Android 上使用 SDL 处理触摸事件吗?提前致谢。

我已经解决了它,在每个 case: 之后,即使没有人符合某个条件,也总是会返回,所以不匹配的未决事件会保留在那里,不会正确刷新,只是移动了状态return None; 外面一会儿。现在它像在 PC 上一样工作了。

float x = 0, y = 0;

while (SDL_PollEvent(&event)){

    switch (event.type) {

        case SDL_QUIT: { board->setGameState(false); break;}

        case SDL_FINGERDOWN: {

            x = event.tfinger.x;
            y = event.tfinger.y;

            SDL_Log("\nDesplazamiento x: %f desplazamiento y: %f.\n", x, y);

            window.get_AbsPixels(&x, &y);

            if (x > keys->U.getX() && x < (keys->U.getX() + keys->U.getW()) &&
                y > keys->U.getY() && y < keys->U.getY() + keys->U.getH()) {
                SDL_Log("\nRetornado Up\n");
                return Up;
            }

            if (x > keys->D.getX() && x < (keys->D.getX() + keys->D.getW()) &&
                y > keys->D.getY() && y < keys->D.getY() + keys->D.getH()) {
                SDL_Log("\nRetornado Down\n");
                return Down;
            }

            if (x > keys->L.getX() && x < (keys->L.getX() + keys->L.getW()) &&
                y > keys->L.getY() && y < keys->L.getY() + keys->L.getH()) {
                SDL_Log("\nRetornado Left\n");
                return Left;
            }

            if (x > keys->R.getX() && x < (keys->R.getX() + keys->R.getW()) &&
                y > keys->R.getY() && y < keys->R.getY() + keys->R.getH()) {
                SDL_Log("\nRetornado Right\n");
                return Right;
            }

            break;
        }

        default:
            //SDL_PumpEvents();
            //SDL_FlushEvent(SDL_FINGERDOWN);
            break;
    }
}

return None;