gpt4 book ai didi

android - 如何处理 libGDX 中的不同纵横比?

转载 作者:IT老高 更新时间:2023-10-28 13:10:03 25 4
gpt4 key购买 nike

我已经使用 libGDX 实现了一些屏幕,这些屏幕显然会使用 libGDX 框架提供的 Screen 类。但是,这些屏幕的实现仅适用于预定义的屏幕尺寸。例如,如果 sprite 用于 640 x 480 尺寸的屏幕(4:3 宽高比),则它不会在其他屏幕尺寸上按预期工作,因为 sprite 符合屏幕边界并且未缩放到屏幕尺寸一点也不。此外,如果 libGDX 提供了简单的缩放,那么我面临的问题仍然存在,因为这会导致游戏屏幕的纵横比发生变化。

在网上搜索后,我发现了一个 blog/forum讨论了同样的问题。我已经实现了它,到目前为止它运行良好。但我想确认这是否是实现这一目标的最佳选择,或者是否有更好的选择。下面是显示我如何处理这个合法问题的代码。

论坛链接: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() 方法时,我发现由于 resize 的缩放,我实现 touchDown() 的坐标 会发生很大的变化。在使用一些代码根据屏幕调整大小转换坐标后,我在很大程度上减少了这个数量,但我没有成功地保持它们的精确度。例如,如果我在纹理上实现了 touchDown(),调整屏幕大小会使纹理区域上的 touchListener 向右或向左移动一些像素,具体取决于调整大小,这显然是不希望的。

后来我才知道舞台类有自己的原生功能来保持纵横比(boolean stretch = false)。现在我已经使用舞台类实现了我的屏幕,它很好地保持了纵横比。但是在调整大小或不同的屏幕尺寸时,生成的黑色区域总是出现在屏幕的右侧;那就是屏幕没有居中,如果黑色区域很大,这会很丑。

任何社区成员都可以帮我解决这个问题吗?

最佳答案

现在怎么做:

由于这是 libgdx 上最著名的问题之一,我将对其进行一点更新:

LibGDX v1.0 引入了Viewport 来处理这个问题。它更易于使用,并且扩展策略是可插拔的,这意味着一行可以改变行为,您可以使用它来查看哪一个最适合您的游戏。

您需要了解的所有信息都可以在 here 中找到.

关于android - 如何处理 libGDX 中的不同纵横比?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9198932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com