Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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.
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:
Code:
//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:
Code:
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 :/
Code:
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*
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