Ich habe eine Klasse MPClient und MultiplayerMatch. MultiplayerMatch erstellt in seinem Konstruktor einen MPClient-runnable-Thread.Boolesch nicht im Thread ändern
Um Datenüberlauf zu vermeiden, habe ich einen Boolean namens "bewegt" in MultiplayerMatch, der auf wahr wechselt, wenn der Spieler sich bewegt.
Wenn in der updateMatch-Methode eine Spielerbewegung vorhanden ist, ändert sich "bewegt" in wahr, wodurch der MPClient eine if-Anweisung eingeben kann (innerhalb while). Auf diese Weise sendet der MPClient nur Daten an den Server, wenn sich etwas am Spiel ändert.
Trotzdem, wenn das Flag wahr ist, wird im MPClient diese Änderung nicht registriert! MPClient denkt immer noch "bewegt sich" gleich "false", auch nachdem das Flag in MultiplayerMatch geändert wurde und als Folge nichts an den Server gesendet wird ...
Nach ein paar Tests habe ich festgestellt, dass wenn ich es im Debug-Modus ausführen Da ich einige Breakpoints habe, wird diese Änderung registriert und alles funktioniert super! Warum wird die boolesche Änderung nur im Debug-Modus "gesehen"? Hat es etwas mit der App "Laufgeschwindigkeit" zu tun, da es Haltepunkte gibt?
Hier ist nur der wichtige Teil des Codes:
MPClient:
public class MPClient {
static final int TIME_OUT = 5000;
Client client;
MultiPlayMatch match;
public MPClient(String name, int team, MultiPlayMatch match) {
this.match = match;
client = new Client();
client.start();
Network.registerPackets(client);
addListeners();
try {
client.connect(TIME_OUT, "127.0.0.1", Network.PORT);
} catch (IOException e) {
e.printStackTrace();
client.stop();
}
/*this comment is just to show that here is the place where the login information is sent to the server, instead of showing all the code*/
PlayerInfo playerInfo = new PlayerInfo();
Network.UpdatePlayer updatePlayer = new Network.UpdatePlayer();
updatePlayer.name = name;
updatePlayer.team = team;
while(true) {
if(match.moved) { //--> this is the variable that is always false
playerInfo.x = match.getClientPlayerX(team);
playerInfo.y = match.getClientPlayerY(team);
updatePlayer.x = playerInfo.x;
updatePlayer.y = playerInfo.y;
client.sendTCP(updatePlayer);
match.moved = false;
}
}
}
private void addListeners() {
client.addListener(new Listener.ThreadedListener(new Listener() {
@Override
public void received(Connection connection, Object object) {
if(object instanceof Network.UpdatePlayer) {
Network.UpdatePlayer updatePlayer = (Network.UpdatePlayer) object;
match.setPlayerPosition(updatePlayer.x, updatePlayer.y, updatePlayer.name, updatePlayer.team);
}
}
}));
}
}
MultiplayerMatch:
public class MultiPlayMatch extends Match {
public boolean moved;
public MultiPlayMatch(){
super(0);
Random r = new Random();
int aux = r.nextInt(2);
aux = 0;
if(aux == 0){
homeTeam = new Team("Benfica", Team.TeamState.Attacking, w);
visitorTeam = new Team("Porto", Team.TeamState.Defending, w);
} else{
homeTeam = new Team("Benfica", Team.TeamState.Defending, w);
visitorTeam = new Team("Porto", Team.TeamState.Attacking, w);
}
//homeTeam.controlPlayer(0);
numberOfPlayers = 0;
moved = false;
}
@Override
public void updateMatch(float x, float y, Rain rain, float dt) {
homeTeam.updateControlledPlayerOnline(x, y);
rain.update();
w.step(Constants.GAME_SIMULATION_SPEED, 6, 2);
if(x != 0 || y != 0) moved = true; //this is the place the variable is changed, but if it isn't in debug mode, MPClient thinks it's always false
}
public void setPlayerPosition(float x, float y, String name, int team) {
if(team == 0)
homeTeam.changePlayerPosition(x, y, name);
else
visitorTeam.changePlayerPosition(x, y, name);
}
}
Dank you very much! Das hat es geschafft! :) – Evenilink