LibGDX舞台坐标在窗口调整大小时发生变化

4
我看到很多关于LibGDX和屏幕/相机坐标以及窗口调整大小的主题,但我找不到解决我以下问题的答案。
当我在一个基本舞台(stage)和一个基本演员(actor)中工作时,假设窗口大小为480x320,一切正常。我可以点击我的演员并得到响应。但是当我调整窗口大小,例如调整为600x320时,一切看起来都正确,但我的点击监听器不再起作用了。此外,舞台坐标也被移动或混乱了。
我使用以下代码:
stage.addListener(new InputListener() {
    public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {

        //determine if actor was hit
        System.out.println(stage.hit(x, y, true));
        return true;
    }
});

此外,我正在调整我的舞台相机视口以对应窗口大小:
    stage.getCamera().viewportWidth = Gdx.graphics.getWidth();
    stage.getCamera().viewportHeight = Gdx.graphics.getHeight();

所以当我调整大小时,屏幕上出现了想要的效果,但是监听器没有响应 - 演员似乎偏离了我点击的位置。我做错了什么?我应该移动我的演员还是我的相机,还是根据调整大小缩放我的相机?有人可以给我解释一下吗?
提前感谢!
编辑:下面是我类的完整代码。
public class HelpMePlease implements ApplicationListener{

// A standard simple Actor Class
class CustomActor extends Actor {

    Texture texture = new Texture(Gdx.files.internal("data/testTex2.png"));
    TextureRegion pixelTexture = new TextureRegion(texture, 0, 0, 1, 1);
    Sprite sprite = new Sprite(texture);

    public CustomActor() {
        setWidth(128);
        setHeight(128);
        setBounds(getX(), getY(), getWidth(), getHeight());
    }

    @Override
    public void draw(SpriteBatch batch, float parentAlpha) {
        batch.draw(sprite, getX(), getY(), 0f, 0f, getWidth(), getHeight(), getScaleX(), getScaleY(), getRotation());
    }
}

public Stage stage;
public CustomActor actor;

@Override
public void create() {


    stage = new Stage(480,320,true);

    actor = new CustomActor();

    stage.addListener(new InputListener() {
        public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {

            //determine if actor was hit
            System.out.println(stage.hit(x, y, true));
            return true;
        }
    });

    Gdx.input.setInputProcessor(stage);
    stage.addActor(actor);

}

@Override
public void resize(int width, int height) {

    //resize cam viewport
    stage.getCamera().viewportWidth = Gdx.graphics.getWidth();
    stage.getCamera().viewportHeight = Gdx.graphics.getHeight();

}

@Override
public void render() {
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    stage.getCamera().update(); //just to be sure, I don't know if this is necessary
    stage.act();
    stage.draw();
}

@Override
public void pause() {
    // TODO Auto-generated method stub

}

@Override
public void resume() {
    // TODO Auto-generated method stub

}

@Override
public void dispose() {
    // TODO Auto-generated method stub

}

}


你在构建舞台时是否启用了 keepAspectratio? - Xavier Guzman
嗨Xavier,当将舞台创建更改为'stage = new Stage(480,320,true);'时,我在调整大小后点击我的演员仍然会得到一个'null'。 - user2150129
在你的 resize() 方法中,你需要执行 stage.setViewport(width, height, true)。在 LibGDX 1.0.0 中,你需要做一些其他的事情。你使用的是哪个版本? - noone
只是一点小建议:你使用 Sprite 来绘制你的演员,但当你调用 batch.draw(... 时,它会被隐式转换成 Texture。你可以将 batch.draw(sprite, 替换为 batch.draw(texture,。虽然这可能无法解决你的问题... - Dávid Tóth
非常感谢您花时间回答我的问题,也感谢您对代码的建议。我将安装最新版本并重新设置,以便使用新的视口选项。这可能有助于我找到解决方案 - 当我找到时,我会在这里发布。谢谢! - user2150129
4个回答

9
您可以使用最新的夜间版更改您的大小调整。
@Override
public void resize(int width, int height) {
    stage.getViewport().update(width, height, true);
}

最后一个参数 "true" 将会使相机居中在屏幕上。

0

我认为你的演员定位得足够好,但是你的显示可能有点偏差。

尝试使用:

batch.draw(sprite, getX(), getY(), 0f, 0f, getWidth(), getHeight(), getScaleX(), getScaleY(), getRotation());

而不是:

batch.draw(sprite, getX(), getY(), getWidth(), getHeight(), 0f, 0f, getScaleX(), getScaleY(), getRotation());

SpriteBatch有以下参数:

public void draw (Texture texture, float x, float y, float width, float height, int srcX, int srcY, int srcWidth,int srcHeight, boolean flipX, boolean flipY)

我猜你只是误将一些参数混淆了,能否请你检查一下?


我现在明白了,谢谢!我之前把它们搞混了,试图找到我的问题的答案。 - user2150129

0
通过使用Gradle更新我的LibGDX版本并使用新的视口选项解决了问题!感谢大家抽出时间!

0
在我的情况下,添加以下代码解决了问题:
```java stage.getViewport().setScreenSize(width, height); ```
在`resize()`方法中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接