java 如何在 Libgdx 中跟踪多个触摸事件?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/16876877/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-01 00:14:49  来源:igfitidea点击:

How to track multiple touch events in Libgdx?

javalibgdxmulti-touch

提问by Vishal Singh

I am making a racing game using Libgdx. I want to touch the half right side of screen to speed up, at the same time without removing previous touch point touch again another on the left side of the screen to fire a shot. I am unable to detect later touch points.

我正在使用 Libgdx 制作赛车游戏。我想触摸屏幕的右侧一半以加快速度,同时不移除先前的触摸点再次触摸屏幕左侧的另一个以射击。我无法检测到以后的接触点。

I have searched and get Gdx.input.isTouched(int index)method, but cannot determin how to use it. My screen touch code is:

我已经搜索并获取Gdx.input.isTouched(int index)方法,但无法确定如何使用它。我的屏幕触摸代码是:

if(Gdx.input.isTouched(0) && world.heroCar.state != HeroCar.HERO_STATE_HIT){
    guiCam.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(), 0));
    if (OverlapTester.pointInRectangle(rightScreenBounds, touchPoint.x, touchPoint.y)) {
       world.heroCar.state = HeroCar.HERO_STATE_FASTRUN;
       world.heroCar.velocity.y = HeroCar.HERO_STATE_FASTRUN_VELOCITY;
    }
} else {
    world.heroCar.velocity.y = HeroCar.HERO_RUN_VELOCITY;
}

if (Gdx.input.isTouched(1)) {
    guiCam.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(), 0));
    if (OverlapTester.pointInRectangle(leftScreenBounds, touchPoint.x, touchPoint.y)) {
       world.shot();
    }
}

回答by P.T.

You'll want to use the Gdx.input.getX(int index)method. The integer indexparameter represents the ID of an active pointer. To correctly use this, you will want to iterate through all the possible pointers (in case two people have 20 fingers on the tablet?).

你会想要使用这个Gdx.input.getX(int index)方法。整数index参数表示活动指针的 ID。要正确使用它,您需要遍历所有可能的指针(以防两个人在平板电脑上有 20 根手指?)。

Something like this:

像这样的东西:

boolean fire = false;
boolean fast = false;
final int fireAreaMax = 120; // This should be scaled to the size of the screen?
final int fastAreaMin = Gdx.graphics.getWidth() - 120;
for (int i = 0; i < 20; i++) { // 20 is max number of touch points
   if (Gdx.input.isTouched(i)) {
      final int iX = Gdx.input.getX(i);
      fire = fire || (iX < fireAreaMax); // Touch coordinates are in screen space
      fast = fast || (iX > fastAreaMin);
   }
}

if (fast) {
   // speed things up
} else {
   // slow things down
}

if (fire) {
   // Fire!
}

An alternative approach is to setup an InputProcessorto get input events (instead of "polling" the input as the above example). And when a pointer enters one of the areas, you would have to track that pointer's state (so you could clear it if it left).

另一种方法是设置一个InputProcessor来获取输入事件(而不是像上面的例子那样“轮询”输入)。当指针进入其中一个区域时,您必须跟踪该指针的状态(因此如果它离开,您可以清除它)。