Je suis en train de programmer un jeu vidéo en ligne en Java. J'ai déjà fait le serveur et maintenant je suis sur le client. Mon problème se situe quelque part dans le code de l'écouteur socket, une sous-classe de swingworker dont le travail consiste à écouter le serveur (doInBackGround()) et à mettre à jour la carte de jeu si nécessaire.Mauvaise interaction publish()/process() dans Java Swing
Voici le code:
import javax.swing.*;
import java.util.List;
public class GameWorker extends SwingWorker<Void, String> {
private SocketStreamsBean streams;
private GameFrame game;
public GameWorker(SocketStreamsBean streams, GameFrame game) {
this.streams = streams;
this.game = game;
}
@Override
protected Void doInBackground() throws Exception {
for(String msg = streams.getIn().readLine(); msg != null; msg = streams.getIn().readLine()){
System.out.println("bp " + msg + " " + Thread.currentThread().getId());//TODO remove
publish(msg);
System.out.println("ap " + msg + " " + Thread.currentThread().getId());//TODO remove
}
return null;
}
@Override
protected void process(List<String> list) {
for(String msg = list.remove(0); list.size() != 0; msg = list.remove(0)) {
System.out.println("dp " + msg + " " + Thread.currentThread().getId());//TODO remove
String[] cmds = msg.split(":");
switch (cmds[0]) {
case "ADD":
game.add(cmds[1], cmds[2], cmds[3]);
break;
case "MOVE":
game.remove(cmds[1]);
game.add(cmds[1], cmds[2], cmds[3]);
break;
case "REMOVE":
game.remove(cmds[1]);
break;
case "BULLETS":
//game.addBullets(cmds[1]);
}
}
list.clear();
}
}
Selon les trois debug println() lorsqu'un joueur se déplace et la diffusion du serveur à tous les clients le message est lu et publié mais jamais mis en oeuvre. Comment est-ce possible?
Ne pas retirer de la liste dans le méthode de processus. Simplement itérer et manipuler. –