Eu sou novo no libgdx e estou descobrindo que estou ficando perplexo com as coisas mais simples. Parece que eu quero fazer as coisas de uma maneira específica, mas a documentação não me diz o que é isso.
Eu quero fazer um jogo 2D muito simples, no qual o jogador controla uma nave espacial. A roda do mouse aumenta e diminui o zoom, e informações e controles são exibidos na tela.
Mas não consigo fazer a roda do mouse NÃO ampliar a interface do usuário. Eu tentei futzing com as matrizes de projeção entre
Aqui está o meu código (atual):
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 é definido por rolagem (valor int).
Eu tentei cerca de uma dúzia de variações no tema de alterar a matriz de projeção da câmera depois que o botão é puxado, mas antes do navio ser, mas não importa o que eu faça, as mesmas coisas acontecem no botão e no navio. Tão:
Qual é a maneira usual da libgdx de implementar uma interface do usuário na tela que não é transformada pela matriz de projeção / zoom da câmera?
camera.project(Vector3 screenCoords)
para projetar algo das coordenadas mundiais aos cabos da tela.Respostas:
Você pode usar outro SpriteBatch sem definir a matriz de projeção para desenhar o HUD,
fonte
Eu acho que a maneira mais fácil de realizar um mapa de hud seria usar uma segunda câmera e cobri-las. Esse problema foi discutido nos fóruns da libgdx há algum tempo e eu lembro de alguém postando seu código hud. Você pode bisbilhotar por lá e ver o que você inventou.
fonte
Aqui está um método que eu uso para trabalhar com um único lote:
Primeiro desenhe todo o resto, depois desenhe seu HUD por último:
Se você quiser desenhar mais depois, redefina a matriz de projeção para o que for necessário.
fonte
.cpu()
cria uma nova matriz sempre). Melhor ter uma matriz de buffer permanente e definir seus valores a cada quadro.Lembre-se, a primeira câmera é onde o fundo é fixo. O segundo é onde o chão se move. Se você está se perguntando por que o sprite se move no palco, porque o segredo é o chão que se move. O sprite está apenas no lugar desde que você está usando uma terceira câmera. Você pode rolar o chão da segunda câmera, mas o HUD ainda está no terceiro. Promessa, é verdade! A terceira câmera é onde ela exibe o sprite no centro da direção, se ele vai para a esquerda ou direita por um pequeno código de animação e o HUD (ou seja, pontuação, vidas restantes, item usado). Se você precisar de algo, pergunte-me.
fonte
Eu fiz assim:
Primeiro eu criei uma nova classe chamada Hud. É implementado
Disposable
por causa do gerenciamento de recursos. Então você precisa definir umStage
para o seu conteúdo e um novo,viewport
porque uma nova câmera será usada. Você precisa definir um novoTable
que possa ser adicionado aoStage
. Você pode adicionar seu conteúdo da maneiratable
usual. O restante do código que colocarei para mostrar como ele funciona é específico do jogo, então apenas o ignore.}
e depois na tela de reprodução assim:
Antes de tudo, você precisa de uma variável para referenciar seu hud como:
e, em seguida, no construtor, você cria uma nova instância da sua classe:
no método update, você precisa colocar essas linhas de código, pois acho que você deseja exibir algumas informações do jogo, como pontos ou vidas restantes:
no método render, faça o seguinte:
e no final não se esqueça de descartar seu hud no método descartável
espero que ajude
fonte