在 MS/Windows 平台上,当用户更改应用程序的窗口大小时,我会在 resize() 方法中捕获它。我想保留窗口的纵横比,因此如有必要,我将通过调用 setWindowedMode() 方法来更改其大小。但是,当我这样做时,LibGDX 会自动将窗口重新定位到屏幕中心。我怎样才能防止这种重新定位的发生? 或者,我可以自己重新定位吗?
我创建了一个 LWJGL3 窗口来使用它来绘制我的应用程序:
Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration();
config.setWindowedMode( 1900, 980 );
config.setWindowPosition( 10, 40 );
config.setBackBufferConfig( 8, 8, 8, 8, 32, 0, 0 );
config.setResizable( true );
config.setWindowSizeLimits( 400, 400, 1900, 980 );
您可以通过拨打
setPosition
上的 getPosition
(和 Lwjgl3Window
)来完成此操作,您可以通过拨打 Gdx.graphics
在 getWindow
上访问该服务。
由于
Gdx.graphics
的实现依赖于平台,因此在使用它之前,您需要将其转换为平台的正确类型(桌面、Android 或 Web)。
一种方法是让项目的每个 Launcher 类向游戏中注入一些可以获取和设置窗口位置的东西,例如对于
DesktopLauncher
来说,它可能看起来像这样;
首先,在core-project中,添加一个
WindowPlacer
接口:
public interface WindowPlacer {
Vector2 getPosition();
void setPosition(Vector2 position);
}
然后,在您的
DesktopLauncher
中,实例化一个特定于桌面的实现:
public class DesktopLauncher {
public static class DesktopWindowPlacer implements WindowPlacer {
@Override
public Vector2 getPosition() {
Lwjgl3Window window = ((Lwjgl3Graphics) Gdx.graphics).getWindow();
return new Vector2(window.getPositionX(), window.getPositionY());
}
@Override
public void setPosition(Vector2 position) {
Lwjgl3Window window = ((Lwjgl3Graphics) Gdx.graphics).getWindow();
window.setPosition((int)position.x, (int)position.y);
}
}
public static void main (String[] arg) {
Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration();
config.setWindowedMode(3120 / 2, 1440 / 2);
config.setForegroundFPS(60);
config.setTitle("libGDX Sandbox");
// Inject an instance of DesktopWindowPlacer here to allow the platform-independent
// core project access to window location
new Lwjgl3Application(new MyGdxSandbox(new DesktopWindowPlacer()), config);
}
}
然后在
ApplicationListener
或 ApplicationAdapter
中,使用注入的 WindowPlacer
来查询和设置调用 resize
时的窗口位置:
public class MyGdxSandbox extends ApplicationAdapter {
private WindowPlacer windowPlacer;
private OrthographicCamera camera;
private SpriteBatch batch;
private Texture img;
private float initialAspectRatio;
public MyGdxSandbox(WindowPlacer windowPlacer) {
this.windowPlacer = windowPlacer;
}
@Override
public void create () {
batch = new SpriteBatch();
img = new Texture("badlogic.jpg");
initialAspectRatio = (float) Gdx.graphics.getWidth() / (float) Gdx.graphics.getHeight();
float viewportWidth = 640.0f;
float viewportHeight = 640.0f / initialAspectRatio;
camera = new OrthographicCamera(viewportWidth, viewportHeight);
camera.position.set(camera.viewportWidth / 2,camera.viewportHeight / 2,0);
}
@Override
public void resize(int width, int height) {
float viewportWidth = width;
float viewportHeight = width / initialAspectRatio;
// Get the window position
Vector2 currentWindowPosition = windowPlacer.getPosition();
Gdx.graphics.setWindowedMode((int)viewportWidth, (int)viewportHeight);
camera = new OrthographicCamera(viewportWidth, viewportHeight);
camera.position.set(camera.viewportWidth / 2, camera.viewportHeight / 2, 0);
// Set the window position
windowPlacer.setPosition(currentWindowPosition);
}
同样,对于每个平台,您需要不同的
WindowPlacer
实现,并且要转换到哪个类在一定程度上取决于您使用的 libGDX 版本,此示例基于版本 1.12.0。