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

到目前为止,我仅使用box2d而不在形状上放置任何精灵。但是我似乎无法正常工作。

到目前为止,我对此功能的了解如下:

这是在设置一个类来扩展Input处理器,因为我只想使用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.applyForceToCenter(movement, true);


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

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

最佳答案

您的第一个问题是要测试以查看单击的点是否恰好是球的位置。这极不可能,而且几乎肯定不是您想要的。相反,您想测试一下单击的点是否击中了球的任何位置。

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

要解决第一个问题,您可以遍历体内的所有固定装置,并使用方法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
}

07-24 09:49
查看更多