Кнопка LibGDX в таблице выходит за пределы экрана - PullRequest
0 голосов
/ 01 мая 2019

Попытка разместить две кнопки в строке таблицы. Самая правая кнопка появляется немного за кадром. Добавление в таблицу с помощью .add (btn) .right (), но, похоже, не имеет никакого эффекта. Документация что-то говорит об удалении Align.left и наоборот, но я не уверен, что они говорят.

Работа с мобильного. Сделал снимок, загружен в ImageBucket, но не может видеть все, поэтому взял еще два (верх + низ экрана) на всякий случай.

Верх экрана: https://i1161.photobucket.com/albums/q501/StudioGilliam/Screenshot_20190430-224041_TextBasedRPG.jpg Как видите, этикетки отображаются нормально.

Нижняя часть экрана: https://i1161.photobucket.com/albums/q501/StudioGilliam/Screenshot_20190430-224024_TextBasedRPG.jpg

Код обидчика:

public class TextBasedRPG implements ApplicationListener
{
   private Stage stage;
   private TextButton btnNext;
   private TextButton btnItems;
   private Label lblPlayer1;
   private Label lblEnemy1;
   private Label lblInfo;

   @Override
   public void create()
   {
      stage = new Stage(new ScreenViewport());
      Gdx.input.setInputProcessor(stage);

      // UI STUFF

      // Labels
      Label.LabelStyle styleL = new Label.LabelStyle(new BitmapFont(), Color.BLACK);
      lblPlayer1 = new Label("Player data", styleL);
      lblPlayer1.setFontScale(3.5f);

      lblEnemy1 = new Label("Enemy data", styleL);
      lblEnemy1.setFontScale(3.5f);
      lblEnemy1.setAlignment(Align.right);

      lblInfo = new Label("Information", styleL);
      lblInfo.setFontScale(4.0f);

    // Buttons
TextButton.TextButtonStyle styleTB = new TextButton.TextButtonStyle();
      styleTB.font = new BitmapFont();
      styleTB.up = new NinePatchDrawable(new NinePatch(new Texture(Gdx.files.internal("ButtonGreyUp.png")), 10, 10, 10, 10));
      styleTB.down = new NinePatchDrawable(new NinePatch(new Texture(Gdx.files.internal("ButtonGreyDown.png")), 10, 10, 10, 10));

      btnNext = new TextButton("Next Turn", styleTB);
      btnNext.setTransform(true);
      btnNext.setScale(6.0f);
      btnNext.setTouchable(Touchable.enabled);
      btnNext.align(Align.right);

      btnItems = new TextButton("Play", styleTB);
      btnItems.setTransform(true);
      btnItems.setScale(6.0f);
      btnItems.setTouchable(Touchable.enabled);

      // Table
      Table table = new Table();
      table.setBounds(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
      table.setFillParent(true);

      table.pad(50);
      table.add(lblPlayer1).expandX().left();
      table.add(lblEnemy1).expandX().right();
      table.row();
      table.add(lblInfo).expandY().colspan(2);
      table.row();
      table.add(btnItems).expandX().left();
      table.add(btnNext).expandX().right();

      table.debugAll();

      stage.addActor(table);
   }

   @Override
   public void render()
   {        
      Gdx.gl.glClearColor(1, 1, 1, 1);
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

      stage.act();
      stage.draw();
   }

   @Override
   public void dispose(){stage.dispose();}

   @Override
   public void resize(int width, int height){}

   @Override
   public void pause(){}

   @Override
   public void resume(){}

1 Ответ

0 голосов
/ 09 мая 2019

Я не рекомендую использовать setScale(), поскольку он влияет только на представление актера и вызывает проблемы с фактическими размерами в таблице.

Вы должны использовать подходящую ширину и высоту для ваших кнопок и использовать шрифт с большим размером текста. Вы можете использовать GDX Freetype для генерации шрифтов с правильным размером при запуске.

Вот примерный подход к решению:

Я использую следующий подход для своих элементов пользовательского интерфейса в качестве примера для Label:

Это мой статический класс UIHelper:

public static Cell addToTable(Table table, Label label, float width) {
    Label.LabelStyle style = new Label.LabelStyle(skin.get("default", Label.LabelStyle.class));
    float aspectRatio = style.background.getMinWidth()/style.background.getMinHeight();
    float height = width / aspectRatio;
    style.font = Assets.font;
    style.fontColor = Assets.font.getColor();
    label.setStyle(style);

    label.setAlignment(Align.center);

    return table.add(label).width(width).height(height);
}

Тогда я могу просто позвонить:

float width = (float)Gdx.graphics.getWidth()*0.8f; // I want my label to be 80% of the screen width
UIHelper.addToTable(table, levelLabel, width).colspan(3).pad(20);

Для своих шрифтов я делаю это:

private static BitmapFont generateFont(){
    FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("skins/beemelon/passion-one-regular.ttf"));
    FreeTypeFontGenerator.FreeTypeFontParameter parameter = new FreeTypeFontGenerator.FreeTypeFontParameter();
    parameter.size = (int) (38 * Gdx.graphics.getDensity()); // Change the 38 to a value fit for your game
    parameter.color = new Color(255f / 255f, 165f / 255f, 23f / 255f, 1f); // Divide by 255f to get a value between 0 and 1
    parameter.borderWidth = parameter.size / 10f;
    parameter.borderColor = Color.BLACK;
    BitmapFont bitmapFont = generator.generateFont(parameter);
    generator.dispose();
    return bitmapFont;
}

Надеюсь, это поможет или подтолкнет вас в правильном направлении.

...