Balls
Erstellen von Oberflächenelementen und Schaltflächen, Laden einer Hintergrundgrafik, Verläufe, einfache Animation, feststellen, ob Objekte sich überschneider oder den Rand berühren.
Bitte die Kommentare im Quellcode beachten.
package herberlin;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.paint.RadialGradient;
import javafx.scene.paint.Stop;
import javafx.scene.CustomNode;
import javafx.scene.Node;
import javafx.animation.Timeline;
import javafx.animation.KeyFrame;
import javafx.scene.image.ImageView;
import javafx.scene.image.Image;
import javafx.scene.control.Slider;
import javafx.util.Math;
// Definiert die Farben der Bälle
var colors = [
Color.DARKGREEN,
Color.CHOCOLATE,
Color.AQUAMARINE,
Color.AZURE,
Color.BROWN,
Color.DARKTURQUOISE,
Color.CORAL,
Color.DARKBLUE];
// Erzeuge Bälle, setze Position und Farbe
var balls: Ball[] =
for (i in [1..10]) {
println(i mod colors.size());
Ball {
x: i * 30
y: i * 30
color: colors[i mod colors.size()]
};
};
// Erzeuge den Slider für die Geschwindigkeit
var speed = Slider {
min: 1
max: 30
vertical: false
value: 3
}
// Erzeuge den Slider für die Ballgröße
var ballSize = Slider {
min: 2
max: 50
vertical: false
value: 10
translateY: 15
}
// Erzeuge die Stage
Stage {
title: "Balls"
// Scene
scene: Scene {
width: 640
height: 480
content: [
// Hintergrundbild
ImageView {
image: Image {
url: "{__DIR__}Forest.jpg"
}
},
// Bälle
balls,
// Slider
speed,
ballSize
]
}
}
// Timeline sorgt für Animation
Timeline {
repeatCount: Timeline.INDEFINITE
// definiere KeyFrames mit Action
keyFrames: [
KeyFrame {
time: 30ms
action: function () {
for (b in balls) {
b.move();
}
}
}
]
}.play(); // starten
// Sichtbare Objecte erweitern CustomNode
class Ball extends CustomNode {
// Position
var x: Number;
var y: Number;
// Geschwindigkeit an den Slider-Wert gebunden
var tempo = bind speed.value;
// Richtung als Geschwindigkeit horizontal / vertikal
var sigX = 1.0;
var sigY = 1.0;
// Radius an der Slider Wert gebunded
var radius = bind ballSize.value;
var color: Color = Color.BLUE;
// Überschreibe create() um den Ball zu zeichnen
// Erzeugt ein Node und gibt es zurück
public override function create(): Node {
return Circle {
// position
centerX: bind x
centerY: bind y
// radius
radius: bind this.radius
// Füllung
fill: RadialGradient {
centerX: 0.5
centerY: 0.5
focusX: 0.2
focusY: 0.2
radius: 1
stops: [
Stop {
color: Color.BISQUE
offset: 0.0
},
Stop {
color: color
offset: 1.0
},
]
}
}
}
// Wird aus der Timeline aufgerufen, erzeugt Bewegung
function move() {
// Verschieben horizontal + vertikal
x = x + (sigX * tempo);
y = y + (sigY * tempo);
// Kollision mit anderen Bällen führt zur Richtungsänderung
for (b in balls) {
if (intersects(b.boundsInParent)) {
if (b != this) {
sigX = Math.sin((x - b.x) / radius);
sigY = Math.sin((y - b.y) / radius)
}
}
}
// Kollision mit Fenterbegrenzung
if (x > scene.width) {
sigX = -1;
}
if (x < 0) {
sigX = 1;
}
if (y > scene.height) {
sigY = -1;
}
if (y < 0) {
sigY = 1;
}
}
}
Comments:
Sie müssen angemeldet sein um eine Nachricht zu erstellen. Anmelden »