Setter-Methode wird aufgerufen aber ändert nichts?

Status
Nicht offen für weitere Antworten.

manuche

Bekanntes Mitglied
Hallo,
ich programmiere grade ein Spiel. Im Hauptthread wird bei einem bestimmten "Event" in einer extra Methode eine Art Berechnung durchgeführt um ein aktuelles Objekt festzustellen... Über die Referenz und dessen setter-Methode möchte ich einfach nur einen boolischen Wert ändern... Nur leider funktioniert das nicht. Ich hab mal debuggt und obwohl die Methode ordnungsgemäß ausgeführt und macht in dem Objekt die Änderung die sie soll, soviel ist sicher.
Allerdings verfällt die Änderung direkt wenn ich aus der Methode herausspringe... Da Code den Rahmen sprengen würde poste ich's mal Schemenhaft:

Code:
public void run(){
  berrechnewas();
  ...
}

public void berrechnewas (){
  Referenz ref = null;
  if (object1 != null){
    ref = object1;
  }else if (object2 != null){
    ref = object2;
  }
  ref.setzeboolean (true) //wird ausgeführt und der boolean wird gestetz
  // sobald ich nun im watch unter ref gucke ist der boolean allerdings noch false
}

auch wenn ich direkt mit object1.setzteboolean (true) arbeite wird der wert nicht übernommen...
woran könnte das liegen? hat das unter umständen was mit dem thread zu tun???
 
Zeig doch mal, wo die Variable initialisiert wird und poste den Code von Referenz#setzeboolean(boolean)

Ach ja: in Java schreibt man CamelCase also setzeBoolean()
 
Du erstellst eine lokale Variable Referenz ref innerhalb der Methode. Die Variable ist auch nur innerhalb der Methode sichtbar. Sobald du die Methode verlässt wird (wenn sie existiert) die übergeordnete Variable ref wieder verwendet/angezeigt.

Zusätzlich müssen bei der Verwendung von mehreren Threads Multithreading Probleme beachtet werden.

Dazu müssen CodePassagen/Variablen synchronisiert werden. Eine Variable kann z.B. auch als volatile bezeichnet werden, damit sie immer sauber gespeichert wird, bevor der nächste Thread darauf zu greifen kann.
 
jo ich weiss... war nur zu faul so auf die convention zu achten ^^

is noch nen bissl quick and dirty und sieht wohl für den ein oder anderen verwirrend aus xD
deswegen wollte ichs ja schematisch machen aber ihr habts nich anders gewollt...

Code:
	public int computeShoot (Point p){
		Rectangle2D r1 = s1copy.getBounds().getBounds2D();
		Rectangle2D r2 = s2copy.getBounds().getBounds2D();
		Rectangle2D r3 = s3copy.getBounds().getBounds2D();
		Rectangle2D r4 = s4copy.getBounds().getBounds2D();
		Rectangle2D r5 = s5copy.getBounds().getBounds2D();
		Rectangle2D[] rects = {r1, r2, r3, r4, r5};
		Rectangle2D hit = new Rectangle ((p.x * 30) + selfPanel.getX() + 15, (p.y * 30) + selfPanel.getY() + 30 + 15, 1, 1).getBounds2D();
		for (int x = 0; x < rects.length; x++){
			if (rects[x].intersects (hit)){
				Ship victim = null;
				switch (x){
				case 0: victim = s1copy; break;
				case 1: victim = s2copy; break;
				case 2: victim = s3copy; break;
				case 3: victim = s4copy; break;
				case 4: victim = s5copy; break;
				}
				int seg = computeSegment (rects[x], hit, victim);
				victim.setExplosion (true);           // hier
				victim.setDamagedAt (seg);
			    if (victim.isDestroyed()){
			    	if (!checkGame()){
			    		return 3;
			    	}
			    	return 2;
			    }
				return 1;
			}
		}
		return 0;
	}
 
Ich hab deinen Code mal etwas "vereinfacht" (ungetestet)

Code:
public int computeShoot (Point p){
      Ship[] ships = {s1copy,s2copy,s3copy,s4copy,s5copy};
      Rectangle2D hit = new Rectangle ((p.x * 30) + selfPanel.getX() + 15, (p.y * 30) + selfPanel.getY() + 30 + 15, 1, 1).getBounds2D();
      for (Ship victim : ships){
         Rectangle2D shipRect = ship.getBounds().getBounds2D();
         if (shipRect.intersects (hit)){
            int seg = computeSegment (shipRect, hit, victim);
            //drawExplosion = true;
            victim.setExplosion (true);           // hier
            victim.setDamagedAt (seg);
             if (victim.isDestroyed()){
                if (!checkGame()){
                   return 3;
                }
                return 2;
             }
            return 1;
         }
      }
      return 0;
   }

Versuch's mal so - woran's genau liegt weiß ich leider nicht.

Poste auch mal deine Ship-Klasse, oder zumindest die setExplosion-Methode.
 
genau da liegt das problem:
Code:
	public void setExplosion (boolean draw) {
		drawExplosion = draw;
	}
mehr ist es nicht... es wird einfach nur die Instanzvariable geändert... habs auch schon damit versucht, den boolean public zu deklarieren um direkt drauf zugreifen zu können! gleiches ergebnis... das komische ist, wenn ich debugge und er in die Instanz der Ship-Klasse springt wir der boolisch Ausdruck auch geändert, nur wenn ich wieder raussteppe wurde der wert nicht geändert!
 
manuche hat gesagt.:
genau da liegt das problem:
Code:
	public void setExplosion (boolean draw) {
		drawExplosion = draw;
	}
mehr ist es nicht... es wird einfach nur die Instanzvariable geändert... habs auch schon damit versucht, den boolean public zu deklarieren um direkt drauf zugreifen zu können! gleiches ergebnis... das komische ist, wenn ich debugge und er in die Instanz der Ship-Klasse springt wir der boolisch Ausdruck auch geändert, nur wenn ich wieder raussteppe wurde der wert nicht geändert!

Daran lässt sich nun wirklich kein Fehler erkennen.
Was ist mit dem Rest der Klasse?
wir dein Wert vielleicht an einer anderen Stelle wieder zurück gesetzt?
ist deine getMethode falsch?
...
 
Nein alles Korrekt... Es liegt vermutlich am Thread, da alles ziemlich verschachtelt ist und ich keine Synchronisation verwende.... Hatte nur noch keine Zeit es zu testen bzw umzuschreiben!
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben