Home > Code > Java FX > Balls

Balls

Geschrieben von admin on July 27, 2010

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 »