【问题标题】:LibGDX stage coordinates change on window resizeLibGDX 舞台坐标在窗口调整大小时发生变化
【发布时间】:2014-06-15 22:02:53
【问题描述】:

我看过很多关于 LibGDX 和屏幕/凸轮坐标的主题,还有一些关于窗口大小调整的主题,但我就是找不到解决以下问题的方法。

在这个阶段制作基本舞台和基本演员时,比如说windowsize 480x320,一切都OK。我可以点击我的演员,它会响应。但是当我调整我的窗口大小时,比如说 600x320,一切看起来正确,但我的 clicklistener 不再工作了。此外,舞台坐标被移动或弄乱了。

我使用以下代码:

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,当将舞台创建更改为 'stage = new Stage(480,320,true);'在调整大小后单击我的演员时,我仍然得到一个 'null'。
  • 在您的resize() 方法中,您需要执行stage.setViewport(width, height, true)。如果是 LibGDX 1.0.0,您需要做其他事情。你用的是哪个版本?
  • 附注:您使用Sprite 来绘制您的演员,但是当您调用batch.draw(... 时,它会隐式转换为Texture,您可以将batch.draw(sprite, 替换为batch.draw(texture,。虽然它可能无法解决您的问题..
  • 非常感谢大家花时间回答,也感谢代码提示。我将安装最新版本并重新设置,以便使用新的视口选项。这可能会帮助我找到解决方案 - 当我找到它时,我会在这里解决它。谢谢!

标签: resize window libgdx coordinates stage


【解决方案1】:

在我的情况下添加

stage.getViewport().setScreenSize(width, height);

resize() 解决问题

【讨论】:

    【解决方案2】:

    您可以使用最新的每晚更改调整大小。

    @Override
    public void resize(int width, int height) {
        stage.getViewport().update(width, height, true);
    }
    

    最后一个参数“true”将使相机在屏幕中居中

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我认为你的演员的定位已经足够好,但你的展示可能有点偏离。

        试试

        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)

        我猜你只是错误地混淆了一些论点,你能看一下吗?

        【讨论】:

        • 我现在明白了,谢谢!我换了他们,试图找到我猜想的问题的答案。
        猜你喜欢
        • 1970-01-01
        • 2015-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-09
        • 1970-01-01
        相关资源
        最近更新 更多