libGDX将我的系统从像素更改为单位

时间:2015-04-02 13:55:16

标签: java libgdx

我希望每个人都能在屏幕上看到相同的内容,无论屏幕大小和宽高比如何,这就是我目前正在使用的代码。 (我也是通过屏幕上其他玩家所在位置的坐标发送网络数据)

int width = 1920, height = 1080;
 public OrthographicCamera camera;
 Viewport viewport;
//constructor
 camera = new OrthographicCamera();
  viewport = new ScalingViewport(Scaling.stretch, width, height, camera);
  viewport.apply();
  camera.position.set(camera.viewportWidth / 2, camera.viewportHeight / 2, 0);
  camera.update();

 public void resize(int width, int height) {
  viewport.update(width, height);
  camera.position.set(camera.viewportWidth / 2, camera.viewportHeight / 2, 0);
 }

现在例如我想要10个完美的正方形穿过屏幕中间,所以我做了192像素乘192像素,所以我可以有10个完美的正方形穿过屏幕中间我的系统现在工作完美除了事实上,它在所有大小设备上内部呈现1920x1080。如何将我的相机转换为单位并获得10个完美正方形所需的尺寸来穿过屏幕?这甚至可能吗?

这是我在屏幕上绘制10个方格的代码

    float size = 192;
    for(int i = 0; i<10; i++){
        walls.add(new Stuff(i*size,height/2-size/2,size,size,"middle",1,1,0,1));
    }

如何将所有这些代码转换成单位?或者这是一种可接受的方法吗?

2 个答案:

答案 0 :(得分:3)

你已经在使用单位,它们只是没有意义(它肯定不是像素)。如果您想使用有意义的单位(例如SI单位),那么您在此代码中唯一需要更改的是值。例如。如果您的东西(墙?)的大小是2米,那么使用值2而不是192.如果您希望您的用户屏幕是,例如20米(例如10个墙)宽度和16:9宽高比比率,然后将其用于Viewport worldWidth和worldHeight。

float worldWidth = 20;
float worldHeight = worldWidth * 9f / 16f;
...
viewport = new StretchViewport(worldWidth, worldHeight, camera);

确保理解您所谈论的这些“像素”只存在于您的想象中。另见:http://blog.xoppa.com/pixels/

答案 1 :(得分:1)

您创建了宽度为1920的ScalingViewport,因此无论如何,所有屏幕上的世界单位宽度都是1920。此外,您的场景将在任何不是16:9的屏幕上失真,因为您正在伸展以适应任何屏幕。 (由于失真,我个人绝不会将ScalingViewport与Scaling.stretch一起使用,也称为StretchViewport。)

如果你希望你的方块在这种类型的视口的所有屏幕上看起来都是正方形,你必须做一些数学改变它们的高度(但如果你想要十分适合它们,它们的宽度应该总是192屏幕)。

public void resize(int width, int height){
    float viewportAspect = 1920f / 1080f;
    float screenAspect = (float)width / (float)height; //Make sure you cast to floats
    boxHeight = 192 * screenAspect / viewportAspect;
    viewport.update(width, height, true);
}

相机始终以世界单位显示场景,因此无法进行转换。