我正在使用 Libgdx 编写游戏,我需要检测用户何时触摸 Sprite 。 我尝试使用以下代码来执行此操作:
此代码设置矩形的位置
for(int i = 0;i<circlesArray.length;i++)
{
rect[i] = new Rectangle(circles.getPosition(i).x,circles.getPosition(i).y,height/8,height/8);
}
此代码将点击设置为矩形并检查它是否与 Sprite 重叠
if(Gdx.input.isTouched())
{
click = new Rectangle(Gdx.input.getX(),Gdx.input.getY(),Gdx.input.getX(),Gdx.input.getY());
if(Intersector.overlaps(click,rect[1]));
{
System.out.println("clicked");
x[1] = 0;
}
}
出于某种原因,我无法理解该程序检测到碰撞,即使没有发生,当我点击屏幕上的任意位置时,它说我按下了 Sprite 。
我应该做什么来修复它?
最佳答案
这是你的问题:
click = new Rectangle(Gdx.input.getX(), Gdx.input.getY(), Gdx.input.getX(), Gdx.input.getY());
应该是:
click = new Rectangle(Gdx.input.getX(), Gdx.input.getY(), 1, 1);
矩形的最后两个参数是宽度和高度。这里我们给矩形的宽度和高度均为 1 像素,但您可以将其设置为您喜欢的任何值。您将这些参数设置为输入 x 和 y,它们每次都不同,给出不同的结果。
编辑: 要将输入坐标转换为基于相机的游戏世界坐标,您必须执行以下操作:
Vector3 clickPos = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0);
camera.unproject(clickPos);
click = new Rectangle(clickPos.x, clickPos.y, 1, 1);
当您使用camera.unproject(Vector)时,它会根据您的相机在游戏世界中的位置将您的输入坐标转换为工作坐标。所以现在我们使用 vector clickPos。
我们使用 Vector3 的原因是因为这是 unproject 函数所需要的。我们为该 vector 提供输入 x 和 y,但为第三个参数 z 指定 0,因为这是一个 2d 世界。
关于java - 无法正确检测碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27571942/