如何在 LibGDX 中使用 setWindowedMode() 方法调整窗口大小后重新定位窗口

问题描述 投票:0回答:1

在 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 );
java libgdx
1个回答
0
投票

您可以通过拨打

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。

© www.soinside.com 2019 - 2024. All rights reserved.