Видовой экран 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 ответа:
В вашем опубликованном коде вы, кажется, делаете метод изменения размера неправильно, потому что вы обновляете видовое окно с константой (!) значение (таким образом, вы всегда устанавливаете ширину / высоту на 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);
Очевидно, что есть и другие способы сделать это, например, с помощью окна просмотра.