在 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+/其他设备上正确缩放。
我正在 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+/其他设备上正确缩放。