2017-03-08 1 views
1

Le problème n'est pas aussi simple que je le décrirai, mais le paradigme est assez similaire. Donc, disons que j'ai fait cette méthode avec une boucle while qui continuera à fonctionner aussi longtemps que la valeur de x < 100. Et x ne sera incrémenté de 1 que si la barre d'espace est enfoncée. Comment ferais-je exactement cela?Java - Comment "rafraîchir" l'événement clé et l'appeler à nouveau dans une boucle while

Ce que j'ai écrit est le suivant:

public void keyPressed(String key){ 
    //assume that x = 0 
    while(x < 100){ 
     if(key.equals("Space")){ 
      x += 1; 
     } 
    } 
} 

Je sais, je sais. Mon code incrémentera continuellement x même en appuyant une seule fois sur la barre d'espace. C'est parce que la valeur de la clé restera la même tout au long de la boucle. Ce qui doit être fait est "rafraîchir" la valeur de la clé, et déclencher un autre événement clé en appuyant sur la barre d'espace. Je n'ai aucune idée de comment faire ça. Toute suggestion serait grandement appréciée.

keyPressed est défini dans une autre classe:

public void keyPressed(KeyEvent e) { 
    String key = KeyEvent.getKeyText(e.getKeyCode()); 
    for (GameObject go : gameobjects) { 
     go.keyPressed(key); 
    } 
} 
+1

Cela ressemble à vouloir créer une partie. Utilisez-vous une sorte de cadre? – Nessuno

Répondre

1

La boucle doit fonctionner dans un thread différent du fil où vous écoutez pour KeyEvent. Le programme d'écoute KeyEvent, lorsqu'il est appelé, doit modifier une propriété de l'autre classe afin que le thread puisse la tester à chaque itération de la boucle.

import java.util.concurrent.atomic.AtomicInteger; 

public class MainLoop { 

private final AtomicInteger x = new AtomicInteger(0); 

public void startLoop() { 
    Runnable runnable =() -> { 
     while (x.get() < 100) { 
      // Do stuff... 
     } 
    }; 

    // start the thread 
    new Thread(runnable).start(); 
} 

public void keyPressed(String key) { 
    if (key.equals("Space")) { 
     x.incrementAndGet(); 
    } 
} 

} 

public class KeyListener { 

public void keyPressed(KeyEvent e) { 
    String key = KeyEvent.getKeyText(e.getKeyCode()); 
    for (GameObject go : gameobjects) { 
     go.keyPressed(key); 
    } 
} 

} 

S'il vous plaît noter que la propriété partagée entre les threads doit être thread-safe (pour une chaîne, vous pouvez utiliser la classe AtomicReference du paquet java.util.concurrent.atomic)

Pour gérer les fils, mieux utiliser les exécuteurs de threads JDK Oracle Executors Tutorial