我看到很多关于LibGDX和屏幕/相机坐标以及窗口调整大小的主题,但我找不到解决我以下问题的答案。
当我在一个基本舞台(stage)和一个基本演员(actor)中工作时,假设窗口大小为480x320,一切正常。我可以点击我的演员并得到响应。但是当我调整窗口大小,例如调整为600x320时,一切看起来都正确,但我的点击监听器不再起作用了。此外,舞台坐标也被移动或混乱了。
我使用以下代码:
此外,我正在调整我的舞台相机视口以对应窗口大小:
所以当我调整大小时,屏幕上出现了想要的效果,但是监听器没有响应 - 演员似乎偏离了我点击的位置。我做错了什么?我应该移动我的演员还是我的相机,还是根据调整大小缩放我的相机?有人可以给我解释一下吗?
提前感谢!
编辑:下面是我类的完整代码。
当我在一个基本舞台(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
}
}
resize()
方法中,你需要执行stage.setViewport(width, height, true)
。在 LibGDX 1.0.0 中,你需要做一些其他的事情。你使用的是哪个版本? - nooneSprite
来绘制你的演员,但当你调用batch.draw(...
时,它会被隐式转换成Texture
。你可以将batch.draw(sprite,
替换为batch.draw(texture,
。虽然这可能无法解决你的问题... - Dávid Tóth