【问题标题】:How to change the position of a shape on touch in LibGdx如何在 LibGdx 中更改触摸时形状的位置
【发布时间】:2014-03-29 14:22:01
【问题描述】:

基本上我正在使用 LibGdx 制作一个涉及球和地面的游戏。目标是通过触摸球尽可能长时间地保持球在空中。

到目前为止,我只使用了 box2d 并没有在形状上放置任何精灵。但我似乎无法正常工作。

到目前为止,我对此功能的看法如下:

这是设置一个扩展输入处理器的类,因为我只想使用 touchDown 方法。

    Gdx.input.setInputProcessor(new InputController(){
        @Override
        public boolean touchDown(int screenX, int screenY, int pointer, int button){
            if((screenX == ball.getPosition().x) && (screenY == ball.getPosition().y)){
                movement.y = speed;                 
            }
            return true;                
        }

    });

Ball 是一个设置为球形状世界的物体。速度是一个浮点变量。然后我有

    ball.applyForceToCenter(movement, true);

在渲染方法中移动是一个向量 2,直到触摸它才定义它应该将 y 位置增加 500。

任何人都可以帮忙,因为这不起作用:(

【问题讨论】:

  • InputController 是你自己的自定义类吗?它似乎不在 api 中的任何地方。
  • 是的,这只是扩展了 InputProcessor 类,所以我可以重写 touchDown 方法,而无需其他所有内容。

标签: java android libgdx box2d


【解决方案1】:

您的第一个问题是您正在测试点击的点是否准确是球的位置。这是极不可能的,而且几乎可以肯定不是你想要的。相反,您想测试点击的点是否击中球的任何位置。

您的第二个问题是您需要将设备坐标转换为 box2d 坐标。 device 和 box2d 使用不同的坐标系,因此比较两者没有意义。

要解决第一个问题,您可以循环遍历 body 中的所有夹具,并使用方法fixture.testPoint(x, y) 来查看该点是否命中夹具。由于您的身体只有一个夹具,您可以使用以下代码进行测试:

body.getFixtureList().get(0).testPoint(x, y);

解决第二个问题有点棘手。理想情况下,您的游戏应该使用相机来处理渲染。如果没有,你应该得到一个。使用相机,您可以取消投影设备坐标以获得相机坐标,如下所示:

Vector3 mouseCoords = new Vector3(screenX, screenY, 0);
camera.unproject(mouseCoords);
//mouseCoords.x and mouseCoords.y will now be relative to the camera

然后,你必须转换为 box2d 坐标:

mouseCoords.scl(WORLD_TO_BOX);

其中 WORLD_TO_BOX 是从世界坐标到盒子坐标的缩放比例,你应该已经设置好了。然后,您可以在 testPoint 方法中使用 mouseCoords.x 和 mouseCoords.y。

编辑:下面的代码显示了如何循环遍历主体中的所有装置。但是,如果您只有一个灯具,则无需这样做。

for(Fixture fixture : body.getFixtureList())
{
    //Do something to fixture
}

【讨论】:

  • 我将如何循环通过一个夹具?我对这一切都很陌生
  • @Saml92 在帖子末尾添加了代码,以显示如何循环遍历正文中的所有固定装置
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
相关资源
最近更新 更多