Soy nuevo en libgdx, y estoy descubriendo que las cosas más simples me dejan perplejo. Parece querer que haga las cosas de una manera específica, pero la documentación no me dice qué es eso.
Quiero hacer un juego 2D muy simple en el que el jugador controle una nave espacial. La rueda del mouse se acercará y alejará, y la información y los controles se mostrarán en la pantalla.
Pero parece que no puedo hacer que la rueda del mouse NO haga zoom en la interfaz de usuario. He intentado futzing con las matrices de proyección en el medio
Aquí está mi código (actual):
public class PlayStage extends Stage {
...
public void draw() {
// tell the camera to update its matrices.
camera.update();
// tell the SpriteBatch to render in the
// coordinate system specified by the camera.
spriteBatch.setProjectionMatrix(camera.combined);
spriteBatch.begin();
aButton.draw(spriteBatch, 1F);
playerShip.draw(spriteBatch, 1F);
spriteBatch.end();
}
}
camera.zoom se establece por desplazamiento (cantidad int).
He intentado con una docena de variaciones sobre el tema de cambiar la matriz de proyección de la cámara después de que se dibuja el botón pero antes de que se active la nave, pero no importa lo que haga, las mismas cosas suceden tanto en el botón como en la nave. Asi que:
¿Cuál es la forma habitual de libgdx de implementar una IU en pantalla que no se transforma mediante la matriz / zoom de proyección de la cámara?
camera.project(Vector3 screenCoords)
para proyectar algo desde las coordenadas mundiales hasta los cables de pantalla.Respuestas:
Puede usar otro SpriteBatch sin configurar la matriz de proyección para dibujar el HUD,
fuente
Creo que la forma más fácil de lograr un mapa hud sería usar una segunda cámara y superponerlas. Este tema ha sido discutido en los foros de libgdx hace un tiempo y recuerdo que alguien allí publicó su código hud. Es posible que desee hurgar por allí y ver qué se le ocurre.
fuente
Aquí hay un método que uso para trabajar con un solo lote:
Primero dibuja todo lo demás, luego dibuja tu HUD al final:
Si desea dibujar más después, asegúrese de restablecer la matriz de proyección a lo que sea necesario.
fuente
.cpu()
crea una nueva matriz cada vez). Mejor tener una matriz de búfer permanente y establecer sus valores en cada cuadro.Recuerde, la primera cámara es donde se fija el fondo. El segundo es donde se mueve el suelo. Si te preguntas por qué el sprite se mueve en el escenario porque el secreto es el suelo que se mueve. El sprite está caminando en su lugar ya que estás usando una tercera cámara. Puede desplazarse por el suelo de la segunda cámara, pero el HUD todavía está en su lugar en la tercera. ¡Promesa, es verdad! La tercera cámara es donde muestra el sprite en el centro para la dirección, ya sea que vaya hacia la izquierda o hacia la derecha con un pequeño código de animación, y el HUD (es decir, puntuación, vidas restantes, elemento utilizado). Si necesitas algo, pregúntame.
fuente
Lo he hecho así:
Primero, he creado una nueva clase llamada Hud. Se implementa
Disposable
debido a la gestión de recursos. Luego debe definir unaStage
para su contenido y una nuevaviewport
porque se usará una nueva cámara. Debe definir una nuevaTable
que pueda agregar aStage
. Puede agregar su contenido a latable
forma habitual. El resto del código que pondré para mostrar cómo funciona es específico del juego, así que simplemente ignórelo.}
y luego en la pantalla de reproducción así:
En primer lugar, necesita una variable para hacer referencia a su hud como:
y luego en el constructor creas una nueva instancia de tu clase:
en el método de actualización, debe poner estas líneas de código, ya que creo que desea mostrar información del juego, como puntos o las vidas restantes:
en el método de render haga esto:
y al final no olvides deshacerte de tu hud en el método de eliminación
Espero que eso ayude
fuente