package ballthrowingon3d; import javafx.animation.KeyFrame; import javafx.animation.Timeline; import javafx.scene.CustomNode; import javafx.scene.effect.GaussianBlur; import javafx.scene.Group; import javafx.scene.Node; import javafx.scene.paint.Color; import javafx.scene.paint.RadialGradient; import javafx.scene.paint.Stop; import javafx.scene.shape.Circle; def gravity: Number = 4.0; var count = 0; var animate = true; def z0 = 100.0; var xscale = 1.0; var yscale = 1.0; var x_ = 100.0; var y_ = 100.0; var c = 0.0; public class BallInSpace extends CustomNode { public var x: Number = 100; public var y: Number = -100; public var z: Number = 100; public var ySpeed: Number = -40; public var zSpeed: Number = 5; public var timeline_g = Timeline { repeatCount: 130 keyFrames: [ KeyFrame { time: 100ms action: function():Void { if(animate == true) { motion(); c = c + 2; } if(animate == false ) { reset(); motion(); } } } ] } public function reset() { c = 0.0; x = 100; y = -100; z = 100; count = 0; x_ = 100; y_ = 100; xscale = 1.0; yscale = 1.0; ySpeed = -40; zSpeed = 5; animate = true; } public function motion() { if (animate == false) { return; } count++; z += zSpeed; x+=0; y += ySpeed + (gravity * count) + 4; if (y >= 0) { ySpeed= - (ySpeed + (gravity * count)); y+= 2 * (ySpeed) ; count=0; if(y >= 0){ animate=false; } } calculate3DPos(); } function zScale (z:Number) { var scale = z0 / (z0 + z); return scale; } function calculate3DPos () { x_ = (x) * zScale(z) / 100 + x; y_ = (y) * zScale(z) / 100 + y; y_ = y_ - 1 ; xscale = zScale(z); yscale = zScale(z); } public override function create(): Node { return Group { content: [ Circle { effect: GaussianBlur { radius: 60 } translateX: 200 translateY: bind -c *1 centerX: bind x_, centerY: bind 500 scaleX: bind xscale scaleY: bind yscale radius: 30 fill: Color.BLACK } Circle { translateX: 200 translateY: bind y_ - c * 1 centerX: bind x_, centerY: bind 500 scaleX: bind xscale scaleY: bind yscale radius: 30 fill: RadialGradient { centerX: 0.25 centerY: 0.25 stops: [ Stop { color: Color.WHITE offset: 0.0 }, Stop { color: Color.DARKGREEN offset: 1.0 }, ] } }, ] }; } }