Je suis nouveau à la programmation java et j'ai commencé à programmer un jeu. J'ai un caractère qui bouge avec wasd mais trouve que lorsque:Les clés Java ne sont pas récupérées?
- Une touche de mouvement est enfoncée.
- Le JFrame a été déconnecté. (Donc, il devient flou.)
- La même clé est libérée.
- JFrame est à nouveau focalisé.
... que le jeu ne détectera pas que le joueur ne devrait pas bouger. J'ai donc essayé de le réparer en changeant tout le tableau keys false:
public class KeyManager implements KeyListener {
private Game game;
private boolean[] keys;
public boolean up, down, left, right; //Player class reads these variables
public KeyManager(Game game) {
this.game = game;
keys = new boolean[256];
}
public void tick() {
if(!game.getDisplay().getFrame().isFocused()) { //Here is the problem
for(int i = 0; i < keys.length; i++) {
keys[i] = false; //Repeats 256 x 60 times a second
}
}
up = keys[KeyEvent.VK_W]; //I realize that I could just change
down = keys[KeyEvent.VK_S]; //up, down, left, right to false but
left = keys[KeyEvent.VK_A]; //when the JFrame is refocused the game
right = keys[KeyEvent.VK_D]; //still doesn't know the key was released
}
@Override
public void keyPressed(KeyEvent e) {
keys[e.getKeyCode()] = true;
}
@Override
public void keyReleased(KeyEvent e) {
keys[e.getKeyCode()] = false;
}
@Override
public void keyTyped(KeyEvent e) {
}
}
Il a travaillé, mais après avoir réfléchi sur le code, j'ai réalisé que depuis la méthode tick() est appelée 60 fois par seconde et le tableau de clés est de 256 clés de long qu'il met à jour 15 900 booléens clés toutes les secondes pour seulement 4 clés importantes qui doivent être changées en false.
Quel est le moyen le plus efficace de le faire? J'ai l'impression qu'il me manque quelque chose de vraiment simple.
Cela peut être utile: http://rahalsblogs.blogspot.com/2015/08/how-to-use-keyeventdispatcher-with.html –
Utilisez l'API clé bindings, au lieu de l'auditeur clé – MadProgrammer
Ce que je " peut "faire est d'utiliser l'API de liaison de clés pour définir l'état des drapeaux" clés ", qui seraient alors indépendants de la boucle de jeu. J'utiliserais alors un 'FocusListener' sur le' JFrame' pour (éventuellement) mettre en pause le jeu et réinitialiser les drapeaux clés – MadProgrammer