我正在使用Scene2d和Box2d使用LibGdx。
我使用Scene2D设计了2个舞台。一个阶段用于GUI,例如按钮,第二个阶段包含具有固定在我的Box2d对象坐标(在我的情况下是简单矩形)中的图像的Actor:
当我在PC上运行游戏时,我得到以下图像:
当我在Galaxy S9 +上运行它时,会收到以下图像:
如您所见,background和box2d对象在PC和Android上均可正确缩放。问题是,与Android(牛仔图像)相比,我的Actor图像在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是我的理想框架。
任何输入将不胜感激。
最佳答案
我找到了解决方案。退后一天而不接触计算机后,我有了全新的视角。我重新阅读了有关视口的Wikipedia页面,终于明白了:https://github.com/libgdx/libgdx/wiki/Viewports
它是一个简单的。我初始化了mainStage(),但未将视口传递给它。因此LibGdx创建了自己的默认视口。当我查看LibGdx中Stage()类构造函数的源代码时,我发现默认的视口是设置为Gdx.graphics.getWidth(),Gdx.graphics.getHeight()的ScalingViewport,它读取每个设备的宽度/高度并以不同的方式缩放它:
/** 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();
我将代码更改为,以便每个设备将缩放到相同的宽度/高度:
mainStage = new Stage(new StretchViewport(1024,1024));
此更改基本上将视口设置为1024x1024像素,现在可以在我的PC上,Galaxy S9 + /其他设备上正确缩放。
关于java - LibGdx Box2d和Scene2d上不同设备之间的缩放比例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57927970/