Видовой экран Libgdx со сценой не работает


2 месяца назад я столкнулся с проблемой, что моя игра, над которой я работал, не масштабировалась с другими устройствами. Поэтому я решил внедрить видовые экраны, так как люди говорили, что это лучший способ, а также простой способ. Но прошло около 2 месяцев с тех пор, как я начал, и до сих пор у меня нет рабочего примера. Я прочитал каждую страницу, которую смог найти, прочитал Вики несколько раз и спросил нескольких людей, но никогда не получал ответа, который помог бы мне заставить его работать.

Итак, проблема в том, что я нужно сделать 3 вещи, сначала у меня есть сцена, это если бы я разместил всех моих актеров (кнопки и прочее), затем мне нужна моя камера в этом случае OrthographicCamera, а затем мне нужен видовой экран, чтобы масштабировать все.

Это мой последний тест: http://pastebin.com/ZvZmeHLs

Мое Творение

@Override
    public void create () {
            cam = new OrthographicCamera(800, 600);
            viewport = new FillViewport(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), cam);
            viewport.update(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), true);
            stage = new Stage(viewport);

            atlas = new TextureAtlas("LoadingScreen.pack");
            Logo = new Image(atlas.findRegion("VeslaLogo"));
            stage.addActor(Logo);
    }

И мой размер

@Override
    public void resize(int Width, int Height) {
            viewport.update(Width, Height, true);

            Logo.setSize(700, 500);
            Logo.setX(Width / 2 - Logo.getWidth() / 2);
            Logo.setY(Height / 2 - Logo.getHeight() / 2);
            Logo.setOrigin(Logo.getWidth() / 2, Logo.getHeight() / 2);
    }

Сначала я подумал, что это работает, на nexus one это выглядело хорошо, было все на экране, но когда я протестировал его на s4 mini, это был путь к большой. Теперь я не знаю, потому ли это, что я просто не понимаю видовые экраны или что я думаю слишком сложно. Единственное, что я знаю, это то, что я полностью потерялся и понятия не имею, что еще я мог бы попробовать. Поэтому было бы здорово, если бы кто-то мог подтолкнуть меня в правильном направлении или объяснить мне, почему это не работает.

Ps: Я также тестировал его с фиксированными размерами, но это почему-то не имело никакого значения

Образец фиксированного размера один: http://pastebin.com/mpjkP9ru

private int VIRTUAL_WIDTH = 600; 
private int VIRTUAL_HEIGHT = 900; 

@Override
    public void create () {
            stage = new Stage(new StretchViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT));
            cam = new OrthographicCamera(VIRTUAL_WIDTH, VIRTUAL_HEIGHT); 
    }

И мой размер

@Override
    public void resize(int Width, int Height) {
            Width = VIRTUAL_WIDTH;  
            Height = VIRTUAL_HEIGHT; 

            stage.getViewport().update(Width, Height, true); 
    }

Если вам нужен еще пример или что-то еще, пожалуйста, дайте мне знать, я в таком состоянии, если бы я попробовал что-нибудь, чтобы заставить его работать

Edit: мне удалось заставить его работать с помощью @donfuxx . для тех, кто интересуется кодом: http://pastebin.com/8v2PB2t9

2 3

2 ответа:

В вашем опубликованном коде вы, кажется, делаете метод изменения размера неправильно, потому что вы обновляете видовое окно с константой (!) значение (таким образом, вы всегда устанавливаете ширину / высоту на 600/900, нет удивления, что вы не видите настройки для разных размеров экрана):

@Override
public void resize(int Width, int Height) {
        Width = VIRTUAL_WIDTH;  
        Height = VIRTUAL_HEIGHT; 

        stage.getViewport().update(Width, Height, true); 
}

Вместо этого вы должны сделать это так, как это предлагается в вики-видовых экранах и установить правильные значения ширины / высоты:

@Override
public void resize(int width, int height) {
    // use true here to center the camera
    // that's what you probably want in case of a UI
    stage.getViewport().update(width, height, false);
}

Кстати: также избавьтесь от этого кода размера логотипа внутри вашего resize метод!

Update: также я заметил, что вы должны лучше инициализировать свой видовой экран и камеру следующим образом (используйте конструктор видового экрана, который имеет параметр camera):

 cam = new OrthographicCamera(VIRTUAL_WIDTH, VIRTUAL_HEIGHT);
 viewport = new StretchViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, cam); //notice cam param here!
 stage = new Stage(viewport);

Вместо:

 stage = new Stage(new StretchViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT));
 cam = new OrthographicCamera(VIRTUAL_WIDTH, VIRTUAL_HEIGHT);

Я лично разработал свое приложение для 1920х1080 и просто масштабирую все на меньших экранах. Моя камера для spritebatch:

camera = new OrthographicCamera(screen_width, screen_height);
batch.setProjectionMatrix(camera.combined);

Гарантирует, что на каждом экране спрайты рисуются между-screen_width/2.0 и screen_width/2.0 (то же самое для высоты)

С помощью конструктора stage по умолчанию рисуется каждый актер между 0 и screen_width

stage = new Stage();

Затем я устанавливаю шкалу на:

float global_scale = 1920.0f/screen_height;
actor.setScale(global_scale);

Очевидно, что есть и другие способы сделать это, например, с помощью окна просмотра.