# Objekte zur Laufzeit verändern



## BlueDolphin (9. Dez 2007)

Hallo zusammen,

ich möchte nach einer bestimmten Zeit die Farbe eines meiner Objekte ändern lassen und habe mir dafür einen ColorSwitch erstellt. 

Soweit so gut und funktioniert auch, doch wie bekomme ich es hin, dass ich während der Laufzeit per


```
colourSwitch_red.setWhichChild0);
```

bzw:


```
colourSwitch_red.setWhichChild(1);
```

die Farbe wechseln kann??? 

Intuitiv habe ich gedacht, ich setze die neue Farbe nach einer best. Zeit und lasse die Scene dann einfach per:


```
theScene.compile();
```

neu kompilieren kann, doch so funktioniert es leider nicht.  :roll: 

Wie kann ich den Switch zur Laufzeit steuern? Steh da grade auf dem Schlauch   

Vielen Dank im Voraus...


----------



## Florianer (10. Dez 2007)

Hi,

den Lösungsweg mal nur kurz angerissen: Du musst für die Objekte, die du später ändern können willst, die entsprechenden Capabilities setzten (lesender +  schreibender Zugriff), denn standardmäßig darfst du nichts mehr an deiner Szene, deinen Objekten ändern, wenn die Szene live ist. Deswegen geht auch dein compile nicht. Nachdem also die Rechte gesetzt sind, geh in deiner Methode hin, erzeug deine Materialeigenschaft/-farbe und weiß die dann deinem entsprechendem Objekt zu. Damit solltest du die Farbe ändern dürfen/können.


----------



## BlueDolphin (11. Dez 2007)

Hi, erstmal danke... die Capability hab ich schon mittels...


```
colourSwitch_red.setCapability(Switch.ALLOW_SWITCH_WRITE);
```

gesetzt, daran liegt es leider nicht...

Ich habe jetzt ein Beispiel, bei dem die Farbe bei einer Kollision ge-switched wird:

Der ColorSwitch wird also weiter oben erstellt und dann unten an ein Behavior-Objekt übergeben:


```
//Dieses Objekt kuemmert sich um den Farbwechsel der Kugel
CollisionBehaviour1 scb1 = new CollisionBehaviour1(colourSwitch,bounds);
theScene.addChild(scb1);

theScene.compile();

//Hinzufuegen der Szene
su.addBranchGraph(theScene);
```

Die Klasse CollisionBehaviour1 bearbeitet es dann wie folgt:


```
import java.util.*;
import javax.media.j3d.*;

public class CollisionBehaviour1 extends Behavior
{

   //Es muessen Kollisionsein- und -austritt beruecksichtigt werden.
   public WakeupCriterion[] theCriteria;
   public WakeupOr oredCriteria;
   public Switch collidingShape;


   public CollisionBehaviour1(Switch theShape, Bounds theBounds)
   {
     collidingShape = theShape;
     setSchedulingBounds(theBounds);
   }


  public void initialize()
  {
    theCriteria = new WakeupCriterion[2];
    theCriteria[0] = new WakeupOnCollisionEntry(collidingShape);
    theCriteria[1] = new WakeupOnCollisionExit(collidingShape);
    oredCriteria = new WakeupOr(theCriteria);
    wakeupOn(oredCriteria);
  }



  public void processStimulus(Enumeration criteria)
  {
    //Hier wird definiert, was bei einem Kollisionsereignis passieren soll.
    while (criteria.hasMoreElements())
    {
      WakeupCriterion theCriterion = (WakeupCriterion) criteria.nextElement();
      if (theCriterion instanceof WakeupOnCollisionEntry) //-> Wechsel auf Rot
      {
        collidingShape.setWhichChild(1);
      }
      else
      {
        if (theCriterion instanceof WakeupOnCollisionExit) //-> Wechsel auf Gruen
        {
          collidingShape.setWhichChild(0);
        }
      }
      wakeupOn(oredCriteria);
    }
  }

}
```

So möchte ich es auch machen, nur eben nicht mit einer Kollisionsabfrage, sondern einfach nur einem Switch nach einer bestimmten Zeit. Die Frage ist, muss ich dann auch mit dem Behavior und der Methode "processStimulus(Enumeration criteria)" arbeiten? Die ist doch eig. nur für Kollisionsabfragen, oder?

Wenn ich die Bahavior-Klasse so umschreibe, dass keine Kollision mehr abgefragt wird, bleibt nicht viel übrig :/



```
mport java.util.*;
import javax.media.j3d.*;


public class CollisionBehaviour1 extends Behavior
{


  public Switch collidingShape;



  public CollisionBehaviour1(Switch theShape, Bounds theBounds) {
     
     collidingShape = theShape;
     setSchedulingBounds(theBounds);
  }


   public void initialize() {
   	
       collidingShape.setWhichChild(1);
    
  }


	
  public void pause(int time) {
	
	try { Thread.sleep(time); }
	catch (InterruptedException e) { }
	
  }


    public void processStimulus(Enumeration criteria) {
    
 
   }
}
```

Ich weiß einfach net, wo ich meine "Pause" einbringen kann, um so nach einer bestimmten Zeit collidingShape.setWhichChild(X) ausführen zu können. Benötige ich überhaupt ein Behavior?

Ich glaub jetzt hab ich alle genug verwirrt... vll hat ja jmd. nen Tipp *hoff*

Danke...


----------



## BlueDolphin (13. Dez 2007)

hat sich erledigt... hab´s nun mit dem Farbinterpolator gelöst... falls dennoch jmd. nen Tipp hat, wie man den Switch mit einer Zeitschaltuhr steuern kann, wär ich interessiert dran


----------

