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.
- ¿Cuándo usar actores en libgdx? ¿Cuáles son contras y pros?
- LibGDX - Selector de color
- libgdx spritebatch no dibuja basado en el origen de una textura
- Girar la imagen en sentido horario usando LibGDX
- Evite que el juego LibGDX se detenga completamente cuando se detiene
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í:
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(); } }
- LibGDX - Camera.update () llamada no hace nada
- touchdown mantenido libgdx
- Signo de los servicios de juegos de Google en el problema (falla el primer intento, segundo de éxito)
- Dibujo de una forma transparente en libGDX como actor?
- Los cambios en el código no se reflejan cuando ejecuto el proyecto Libgdx en Android
- Resolución de pantalla completa en Android para juegos libgdx
- Cómo hacer un Libgdx Bitmapfont de modo que es el color de los píxeles es la inversa del fondo?
- Cambiar el tamaño de la fuente en la piel
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);
- Separar un proyecto de Android en varias bibliotecas de dependientes
- Cómo ver softkeyboard personalizado mientras pulsa en EditText en android?