如何匹配用户单击和libGDX框架中的sprite对象位置

时间:2014-03-25 20:20:09

标签: java libgdx

我正在使用libGDX java框架在Eclipse中开发练习游戏。

我的游戏处于横向模式,我正在使用精灵图片作为游戏资产。实际上我正在尝试关注千位ZombieBird tutorial

我设置了这样的正交相机 - >

   cam = new OrthographicCamera();
   cam.setToOrtho(true, 250, 120);

我这样做是因为我的背景纹理区域在精灵图像中是250 x 120像素。

所以基本上我的精灵图像尺寸很小,并且根据设备进行缩放,但所有计算都是相对于250 x 140像素完成的,就像更改我已定义Vector2 position = new Vector2(x, y);的对象的位置一样如果我写position.x = 260;,即使我的设备宽度为500px,精灵也会离开屏幕。

问题: 现在,当有人点击它时,我必须让移动的精灵消失(想象一下僵尸四处移动,如果我点击它们就会死掉)。所以我使用以下代码来匹配用户点击协议与对象合作

 int x1 = Gdx.input.getX();
 int y1 = Gdx.input.getY();
 if(position.x == x1 && position.y == y1){
      // do something that vanish the object clicked
  }

问题是position.x和position.y返回相对于正凸轮宽度和高度的co-ords,它是250x120 px,并且点击坐标相对于设备的宽度和高度,可能是任何根据设备。因此,即使我点击对象上的点击合并和对象位置合作他们的值有很大的差异。所以我永远不会得到匹配的值。

有没有解决方法或我做错了?

2 个答案:

答案 0 :(得分:6)

您必须使用相机取消投影设备坐标。相机具有内置功能,因此非常简单。此外,要确定是否单击了精灵,您必须检查点击的点是否在精灵内的任何位置,而不仅仅等于精灵的位置。做这样的事情:

int x1 = Gdx.input.getX();
int y1 = Gdx.input.getY();
Vector3 input = new Vector3(x1, y1, 0);
cam.unproject(input);
//Now you can use input.x and input.y, as opposed to x1 and y1, to determine if the moving
//sprite has been clicked
if(sprite.getBoundingRectange().contains(input.x, input.y)) {
    //Do whatever you want to do with the sprite when clicked
}

答案 1 :(得分:0)

作为kabb回答的替代方法,您可以使用数学将屏幕坐标转换为凸轮坐标:

//Example:
float ScreenWidth = Gdx.graphics.getWidth(); 
float ScreenHeight = Gdx.graphics.getHeight();
// on a 1080p screen this would return ScreenWidth = 1080, ScreenHeight = 1920; 
//now you get the screen co-ordinates and convert them to cam co-ordinates:
float x1 = Gdx.input.getX();
float y1 = Gdx.input.getY();
float x1cam = (x1/ScreenWidth)*CamWidth
float y1cam = (y1/ScreenHeight)*CamHeight

// now you can use the if statement in kabbs answer