【问题标题】:libGDX How to match user click to object position?libGDX 如何将用户点击匹配到对象位置?
【发布时间】:2017-02-19 15:07:30
【问题描述】:

我正在尝试通过遵循kilobolt.com 教程并将其更改为我想要创建的内容来开发自己的游戏,但发现自己陷入了困境......

一点背景: 在 Zombie Bird 教程中,在 Bird 对象内部有一个 onClick() 方法,该方法在实现 InputProcessor 的不同类的 touchDown() 方法中被调用。当游戏运行并且用户点击屏幕时,小鸟的反应是向上一点。

我想知道的: 我尝试创建一些更详细的东西,要求用户在移动时点击屏幕上鸟的确切位置,每次点击鸟时,它都会调用动画。

我尝试了一些我在谷歌上找到的代码并在它们不起作用时对其进行了修改,但游戏就崩溃了。

作为游戏开发新手,请您坦白我的无能。

【问题讨论】:

  • 请发布一些代码,显示您自己测试时出现的问题

标签: java android libgdx


【解决方案1】:

我会从 libGDX 的 Circle 类创建两个 Circle 对象。一个圆圈将跟随屏幕上的小鸟,而另一个圆圈则根据用户触摸屏幕的位置进行定位。 if 语句如下所示:

if(user.getCircle().intersects(bird.getCircle()) && screen.isTouched())
    animation();

不是很复杂,甚至可能不是最好的实现方式,但它确实是。

【讨论】:

  • 谢谢,看起来很简单。但是我不需要 OrthographicCamera 变量吗?在大多数示例中,我发现需要一个...
  • 您可以发布您正在谈论的示例之一吗?我不确定你为什么需要一个 OrthographicCamera 变量,但话说回来,我已经好几个月没有使用 libGDX 了。
  • 不幸的是,我已经删除了我使用的示例,但在这里stackoverflow.com/questions/22645422/… 你可以找到我尝试更改的代码示例。给我你的意见,如果你不觉得需要更改你给我的代码示例,我会用 V 标记你的答案,并希望它会在该使用它的时候起作用。
【解决方案2】:

您可以只使用数学将屏幕坐标转换为凸轮坐标:

//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
if(sprite.getBoundingRectangle().contains(x1cam, y1cam)) {
    //Go whatever you want to do with the bird/ sprite 
    // for more accuracy I would recommend drawing a shape that matches your sprite like a circle and check if the input co-ordinates are withing the circle.
}

【讨论】:

    【解决方案3】:

    如果 cam.setToOrtho(bool, height, width) 中指定的高度和宽度与手机的高度和宽度相同,我的代码应该可以工作。如果它们不相等,那么您将遇到与该线程相同的问题。如果您确实有不同的高度和宽度,那么您只需要使用 cam.unproject(vec3) 来为 user.getCircle() 获取正确的 x 和 y 坐标。所以,你的 setCircle() 方法看起来像

    public void setCircle(Vector3 touchPos)
    {
        cam.unproject(touchPos);
        this.circle.set(touchPos.x, touchPos.y, touchPos.z);
    }
    

    同样,该代码仅适用于您手机的高度和宽度与正交相机的高度和宽度不同的情况。

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-12
      • 1970-01-01
      相关资源
      最近更新 更多