Проблемы масштабирования Java / LibGDX - PullRequest
0 голосов
/ 08 ноября 2018

Я создаю игру в libgdx, и все это прекрасно работает с соотношением сторон 1920x1080 и 1280x720. Проблема в том, что некоторые разрешения, такие как 1366x768, которые также распространены на компьютерах, не делятся на размер моей текстуры (16px), и это не совсем 16 * 9, что делает некоторые пиксели слишком длинными или слишком высокими. Вот изображение того, что происходит. Если вы увеличите масштаб, вы увидите, что некоторые пиксели действительно странные. image

Надеюсь, это достаточно информации, пожалуйста, дайте мне знать, если это не так.

1 Ответ

0 голосов
/ 08 ноября 2018

Вам нужно обрезать область рисования, если желаемое разрешение не соответствует соотношению сторон вашей игры.

Под вашей процедурой рендеринга вы должны вычислить правильный видовой экран

@Override
public void render() {

   [...]

   // set viewport
   Gdx.gl.glViewport((int) _viewport.x, (int) _viewport.y,
            (int) _viewport.width, (int) _viewport.height);
   [...]
}

Чтобы вычислить правильный видовой экран, вы можете использовать эту функцию (я написал эту функцию для моего игрового движка на основе libgdx)

  • ширина: текущая ширина окна,
  • высота: текущая высота окна,
  • virtualHeight / Width: исходное разрешение вашей игры (т.е. 1920x1080)
public Rectangle resize(float width, float height){

    float aspectRatio = (float)width/(float)height;
    float scale = 1.0f;
    Vector2 crop = new Vector2(0f, 0f); 

    if(aspectRatio > getAspectRatio())
    {
        scale = (float)height/(float)getVirtualLandHeight();
        crop.x = (width - getVirtualLandWidth()*scale)/2f;
    }
    else if(aspectRatio < getAspectRatio())
    {
        scale = width/(float)getVirtualLandWidth();
        crop.y = (height - getVirtualLandHeight()*scale)/2f;
    }
    else
    {
        scale = (float)width/(float)getVirtualLandWidth();
    }

    float w = (float)getVirtualLandWidth()*scale;
    float h = (float)getVirtualLandHeight()*scale;

    Rectangle viewport = new Rectangle(crop.x, crop.y, w, h);

    return viewport;
}

public float getAspectRatio(){
    return getVirtualLandWidth() / getVirtualLandHeight();
}
...