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;
我正在利用 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;