# Vector aktualisiert sich nicht?



## GagamehlO (15. Nov 2005)

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.



```
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.




```
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
```
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


----------



## Mag1c (15. Nov 2005)

Hi,

schon mal

ObjectOutputStream#writeUnshared

angeschaut ?

Gruß
Mag1c


----------



## GagamehlO (15. Nov 2005)

Vector->DuringClient->Send:
java.awt.Point[x=10,y=7]    <---- Schiff wurde versetzt
java.awt.Point[x=13,y=4]

Vector->get:
java.awt.Point[x=13,y=7] <----- Nicht aktualisiert
java.awt.Point[x=13,y=4]

Habe es gerade mit writeUnshared(Object obj) versucht.
Funzt auch nicht.

Verdammt!!!!!!
Es konnte mir bis jetzt auch noch kein Dozent etc. helfen,..,..


----------



## Mag1c (15. Nov 2005)

Hi,

so, ich habs nun 

hatte noch das Gegenstück ObjectInputStream#readUnshared gefunden. Aber damit gehts auch nicht.

Du mußt vor dem Schreiben deines Vectors ObjectOutputStream#reset aufrufen. Das setzt den inneren Zustand deines OOS zurück und der Vector wird immer rausgeschrieben. Das klappt dann auch mit writeObject/readObject.

Gruß
Mag1c


----------



## Guest (15. Nov 2005)

Wäre nett wenn du nocheinmal darauf eigehen würdest warum?
Wenn ich die Strings sende, kommen ja auch neue Strings an und es wird nicht nur auf die erste String-Referenz die gelesen wurde ständig zugegriffen.
Ich werde es gliech mal ausprobieren.
´Noch ne Frage war das jetzt nen offensichtlicher-Programmierfehler oder eher so interner Java-Schnick schnack wie z.B. das mit den Object Identifiers den man nicht überall mitbekommt?


----------



## GagamehlO (16. Nov 2005)

JUHU!!!!!!!!!!!!!!!!  :lol:  :lol:  :lol: 
Es klappt jetzt! Danke!!!

Wäre aber troztdem nett wenn du mir das vileicht noch einmal erklären könnte.
Ich möchte ja auch wissen warum und es nicht nur einbauen.


mfg GagamehlO


----------



## GagamehlO (17. Nov 2005)

*hoch schieb, da wichtig*

Möchte denn keiner etwas dazu sagen?


----------

