当前位置: 首页 > 知识库问答 >
问题:

libgdx-校正多个坐标来源?

尤博达
2023-03-14

我将碰撞矩形(libgdx,而不是awt)设置为球的坐标。我想做的是检查我是否点击了它。两个问题:
a.)我不知道矩形坐标的原点在哪里。
b.)我找不到一种正确的方法来校正抽头位置
我能做什么?

根据请求进行编辑:

public void create() {
camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

...

camera.unproject(tmpPos);
}

public void render() {
if (Gdx.input.isTouched()) {
            float x = Gdx.input.getX();
            float y = Gdx.input.getY();
            tmpPos.set(x, y, 0);
            camera.unproject(tmpPos);
            // now the world coordinates are tmpPos.x and tmpPos.y
            if (target.contains(tmpPos.x, tmpPos.y)) {
                System.out.println("Touched. ");
                score++;
            }

            System.out.println("Score: " + score + "..." + "X: " + (int) tmpPos.x + "...Y: " + (int) tmpPos.y);
        ...
        }

共有2个答案

邢同
2023-03-14

我最终的解决方案是这样的:

但是,将矢量设置为触摸坐标,并进行以下更正:(Gdx.input.getY() * -1) cy,其中 cy 是屏幕的高度。然后,我取消投影该向量,并绘制它。与我没有校正得到的反向y位置不同,圆圈直接跟随我的手指下方,并与世界上的其他物体完美通信。

丌官高远
2023-03-14

我假设你有一台正交照相机。(没有它,你真的无法进行游戏)

你不需要知道它的起源来检查是否被触碰,但如果你想知道,它的起源是

float originX = rectangle.x + rectangle.width / 2f;
float originY = rectangle.y + rectangle.height / 2f;

无论如何,您需要取消投影您的触摸坐标,这意味着您需要从屏幕位置转换到相机位置(世界位置)。为此,您需要一个Vector3,最好在您使用的方法之外的某个地方声明它,因为不建议在每一帧中初始化一个对象。

Vector3 tmpPos=new Vector3();

现在检查你的矩形是否被触摸,无论你想要什么。您有2种方法可以做到这一点。

    < li >在渲染/更新方法中执行此操作,检查手指/光标的位置。

公共void渲染(float delta){

   if (Gdx.input.isTouched() { // use .isJustTouched to check if the screen is touched down in this frame
            // so you will only check if the rectangle is touched just when you touch your screen.
            float x = Gdx.input.getX();
            float y = Gdx.input.getY();
            tmpPos.set(x, y, 0);
            camera.unproject(tmpPos);
            // now the world coordinates are tmpPos.x and tmpPos.y
            if (rectangle.contains(tmpPos.x, tmpPos.y)) {
                // your rectangle is touched
                System.out.println("YAAAY I'm TOUCHED");
            }

        }
    }

选项2,使用输入侦听器,因此仅在触发触摸事件时检查。在屏幕/游戏的show/create方法中添加输入侦听器

public void show() {

// .....
Gdx.input.setInputProcessor(new InputProcessor() {

    // and in the method that you want check if the rectangle is touched
    @override
    public void touchDown(int screenX, int screenY, int pointer, int button) {
        tmpPos.set(screenX, screenY, 0);
        camera.unproject(tmpPos);
        // now the world coordinates are tmpPos.x and tmpPos.y
        if (rectangle.contains(tmpPos.x, tmpPos.y)) {
            // your rectangle is touched
            System.out.println("YAAAY I'm TOUCHED");
        }
    }

    // and the rest of the methods
    // ....
    //

});

}

我会用第二种方式。如果对你有用,请告诉我。

 类似资料:
  • 所以我坐在这里,拿着一部800像素的手机..并且< code > gdx . graphics . getwidth()也应该返回800.. 但是当我从获得坐标时,当我一直向左触摸屏幕时,我得到的最高数字是780左右。和右侧约20。 所以我的坐标都错了,所以我所有的按钮和东西都不能正常工作,等等。 知道发生了什么吗?

  • 我的LibGdx程序有问题。我给了我的相机800高480宽。我正在坐标下绘制目标: 但是点击目标后,我的炮弹不会重叠目标矩形。 我在Touch中这样做: 不起作用。 这是一个炮弹游戏: 首先,我正在设置相机。 随机显示坐标范围内的目标。 使用Vector3新位置触摸取消投影相机。 触摸时,用加农炮位置计算目标位置并获得旋转加农炮的角度。 旋转大炮后,我向目标发射球。 现在,当我执行Rectangl

  • 我正在做一个采矿游戏,如果你点击某个地方,你会删除那里的方块。现在所有的块都是正方形,只有当我的2d布尔数组中的点为真时才绘制。所以我试着把这个位置设置为false,只要你点击这里,就是我的输入处理器的触地方法 我也在将相机转换为我的玩家位置。grid.manipulate网格接受一个x和一个y并将其设置为false。我的玩家位于网格坐标中的(10,126),当我点击他旁边时,它显示我正在点击(3

  • 我目前正在做一个libgdx项目。这就是我要遵循的结构: 单个游戏-几个屏幕-每个屏幕有一个舞台-每个舞台有一些组-每个组有一些演员-每个演员有一个精灵。 我正在玩在组之间拖动演员,但是当我将演员添加到组中时,即使我指定了其他人,坐标也始终为0,0。 我读过一些关于局部坐标和舞台坐标的内容。 问题是...如何在组的中间添加一个Actor(及其精灵)?

  • 摄像机旋转后,坐标让我摸不着头脑。 我有一个照相机,一个角色和一张地图。这个玩家只能在以下方向行走:北(90°),南(270°),东(0°),西(180°)。 从玩家的camera.RotateRound(...,...,...)位置旋转摄像机后,玩家开始在旋转的结果中向新的方向移动。 null

  • 问题内容: LibGDX具有一个坐标系统,其中(0,0)在左下角。(就像这张图片: http //i.stack.imgur.com/jVrJ0.png) 这让我无法自拔,主要是因为我要移植使用常规坐标系(其中0,0位于左上角)制作的游戏。 我的问题: 有没有简单的方法可以更改此坐标系? 问题答案: 如果您使用相机(应使用),则更改坐标系非常简单: 如果您使用TextureRegions和/或Te