LibGDX - 相机缩放不起作用
LibGDX - Camera scaling does not work
我对 LibGDX 有疑问。我正在尝试创建一个应用程序,为了便于使用,我想以固定分辨率 (1920x1080) 绘制所有内容。
为此,我正在尝试创建一个 FitViewport
和一个 OrthographicCamera
,以便视口始终很好地适合屏幕大小,并且所有内容都会自动缩放。
在我的 Screen
class 我创建了这样一个视口和一个相机:
AbstractScreen() {
camera = new OrthographicCamera(Constants.VIRTUAL_WIDTH, Constants.VIRTUAL_HEIGHT);
viewport = new FitViewport(Constants.VIRTUAL_WIDTH, Constants.VIRTUAL_HEIGHT, camera);
}
(其中 VIRTUAL_WIDTH
是 1920,VIRTUAL_HEIGHT
是 1080)
现在,当我尝试渲染 1920x1080 像素的图像时,只绘制了该图像的三分之一!
这里是应该绘制的截图:screenshot
这是应该完全绘制的图像:image
public abstract class AbstractScreen implements Screen {
private Viewport viewport;
private OrthographicCamera camera;
protected SpriteBatch spriteBatch;
AbstractScreen() {
camera = new OrthographicCamera(Constants.VIRTUAL_WIDTH, Constants.VIRTUAL_HEIGHT);
viewport = new FitViewport(Constants.VIRTUAL_WIDTH, Constants.VIRTUAL_HEIGHT, camera);
spriteBatch = new SpriteBatch();
}
@Override
public void show() {
viewport.apply();
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
camera.update();
spriteBatch.setProjectionMatrix(camera.combined);
}
@Override
public void resize(int width, int height) {
viewport.update(width, height);
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void hide() {
}
@Override
public void dispose() {
}
}
这里是实际的屏幕实现:
class LoadingScreen extends AbstractScreen {
private SpriteBatch spriteBatch;
private Texture texture;
@Override
public void show() {
super.show();
spriteBatch = new SpriteBatch();
texture = new Texture("textures/test.png");
}
@Override
public void render(float delta) {
super.render(delta);
spriteBatch.begin();
spriteBatch.draw(texture, 0, 0);
spriteBatch.end();
}
}
谢谢!
您的 LoadingScreen 正在创建自己的名为 spriteBatch
的 SpriteBatch,它隐藏 AbstractScreen 超类中的 spriteBatch
。
所以你的 LoadingScreen.render()
调用 super.render()
,它在 AbstractScreen.spriteBatch
中设置了适当的投影矩阵,但是你正在使用 LoadingScreen.spriteBatch
来绘制。
因此删除 LoadingScreen 中的 spriteBatch
字段,并且不要在那里实例化它。使 AbstractScreen 中的 spriteBatch
受保护,以便您可以从子类访问它。
顺便说一句,SpriteBatches 必须在 dispose()
中释放,否则会泄漏内存。更好的是,不要在屏幕内实例化 SpriteBatch。在您的游戏中实例化一个 SpriteBatch 并将其传递给屏幕的构造函数,这样所有内容都可以共享同一个实例,而不是在每次切换屏幕时都浪费时间处理和实例化新实例。 SpriteBatch 是个重物。
我对 LibGDX 有疑问。我正在尝试创建一个应用程序,为了便于使用,我想以固定分辨率 (1920x1080) 绘制所有内容。
为此,我正在尝试创建一个 FitViewport
和一个 OrthographicCamera
,以便视口始终很好地适合屏幕大小,并且所有内容都会自动缩放。
在我的 Screen
class 我创建了这样一个视口和一个相机:
AbstractScreen() {
camera = new OrthographicCamera(Constants.VIRTUAL_WIDTH, Constants.VIRTUAL_HEIGHT);
viewport = new FitViewport(Constants.VIRTUAL_WIDTH, Constants.VIRTUAL_HEIGHT, camera);
}
(其中 VIRTUAL_WIDTH
是 1920,VIRTUAL_HEIGHT
是 1080)
现在,当我尝试渲染 1920x1080 像素的图像时,只绘制了该图像的三分之一!
这里是应该绘制的截图:screenshot
这是应该完全绘制的图像:image
public abstract class AbstractScreen implements Screen {
private Viewport viewport;
private OrthographicCamera camera;
protected SpriteBatch spriteBatch;
AbstractScreen() {
camera = new OrthographicCamera(Constants.VIRTUAL_WIDTH, Constants.VIRTUAL_HEIGHT);
viewport = new FitViewport(Constants.VIRTUAL_WIDTH, Constants.VIRTUAL_HEIGHT, camera);
spriteBatch = new SpriteBatch();
}
@Override
public void show() {
viewport.apply();
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
camera.update();
spriteBatch.setProjectionMatrix(camera.combined);
}
@Override
public void resize(int width, int height) {
viewport.update(width, height);
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void hide() {
}
@Override
public void dispose() {
}
}
这里是实际的屏幕实现:
class LoadingScreen extends AbstractScreen {
private SpriteBatch spriteBatch;
private Texture texture;
@Override
public void show() {
super.show();
spriteBatch = new SpriteBatch();
texture = new Texture("textures/test.png");
}
@Override
public void render(float delta) {
super.render(delta);
spriteBatch.begin();
spriteBatch.draw(texture, 0, 0);
spriteBatch.end();
}
}
谢谢!
您的 LoadingScreen 正在创建自己的名为 spriteBatch
的 SpriteBatch,它隐藏 AbstractScreen 超类中的 spriteBatch
。
所以你的 LoadingScreen.render()
调用 super.render()
,它在 AbstractScreen.spriteBatch
中设置了适当的投影矩阵,但是你正在使用 LoadingScreen.spriteBatch
来绘制。
因此删除 LoadingScreen 中的 spriteBatch
字段,并且不要在那里实例化它。使 AbstractScreen 中的 spriteBatch
受保护,以便您可以从子类访问它。
顺便说一句,SpriteBatches 必须在 dispose()
中释放,否则会泄漏内存。更好的是,不要在屏幕内实例化 SpriteBatch。在您的游戏中实例化一个 SpriteBatch 并将其传递给屏幕的构造函数,这样所有内容都可以共享同一个实例,而不是在每次切换屏幕时都浪费时间处理和实例化新实例。 SpriteBatch 是个重物。