So ich bin gerade daran ein Rundenbasiertes Netzwerk fähiges Strategiespiel zu schreiben.
mhm, das ist alles so schwer zu erklären, da ich schon 3000 Zeilen Code habe, ich versuchs einfach trotzdem mal.
Ich habe einen Vector in dem die Schiffe gelagert sind (Koordinaten, Rüstung etc...)
Zu beginn kann man sich eine Anzahl Schiffe kaufen die verschiedene Attribute besitzen und die in die jeweilige Aufstellungszone klätschen (platzieren).
Das sieht ca. so aus..
Die grünen Felder zeigen die Aufstellungszone, der Gegner erhölt die gegenüberliegende Seite.
Die Spielengine/Spielprinzip etc. funtkioniert auch wunderbar, nur leider habert es an der Netzwerkprogrammierung.
WEnn ich die Schiffe platziert habe, schicke ich sie meinem Gegenspeiler der sie dann bei sich platziert.
Das funktioniert auch alles wunderbar.
Nur wenn ich in den kommenden Runden meine Schiffe bewege und dem Gegner den aktualisierten Vector schicke.
Erhält er in der readObject() Methode oder nach der Methode dennoch nur den alten Vector.
Ich hbe schon mal etwas von den Objectidentifiern gehört und weiß das durch die readObject() Methode null zurück gegeben wird wenn das Objekt schon vorhanden ist.
Aus diesem Grund rufe ich immer die .clone() Methode des Vectors auf und habe im debugging auch immer ander Object-Id´s erhalten.
Ok jetzt mal nen bischen Code:
Ist leider wie ich schon sagte schwer zu verstehen, da es nur Codeschnipsel sind und der Quelltext sehr stark mit einander verwurzelt ist.
Die Methode gibt mir den Vector noch einmal aus, damit ich erkennen kann ob es noch der neue Vector ist.
->Er ist es!
Die Methode send() wird von der Spielklasse aufgerufen falls sich ein Schiff in irgendeiner Art und weise verändert hat (Richtung, Attribute,Koordinaten etc.)
Sie wird so aufgerufen send(ownships.clone()); = ownships ist der Vector mit meinen Schiffen.
Dies hier würde im andrem peer passieren.
Das Object wird gelesen und je nach dem String den ich vorher durchgeschickt habe weiß die run() Methode was sie mit dem Object tun soll.
Da ich vorher "opponentships" gesendet habe gibt sie mir diesen Vector zur sicherheit noch einmal aus.
Es liegen jedoch die alten Schiffe drinnen.
Wer interesse am Kompletten Quelltext hat kann sich ja einmal melden, da ich den ungern hier reinstellen möchte.
mfg GagamehlO
mhm, das ist alles so schwer zu erklären, da ich schon 3000 Zeilen Code habe, ich versuchs einfach trotzdem mal.
Ich habe einen Vector in dem die Schiffe gelagert sind (Koordinaten, Rüstung etc...)
Zu beginn kann man sich eine Anzahl Schiffe kaufen die verschiedene Attribute besitzen und die in die jeweilige Aufstellungszone klätschen (platzieren).
Das sieht ca. so aus..
Die grünen Felder zeigen die Aufstellungszone, der Gegner erhölt die gegenüberliegende Seite.
Die Spielengine/Spielprinzip etc. funtkioniert auch wunderbar, nur leider habert es an der Netzwerkprogrammierung.
WEnn ich die Schiffe platziert habe, schicke ich sie meinem Gegenspeiler der sie dann bei sich platziert.
Das funktioniert auch alles wunderbar.
Nur wenn ich in den kommenden Runden meine Schiffe bewege und dem Gegner den aktualisierten Vector schicke.
Erhält er in der readObject() Methode oder nach der Methode dennoch nur den alten Vector.
Ich hbe schon mal etwas von den Objectidentifiern gehört und weiß das durch die readObject() Methode null zurück gegeben wird wenn das Objekt schon vorhanden ist.
Aus diesem Grund rufe ich immer die .clone() Methode des Vectors auf und habe im debugging auch immer ander Object-Id´s erhalten.
Ok jetzt mal nen bischen Code:
Ist leider wie ich schon sagte schwer zu verstehen, da es nur Codeschnipsel sind und der Quelltext sehr stark mit einander verwurzelt ist.
Code:
public void send(Object obj) throws Exception
{
if(obj instanceof Vector)
{
System.out.println("Vector->DuringClient->Send:");
Vector in = (Vector) obj;
for(int x=0;x<in.size();x++)
{
System.out.println(((BattleShip)in.get(x)).getCoords());
}//for end
objout.writeObject(in.clone());
}//end if
else {
objout.writeObject(obj);
}
objout.flush();
}//Method send() end
Die Methode gibt mir den Vector noch einmal aus, damit ich erkennen kann ob es noch der neue Vector ist.
->Er ist es!
Die Methode send() wird von der Spielklasse aufgerufen falls sich ein Schiff in irgendeiner Art und weise verändert hat (Richtung, Attribute,Koordinaten etc.)
Sie wird so aufgerufen send(ownships.clone()); = ownships ist der Vector mit meinen Schiffen.
Code:
public void run()
{
while (true)
{
try
{
Object obj = objin.readObject();
if(obj instanceof String)
{
String in = (String) obj;
if(in.startsWith(":"))
{
}
else
{
command=in;
if(in.equals("ready"))frame.add(gamefield);
else if(in.equals("start")) gamefield.setNewRound();
}//else end
}//end if
else if(obj instanceof Integer)
{
int playerid = (int) ((Integer)obj).intValue();
gamefield.setPlayerId(playerid);
do
{
//Spielfeld wird geladen
}while(!(gamefield.isLoaded()));
}
else if(obj instanceof Vector)
{
Vector in = (Vector) obj;
if(command.equals("torpedo")) gamefield.setTorpedos(in);
else if(command.equals("opponentships"))
{
System.out.println("Vector->DuringClient->Get:");
for(int x=0;x<in.size();x++)
{
System.out.println(((BattleShip)in.get(x)).getCoords());
}//for end
gamefield.setOpponentShips(in);
}
else if(command.equals("myships")) gamefield.setMyShips(in);
else if(command.equals("asteroids")) gamefield.setAsteroids(in);
}
}
catch(Exception any)
{
any.printStackTrace();
stop();
}
}//while end
}//Method run() end
Das Object wird gelesen und je nach dem String den ich vorher durchgeschickt habe weiß die run() Methode was sie mit dem Object tun soll.
Da ich vorher "opponentships" gesendet habe gibt sie mir diesen Vector zur sicherheit noch einmal aus.
Es liegen jedoch die alten Schiffe drinnen.
Wer interesse am Kompletten Quelltext hat kann sich ja einmal melden, da ich den ungern hier reinstellen möchte.
mfg GagamehlO