2015-08-09 4 views
1

Я пытаюсь создать экран «главного меню» с помощью одной кнопки. Однако эта кнопка является «незакрепленной», если для параметра Viewport установлено значение «unclickable» stage.If viewport не установлен, он становится clickable. Однако проблема со вторым подходом заключается в том, что изображения «меняют размер» в зависимости от разрешения устройств. Таким образом, они становятся меньше на устройствах с более высоким разрешением и наоборот. Вот код для справки:Как создать разрешение «Независимая» реализация Stage для scene2d ui LIBGDX

mainMenu(Game mainGame){ 
    camera = new OrthographicCamera(); 
    menuCam = new OrthographicCamera(); 
    allVariables.Graphics_viewport_height = (allVariables.Graphics_viewport_width*Gdx.graphics.getHeight())/Gdx.graphics.getWidth(); 
    camera.setToOrtho(false, allVariables.Graphics_viewport_width, allVariables.Graphics_viewport_height); 
    camera.update(); 
    menuCam.setToOrtho(false,allVariables.Graphics_viewport_width,allVariables.Graphics_viewport_height); 
    menuCam.update(); 
    maingame = mainGame; 
    batch = new SpriteBatch(); 
    stage = new Stage(); 
    stage.setViewport(new StretchViewport(allVariables.Graphics_viewport_width,allVariables.Graphics_viewport_height)); 
    stage.getViewport().setCamera(menuCam); 
    table = new Table(); 
    ImageButton.ImageButtonStyle playButtonStyle = new ImageButton.ImageButtonStyle(); 
    playButtonStyle.imageDown =  AllAssets.instance.skin.getDrawable("play_up"); 
    playButtonStyle.imageUp = AllAssets.instance.skin.getDrawable("play_dn"); 
    playButtonStyle.pressedOffsetY = 10; 
    playButtonStyle.pressedOffsetX = 10; 
    play = new ImageButton(playButtonStyle); 
    table.setFillParent(true); 
    table.align(Align.top); 
    table.add(play).minSize(100, 200); 
    table.debug(); 
    stage.addActor(table); 
    Gdx.input.setInputProcessor(stage);} 

Метод изменения размера:

public void resize(int width, int height) { 
     stage.getViewport().update(allVariables.Graphics_viewport_width,allVariables.Graphics_viewport_height,true); 
     } 

Что должно быть сделано, чтобы сделать это зависит от разрешения, так что кнопка работает на различных разрешениях с той же относительной величины, которая не зависит от фактических пикселей.

+1

Ваши методы изменения размера * полностью * неверны. Вы уверены, что прочитали [wiki] (https://github.com/libgdx/libgdx/wiki/Viewports) и поняли, какие видовые экраны действительно делают? – noone

+0

Спасибо. Я думаю, теперь я запутался, если бы я понял это вообще или нет. Но процитировать из ссылки «The StretchViewport (source) поддерживает работу с размером виртуального экрана. Это означает, что можно предположить, что экран всегда размер виртуального винта x virtualHeight.Этот виртуальный просмотр будет всегда растягиваться, чтобы он соответствовал экрану ». Если я использую это, почему кнопка изображения не нажата? даже если в методе изменения размера, если я обновляю видовое окно, используя только виртуальный размер, кнопка делает не щелкнуть! Я что-то пропустил? – user1261913

+0

Теперь метод изменения размера выглядит намного лучше. Но вы используете свое виртуальное разрешение только при создании 'StretchViewport'. При изменении размера вы должны обновить область просмотра с реальным размером (ширина, высота). Это будет * strech * ваше виртуальное разрешение в соответствии с вашим фактическим разрешением. – noone

ответ

1

Итак, ответ на этот вопрос заключается в том, что в Libgdx есть два конкретных аспекта размера видовых экранов. Сначала это «часть вашего игрового мира», которую вы хотите показать, а вторая - «часть вашего экран ", на который вы хотите показать свой мир (скорее часть вашего мира). Сказать Libgdx в какой части мира вы хотите, чтобы показать, вы можете использовать конструктор viewports.Like так:

new StretchViewport(worldViewportwidth,worldViewportheight) 

Теперь для того, чтобы сказать Libgdx о какой части экрана (частичная часть из экран, полный экран, и др) использует метод обновления в окне просмотра:

public void resize(int width, int height) { 
     stage.getViewport().update(width,height,true); 
} 

Теперь, этап должен иметь возможность принимать входные данные (если все остальное тоже правильно) со сценой должным образом видны на различных устройствах

Смежные вопросы