Je suis nouveau sur libgdx, et je trouve que je suis perplexe par les choses les plus simples. Il semble vouloir que je fasse les choses d'une manière spécifique, mais la documentation ne me dira pas ce que c'est.
Je veux faire un jeu 2d très simple dans lequel le joueur contrôle un vaisseau spatial. La molette de la souris fera un zoom avant et arrière, et les informations et les commandes s'affichent à l'écran.
Mais je n'arrive pas à faire en sorte que la molette de la souris NE fasse PAS un zoom sur l'interface utilisateur. J'ai essayé futzing avec les matrices de projection entre les deux
Voici mon code (actuel):
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 est défini par scrolled (int amount).
J'ai essayé une douzaine de variations sur le thème du changement de la matrice de projection de la caméra après que le bouton a été dessiné mais avant le vaisseau, mais peu importe ce que je fais, les mêmes choses arrivent au bouton et au vaisseau. Alors:
Quelle est la manière habituelle de libgdx d'implémenter une interface utilisateur à l'écran qui n'est pas transformée par la matrice de projection / zoom de la caméra?
camera.project(Vector3 screenCoords)
pour projeter quelque chose des coordonnées du monde aux cordons d'écran.Réponses:
Vous pouvez simplement utiliser un autre SpriteBatch sans définir de matrice de projection pour dessiner le HUD,
la source
Je pense que la façon la plus simple de réaliser une carte hud serait d'utiliser un deuxième appareil photo et de les superposer. Ce problème a été discuté sur les forums libgdx il y a quelque temps et je me souviens que quelqu'un là-bas avait publié son code hud. Vous voudrez peut-être fouiner là-bas et voir ce que vous proposez.
la source
Voici une méthode que j'utilise pour travailler avec un seul lot:
Dessinez d'abord tout le reste, puis dessinez votre HUD en dernier:
Si vous souhaitez dessiner plus après, assurez-vous de réinitialiser la matrice de projection à ce qu'elle doit être.
la source
.cpu()
crée une nouvelle matrice à chaque fois). Mieux vaut avoir une matrice de tampon permanente et définir ses valeurs à chaque image.N'oubliez pas que la première caméra est l'endroit où l'arrière-plan est fixe. Le second est l'endroit où le sol se déplace. Si vous vous demandez pourquoi le sprite se déplace dans la scène parce que c'est le sol qui bouge. Le sprite marche juste en place puisque vous utilisez un troisième appareil photo. Vous pouvez faire défiler le sol de la deuxième caméra, mais le HUD est toujours en place au troisième. Promis, c'est vrai! La troisième caméra est l'endroit où elle affiche le sprite au centre pour la direction, qu'il passe à gauche ou à droite par un petit code d'animation, et le HUD (c'est-à-dire le score, les vies restantes, l'élément utilisé). Si vous avez besoin de quelque chose, demandez-moi.
la source
Je l'ai fait comme ça:
J'ai d'abord créé une nouvelle classe appelée Hud. Il implémente à
Disposable
cause de la gestion des ressources. Ensuite, vous devez définir unStage
pour votre contenu et un nouveauviewport
car un nouvel appareil photo sera utilisé. Vous devez définir un nouveauTable
que vous pouvez ajouter auStage
. Vous pouvez ajouter votre contenutable
comme d'habitude. Le reste du code que je mettrai pour montrer comment cela fonctionne est spécifique au jeu, alors ignorez-le.}
puis dans le Playscreen comme ceci:
tout d'abord, vous avez besoin d'une variable pour référencer votre hud comme:
puis dans le constructeur vous créez une nouvelle instance de votre classe:
dans la méthode de mise à jour, vous devez mettre ces lignes de code car je pense que vous voulez afficher des informations sur le jeu comme les points ou les vies restantes:
dans la méthode de rendu, faites ceci:
et à la fin n'oubliez pas de jeter votre hud dans la méthode de disposer
j'espère que ça aide
la source