Screen
类。然而,这些屏幕的实现仅适用于预定义的屏幕尺寸。例如,如果精灵是针对640 x 480大小的屏幕(4:3宽高比)设计的,则在其他屏幕尺寸上,精灵将超出屏幕边界,并且根本不会按比例缩放到屏幕尺寸。此外,即使libGDX提供了简单的缩放,我面临的问题仍然存在,因为那样会导致游戏屏幕的宽高比发生变化。在互联网上进行研究后,我找到了一个博客/论坛,讨论了同样的问题。我已经实施了它,到目前为止它运行良好。但我想确认这是否是实现此目标的最佳选项,或者是否有更好的替代方案。下面是代码,展示了我如何处理这个合法的问题。
论坛链接:http://www.java-gaming.org/index.php?topic=25685.new
public class SplashScreen implements Screen {
// Aspect Ratio maintenance
private static final int VIRTUAL_WIDTH = 640;
private static final int VIRTUAL_HEIGHT = 480;
private static final float ASPECT_RATIO = (float) VIRTUAL_WIDTH / (float) VIRTUAL_HEIGHT;
private Camera camera;
private Rectangle viewport;
// ------end------
MainGame TempMainGame;
public Texture splashScreen;
public TextureRegion splashScreenRegion;
public SpriteBatch splashScreenSprite;
public SplashScreen(MainGame maingame) {
TempMainGame = maingame;
}
@Override
public void dispose() {
splashScreenSprite.dispose();
splashScreen.dispose();
}
@Override
public void render(float arg0) {
//----Aspect Ratio maintenance
// update camera
camera.update();
camera.apply(Gdx.gl10);
// set viewport
Gdx.gl.glViewport((int) viewport.x, (int) viewport.y,
(int) viewport.width, (int) viewport.height);
// clear previous frame
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
// DRAW EVERYTHING
//--maintenance end--
splashScreenSprite.begin();
splashScreenSprite.disableBlending();
splashScreenSprite.draw(splashScreenRegion, 0, 0);
splashScreenSprite.end();
}
@Override
public void resize(int width, int height) {
//--Aspect Ratio Maintenance--
// calculate new viewport
float aspectRatio = (float)width/(float)height;
float scale = 1f;
Vector2 crop = new Vector2(0f, 0f);
if(aspectRatio > ASPECT_RATIO) {
scale = (float) height / (float) VIRTUAL_HEIGHT;
crop.x = (width - VIRTUAL_WIDTH * scale) / 2f;
} else if(aspectRatio < ASPECT_RATIO) {
scale = (float) width / (float) VIRTUAL_WIDTH;
crop.y = (height - VIRTUAL_HEIGHT * scale) / 2f;
} else {
scale = (float) width / (float) VIRTUAL_WIDTH;
}
float w = (float) VIRTUAL_WIDTH * scale;
float h = (float) VIRTUAL_HEIGHT * scale;
viewport = new Rectangle(crop.x, crop.y, w, h);
//Maintenance ends here--
}
@Override
public void show() {
camera = new OrthographicCamera(VIRTUAL_WIDTH, VIRTUAL_HEIGHT); //Aspect Ratio Maintenance
splashScreen = new Texture(Gdx.files.internal("images/splashScreen.png"));
splashScreenRegion = new TextureRegion(splashScreen, 0, 0, 640, 480);
splashScreenSprite = new SpriteBatch();
if(Assets.load()) {
this.dispose();
TempMainGame.setScreen(TempMainGame.mainmenu);
}
}
}
更新: 我最近了解到libGDX有一些自己的功能来维护宽高比,我想在这里讨论一下。在搜索跨越互联网的宽高比问题时,我遇到了几个论坛/开发人员,他们遇到了“如何在不同屏幕尺寸上保持宽高比”的问题?其中一个真正对我有效的解决方案已经发布在上面。后来,当我继续实现屏幕的touchDown()
方法时,我发现由于缩放调整大小,我实现touchDown()
的坐标会发生很大变化。通过一些代码来根据屏幕调整坐标,我大大减少了这个量,但我没有成功地以针对精确度来保持它们。例如,如果我在纹理上实现了touchDown()
,调整屏幕大小将使触摸监听器在纹理区域上向右或向左移动一些像素,具体取决于调整大小,而这显然是不希望看到的。
boolean stretch = false
)。现在我已经使用舞台类实现了我的屏幕,它能够很好地维护纵横比。但是,在调整大小或不同的屏幕尺寸时,生成的黑色区域总是出现在屏幕的右侧;也就是说,屏幕没有居中,如果黑色区域相当大,这会使它看起来相当丑陋。有没有社区成员能帮助我解决这个问题?
setViewport()
的源代码,看起来应该没问题。当你运行它时,如果显示居中不准确,你的屏幕尺寸、舞台尺寸和居中点是什么? - Steve Blackwell