In JavaFX 1.3 the evaluation of the KeyValues in the Timeline changed. Now, the KeyValues are evaluated once before the Timeline starts (see "Animation: Changed semantics of KeyValue evaluation" in Java FX 1.3 Migration Guide) and thus my Duke Anim doesn’t work in Java FX 1.3 :(. To correct it, the function Timeline.evaluateKeyValues() has been added. This function has to be used for re-evaluates all the keyValues when it is called. Now, let us correct Duke Anim :)
To correct Duke Anim, I have made only 2 changes:
· I call the function Timeline.evaluateKeyValues() at the end of the action function of KeyFrame at 1s.
anim.evaluateKeyValues();
· And I declare the variable anim with his type to be able to call the function Timeline.evaluateKeyValues() in the action function of the KeyFrame.
public var anim:Timeline = Timeline { …
This Duke Anim's version works on : Windows (Seven), Linux (Ubuntu 9.10) and Mac OS X (10.6.3) with the Default toolkit and the Prism toolkit (JVM argument: -Xtoolkit prism)
package dukeanim;
import java.util.Random;
import javafx.animation.Interpolator;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.Scene;
import javafx.scene.transform.Translate;
import javafx.runtime.ConditionalFeature;
import javafx.runtime.Platform;
import javafx.stage.Stage;
class DukeAnimModel {
public var imageURL = "{__DIR__}images/duke.png";
public var x = 0;
public var y = 0;
var xTarget = 0;
var yTarget = 0;
var xTemp = 0;
var yTemp = 0;
public var anim:Timeline =
Timeline {
autoReverse: false
keyFrames: [
KeyFrame {
time: 0s
values: [x => xTemp, y => yTemp]
},
KeyFrame {
time: 1s
values: [x => xTarget tween
Interpolator.SPLINE(0,.5,.5,1),y => yTarget tween
Interpolator.SPLINE(0,.5,.5,1)]
action: function(): Void{
var generator = new Random();
xTarget = (generator.nextFloat() * 240 + 1) as Integer;
yTarget = (generator.nextFloat() * 320 + 1) as Integer;
xTemp=x;
yTemp=y;
anim.evaluateKeyValues();
}
},
]
repeatCount: Timeline.INDEFINITE
};
}
println("Effect enabled: {Platform.isSupported(ConditionalFeature.EFFECT)}");
println("Input Method enabled: {Platform.isSupported(ConditionalFeature.INPUT_METHOD)}");
println("Scene 3D enabled: {Platform.isSupported(ConditionalFeature.SCENE3D)}");
println("Shape Clip enabled: {Platform.isSupported(ConditionalFeature.SHAPE_CLIP)}");
var dukeAnimModel = DukeAnimModel {}
dukeAnimModel.anim.play();
Stage {
title: "Application title"
width: 240
height: 320
scene: Scene {
content: ImageView {
transforms: Translate {
x: bind dukeAnimModel.x
y: bind dukeAnimModel.y
}
image: Image {
url: dukeAnimModel.imageURL
}
}
}
onClose: function(){
println("exit");
}
}