当前位置: 首页 > 知识库问答 >
问题:

在libgdx中的android设备上,输入事件不能同时工作

钱德元
2023-03-14

我正在用Libgdx做一个简单的平台游戏。。。我让玩家向左移动,向右移动,然后跳跃。该代码在桌面上运行良好,但在Android设备上,当玩家向左或向右移动时,不会触发跳转。看起来很奇怪。这是我的密码。。。

私有空updatePlayerForUserInput(浮点deltaTime){

    // check input and apply to velocity & state
    if ((Gdx.input.isKeyPressed(Keys.SPACE) || isTouched(0.87f, 1,0,1f)) && world.player.grounded)
    {
        world.player.velocity.y += world.player.JUMP_VELOCITY;
        world.player.state =2;
        world.player.grounded = false;
    }

    if (Gdx.input.isKeyPressed(Keys.LEFT) || Gdx.input.isKeyPressed(Keys.A) || isTouched(0, 0.1f,0,1f))
    {
        world.player.velocity.x -=world.player.MAX_VELOCITY;
        if (world.player.grounded)
            world.player.state =1;
        world.player.facesRight = false;
    }

    if (Gdx.input.isKeyPressed(Keys.RIGHT) || Gdx.input.isKeyPressed(Keys.D) || isTouched(0.2f, 0.3f,0,1f))
    {
        world.player.velocity.x =world.player.MAX_VELOCITY;
        if (world.player.grounded)
            world.player.state =1;
        world.player.facesRight = true;

    }
}

private boolean isTouched(float startX, float endX , float startY, float endY)
{
    // check if any finge is touch the area between startX and endX
    // startX/endX are given between 0 (left edge of the screen) and 1 (right edge of the screen)
    for (int i = 0; i < 2; i++)
    {
        float x = Gdx.input.getX() / (float) Gdx.graphics.getWidth();
        float y = Gdx.input.getY() / (float) Gdx.graphics.getHeight();
        if (Gdx.input.isTouched(i) && (x >= startX && x <= endX) && (y>=startY && y<= endY))
        {
            return true;
        }
    }
    return false;
}

我从mzencher在

https://github.com/libgdx/libgdx/blob/master/tests/gdx-tests/src/com/badlogic/gdx/tests/superkoalio/SuperKoalio.java

请建议

共有1个答案

宰父淳
2023-03-14

此代码:

    float x = Gdx.input.getX() / (float) Gdx.graphics.getWidth();
    float y = Gdx.input.getY() / (float) Gdx.graphics.getHeight();

总是从第一次主动触摸中得到x/y。您需要检查"i'th"活动触摸。像这样:

for (int i = 0; i < 20; i++) {
    if (Gdx.input.isTouched(i)) {
      float x = Gdx.input.getX(i) / (float) Gdx.graphics.getWidth();
      float y = Gdx.input.getY(i) / (float) Gdx.graphics.getHeight();
      if ((x >= startX && x <= endX) && (y>=startY && y<= endY)) {
          return true;
      }
}
return false;

此外,您可能应该遍历所有20个可能的触摸点,因为硬件可以跟踪多达20个触摸点。(试着在“跳跃”区域放三个手指,然后在“向左移动”区域添加第四个手指。)

 类似资料:
  • 我一直在努力克服Boot_complete接收器不能在某些设备中工作的问题。 比如Vivo设备,它们有iManager应用程序和自动启动管理器。用户可以在设备启动时从自动启动切换应用程序。 我应该使用什么连同下面的意图过滤器重新启动我的服务后,设备重新启动。

  • 这个小部件在模拟器4.1.2上工作得很好,当安装在真正的设备上时,它甚至不会显示在小部件列表上,就像安装了一样,但我不能让它正常工作。 下面是manifest.xml 和小部件提供程序

  • 我是android新手,我能够在kotlin中为我的应用程序设置firebase。如果我在Nexus 5X API 27 emulator中运行该应用程序,我就能够获取数据库,但当我在实际设备三星S5(Google play Services V 12.5.29,android V 5.0)中运行该应用程序时,我无法获得addValueEventListener回调。 Gradle文件: 我知道这

  • 我是LIBGDX游戏开发的新手,我遇到了我的第一个问题。我已经创造了9个。使用纹理打包器修补可拉伸(按钮)。这种抽绳可用于低密度和超高密度筛网,质量相同。 如果我用桌面上的可绘制项目运行我的项目,那么显示的图像就可以了,大小也非常完美。如果我在低密度的android设备上运行这个项目,drawable会变得巨大(几乎占屏幕的一半)。而且,如果我在超高密度Android设备上运行这个项目,按钮就会变

  • 在我的Angular 2应用程序中,我使用普通的HTML5输入类型“范围”为用户提供一个简单的滑块组件。 我需要知道用户何时释放滑块。释放意味着使用鼠标完成拖动并释放鼠标按钮。为此,我参加了OnMouseUp活动。然而,这不适用于我使用触摸设备的情况。 在我的平板电脑,我可以拖动滑块aroun,但当释放它与我的手指的事件是没有发射。 我知道,这不是鼠标,但是什么事件相当于在鼠标上运行并在触摸设备上

  • 我在从android设备Nexus6上发射iBeacon时遇到了麻烦。我在检测android设备或iTouch发出的信标信号方面没有问题,但我无法定位iPhone发出的信号。我正在使用altbeacon库和BeaconTermission类。我放了一个单独的线程。