我的LibGDX有问题。我正在尝试创建一个应用程序,为了便于使用,我想以固定的分辨率(1920x1080)绘制所有内容。
为此,我尝试创建FitViewport
和OrthographicCamera
,以便视口始终与屏幕尺寸完美匹配,并且所有内容都会自动缩放。
在我的Screen
课程中,我创建了一个视口和一个摄像头:
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();
}
}
谢谢!
答案 0 :(得分:0)
您的LoadingScreen正在创建自己的名为spriteBatch
的SpriteBatch,隐藏 AbstractScreen超类中的spriteBatch
。
因此,您的LoadingScreen.render()
来电super.render()
,会在AbstractScreen.spriteBatch
中设置相应的投影矩阵,但之后您正在使用LoadingScreen.spriteBatch
进行绘制。
因此,请删除LoadingScreen中的spriteBatch
字段,并且不要在那里实例化它。使AbstractScreen中的spriteBatch
受到保护,以便您可以从子类访问它。
顺便说一句,SpriteBatches必须放在dispose()
中,否则你会泄漏内存。更好的是,不要在屏幕中实例化SpriteBatch。在游戏中实例化一个SpriteBatch并将其传递给Screen的构造函数,这样一切都可以共享同一个实例,而不是每次切换屏幕时都会浪费时间处理和实例化新的实例。 SpriteBatch是一个沉重的对象。