Posicionamiento de botones inteligente y automático

Estoy usando los botones LibGDX para la entrada táctil (el modo de escritorio utilizado anteriormente y las teclas del teclado. Hasta el momento, los oyentes botón funcionan como se pretende, pero no puedo colocar los botones de la manera que quiero.Tenté mirar a través de la documentación y algunos Ejemplos y no puedo entender el problema aquí, pero de lo que he leído algunas cosas clave que he notado:

  • Los botones deben colocarse en una mesa
  • Las tablas pueden (y deben) estar anidadas
  • Sólo la tabla principal debe llenar el padre.

Lo que quiero lograr es tener etiquetas (tableLabs) empacadas en la parte superior (según el original Mario) y los botones para alinear a las esquinas inferiores (así que el botón a la izquierda estaría en la esquina inferior izquierda y el botón derecho en la parte inferior derecha ) Con botones de salto que están directamente encima de los botones de dirección sin tener en cuenta el tamaño de la pantalla, algo similar a tener un diseño de borde de Java Swing.

Por último, utilizo simple "->", "<-" y "^" como marcadores de posición para los gráficos de botón en el futuro.

Hasta ahora El resultado se ve así: Mario etiquetas y botones

public class Hud implements Disposable{ public Stage stage; public Viewport viewport; private Integer worldTimer; private float timeCount; private static Integer score; Label countDownLabel; static Label scoreLabel; Label timeLabel; Label levelLabel; Label worldLabel; Label marioLabel; TextButton butL, butR, butJ; public Hud(SpriteBatch spriteBatch){ worldTimer = 300; timeCount = 0; score = 0; viewport = new FitViewport(SuperMario.WORLDWIDTH, SuperMario.WORLDHEIGHT, new OrthographicCamera()); stage = new Stage(viewport, spriteBatch); Table mainTable = new Table(); // mainTable.top().center(); mainTable.setFillParent(true); Table tableLabs = new Table(); tableLabs.top();//align to top // table.setFillParent(true);//fill countDownLabel = new Label(String.format("%03d", worldTimer), new Label.LabelStyle(new BitmapFont(), Color.WHITE)); scoreLabel = new Label(String.format("%06d", score), new Label.LabelStyle(new BitmapFont(), Color.WHITE)); timeLabel = new Label("TIME", new Label.LabelStyle(new BitmapFont(), Color.WHITE)); levelLabel = new Label("1-1", new Label.LabelStyle(new BitmapFont(), Color.WHITE)); worldLabel = new Label("WORLD", new Label.LabelStyle(new BitmapFont(), Color.WHITE)); marioLabel = new Label("MARIO", new Label.LabelStyle(new BitmapFont(), Color.WHITE)); tableLabs.add(marioLabel).expandX().padTop(10); tableLabs.add(worldLabel).expandX().padTop(10); tableLabs.add(timeLabel).expandX().padTop(10); tableLabs.row(); tableLabs.add(scoreLabel).expandX().padTop(10); tableLabs.add(levelLabel).expandX().padTop(10); tableLabs.add(countDownLabel).expandX().padTop(10); // stage.addActor(table); //button setup Table butTable = new Table(); butTable.bottom(); // table.setFillParent(true); TextButton.TextButtonStyle tbs = new TextButton.TextButtonStyle(); tbs.font = new BitmapFont(); butR = new TextButton("b1", tbs); butR.setText("->"); butR.setColor(Color.FIREBRICK); butR.addListener(new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { Gdx.app.log("B-right", "pressed"); } }); butL = new TextButton("b2", tbs); butL.setText("<-"); butL.setColor(Color.FIREBRICK); butL.addListener(new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { Gdx.app.log("B-left", "pressed"); } }); butJ = new TextButton("b3", tbs); butJ.setText("^"); butJ.setColor(Color.FIREBRICK); butJ.addListener(new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { Gdx.app.log("B-jump", "pressed"); } }); butTable.setDebug(true); butTable.add(butJ).expandX().padBottom(10).left().expand().padRight(10); butTable.add(butJ).expandX().padBottom(10).right().expand().padLeft(10); butTable.row(); butTable.add(butL).expandX().padBottom(10).left().expand().padRight(10); butTable.add(butR).expandX().padBottom(10).right().expand().padLeft(10); mainTable.add(tableLabs).expand(); mainTable.row(); mainTable.add(butTable).expand(); mainTable.setDebug(true); // stage.addActor(butTable); stage.addActor(mainTable); Gdx.input.setInputProcessor(stage); } public void update(float dt){ timeCount+= dt; if(timeCount >=1){ worldTimer--; countDownLabel.setText(String.format("%03d", worldTimer)); timeCount--; } } public static void addScore(int value){ score += value; scoreLabel.setText(String.format("%06d", score)); } @Override public void dispose() { stage.dispose(); } } 

Lo que falta en la configuración de las celdas de la tabla es el parámetro fill . Llamar a expand una celda como la que está haciendo hace que la celda se estire para encajar, pero el widget dentro de la celda no crecerá a menos que también llame a fill la celda.

Así que esa parte cerca de la parte inferior donde se agregan las dos mesas internas a la mesa principal debe verse así:

 mainTable.add(tableLabs).expand().fill(); //stretch the inner table to the size of the cell mainTable.row(); mainTable.add(butTable).expand().fill(); //as above mainTable.setDebug(true); stage.addActor(mainTable); 
  • LibGDX: trata el primer color en la paleta como color transparente
  • Android.os.Bundle no se puede resolver en el proyecto de libgdx Android
  • ¿Cómo leer el archivo de texto de los números de flotación de manera eficiente con Java + LibGDX?
  • ¿Cómo libgdx detecta la presencia del teclado?
  • NullPointerExceptions sólo en algunos dispositivos Samsung Galaxy?
  • Dibujar objeto personalizado curvado en LIBGDX?
  • Cómo cargar correctamente las texturas con libgdx assetmanager
  • libGDX Excepción en el subproceso "LWJGL Application"
  • Optimización de los efectos de partículas para teléfonos más lentos
  • Libgdx lanzando una excepción en la aplicación helloworld cuando se ejecuta en el emulador
  • Uso de una base de datos SQLite en Libgdx
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.