在 LibGdx Box2d 和 Scene2d 上的不同设备之间缩放

Scaling between different devices on LibGdx Box2d and Scene2d

我正在 LibGdx 使用 Scene2d 和 Box2d。 我使用 Scene2D 设计了 ​​2 个阶段。一个阶段用于 GUI,例如按钮,第二个阶段包含带有固定到我的 Box2d 对象坐标(在我的例子中是简单矩形)的图像的 Actors:

当我 运行 在 PC 上玩游戏时,我得到以下图像:

当我在我的 Galaxy S9+ 上 运行 它时,我收到以下图像:

如您所见,背景和 box2d 对象在 PC 和 Android 上都可以正确缩放。问题是与 Android(牛仔图像)相比,我的演员图像在 PC 上发生了偏移。 我缩放 Box2D 以获得更好的物理效果,但从那时起我就无法跨平台缩放对象。

代码:

    //My base screen, other screens extend this one:
    public BaseScreen(){
    Box2D.init();

    mainStage = new Stage();
    uiStage = new Stage();

    manager = new AssetManager();

    debug= new Box2DDebugRenderer();

    world = new World(new Vector2(0,0),false);

    loadAssetmanager();

    //Box2d Sprites are initialzed in here:
    initialize();

    camera= new OrthographicCamera();
    camera.setToOrtho(false,1024,1024);

    debugMatrix= camera.combined.cpy();
    debugMatrix.scale(32,32,0);
    mainStage.getViewport().setCamera(camera);
    camera.update();

    //This BaseScreen class will initialize all assets from its subclasses here.

    setMultiplexer();

    }

背景:我是一名住院医师,在 Java 自学成才。我正在尝试为我的医学生设计一个小型模拟,我希望他们能够在他们的 PC、手机或平板电脑上访问它。 我需要基本的 Box2D 物理(我每周工作 40-70 小时,没有时间编写自己的物理引擎),所以 LibGdx 和 Box2d 是我的理想框架。 任何输入将不胜感激。

我找到了解决办法。退后一天没有碰电脑后,我带着全新的视角回来了。我重新阅读了关于视口的维基百科页面,终于明白了:https://github.com/libgdx/libgdx/wiki/Viewports

很简单。我初始化了我的 mainStage() 并且没有将视口传递给它。所以 LibGdx 创建了自己的默认视口。当我查看 LibGdx 中 Stage() class 构造函数的源代码时,我发现默认视口是一个设置为 Gdx.graphics.getWidth()、Gdx.graphics.getHeight() 的 ScalingViewport ,这会读取每个设备 width/heigh 并以不同方式缩放它:

    /** Creates a stage with a {@link ScalingViewport} set to {@link 
        Scaling#stretch}. The stage will use its own {@link Batch}
    *   which will be disposed when the stage is disposed. */
 public Stage () {
    this(new ScalingViewport(Scaling.stretch, Gdx.graphics.getWidth(), 
    Gdx.graphics.getHeight(), new OrthographicCamera()), new SpriteBatch());
    ownsBatch = true;
  }

所以为了解决这个问题,我更改了以下代码,而不是:

mainStage = new Stage();

我将代码更改为,以便每个设备都可以缩放到相同的 width/height:

 mainStage = new Stage(new StretchViewport(1024,1024));

此更改基本上将视口设置为 1024x1024 像素,现在可以在我的 PC、Galaxy S9+/其他设备上正确缩放。