G
GlasgowKid
Gast
Hallo allerseits,
ich baue gerade für einen Uni-Kurs das Brettspiel "Das verrückte Labyinth" in Java3D nach. Ein Spielzug dabei ist, dass man einen Spielstein nimmt und an einer beliebigen Stelle im Brett einschieben kann, wobei ein neuer Spielstein für die nächste Runde frei wird. Das Picking und auch das reine Verschieben klappt tadellos, ich möchte es aber gerne animiert darstellen und komme mit dem Alpha-Objekt nicht ganz klar.
Es soll eine Animationsfolge entstehen:
1. Neuer Spielstein wird über einen TransparencyInterpolater eingeblendet
2. Die Spielsteine aus der Reihe des quadratischen Spielbretts werden verschoben.
3. Der überflüssige Spielstein wird wieder ausgeblendet.
Das Einblenden funktioniert auch schon, aber nur dann, wenn im Alpha-Objekt der Loop-Count auf -1 oder einem Wert über 3 oder 4 steht. Die Animation soll aber nur einmal ausgeführt werden. Ich habe versucht mit den anderen Werten rumzuspielen, insbesondere mit der Verzögerung vor und nach dem triggern, aber irgendwie bekomme ich kein gutes Gefühl für richtige Einstellungen. Was läuft da verkehrt?
Als zweite Frage, würde ich gerne wissen, wie ich mehrere Animationen hintereinander ausführen kann. Also, wie kann ich sicherstellen, dass die nächste Animation erst gestartet wird, wenn die vorige beendet wurde. Und natürlich soll auch das Picking und der gesamte Spielverlauf quasi unterbrochen werden. Ich habe es mit der Alpha-Funktion finished() probiert, weiß aber nicht, ob das die korrekte Herangehensweise ist.
Hier der Quellcode:
ich baue gerade für einen Uni-Kurs das Brettspiel "Das verrückte Labyinth" in Java3D nach. Ein Spielzug dabei ist, dass man einen Spielstein nimmt und an einer beliebigen Stelle im Brett einschieben kann, wobei ein neuer Spielstein für die nächste Runde frei wird. Das Picking und auch das reine Verschieben klappt tadellos, ich möchte es aber gerne animiert darstellen und komme mit dem Alpha-Objekt nicht ganz klar.
Es soll eine Animationsfolge entstehen:
1. Neuer Spielstein wird über einen TransparencyInterpolater eingeblendet
2. Die Spielsteine aus der Reihe des quadratischen Spielbretts werden verschoben.
3. Der überflüssige Spielstein wird wieder ausgeblendet.
Das Einblenden funktioniert auch schon, aber nur dann, wenn im Alpha-Objekt der Loop-Count auf -1 oder einem Wert über 3 oder 4 steht. Die Animation soll aber nur einmal ausgeführt werden. Ich habe versucht mit den anderen Werten rumzuspielen, insbesondere mit der Verzögerung vor und nach dem triggern, aber irgendwie bekomme ich kein gutes Gefühl für richtige Einstellungen. Was läuft da verkehrt?
Als zweite Frage, würde ich gerne wissen, wie ich mehrere Animationen hintereinander ausführen kann. Also, wie kann ich sicherstellen, dass die nächste Animation erst gestartet wird, wenn die vorige beendet wurde. Und natürlich soll auch das Picking und der gesamte Spielverlauf quasi unterbrochen werden. Ich habe es mit der Alpha-Funktion finished() probiert, weiß aber nicht, ob das die korrekte Herangehensweise ist.
Hier der Quellcode:
Java:
private void playGangfeldAnimation(HashMap<String, Gangfeld> arg1) {
BranchGroup objRoot = new BranchGroup();
GangfeldBG pos = this.getGangfeldBG(arg1.get("Position")); // Position des einzuschiebenden Feldes
GangfeldBG field = this.getGangfeldBG(arg1.get("Einschub")); //Einzuschiebendes Feld
// Position wird auf transparent gesetzt
for(Appearance app : pos.getAllAppearence(pos)) {
app.setTransparencyAttributes(new TransparencyAttributes(TransparencyAttributes.BLENDED, 1f));
}
// Einzuschiebendes Feld wird eingeblendet
Alpha alpha = new Alpha(1, Alpha.DECREASING_ENABLE, 0, 10000, 5000, 0, 1000, 5000, 0, 1000); //TODO
TransparencyAttributes target = new TransparencyAttributes(TransparencyAttributes.BLENDED, 1.0f);
target.setCapability(TransparencyAttributes.ALLOW_VALUE_WRITE);
TransparencyInterpolator transInt = new TransparencyInterpolator(alpha, target);
transInt.setSchedulingBounds(new BoundingSphere());
transInt.setMinimumTransparency(1f);
transInt.setMaximumTransparency(0f);
for(Appearance app : field.getAllAppearence(field)) {
app.setTransparencyAttributes(target);
}
objRoot.addChild(transInt);
objRoot.addChild(field);
this.getTrans(pos).addChild(objRoot);
int i=0;
while(!alpha.finished()) i++;
System.out.println(i);
}