Home > Code > Java FX > Hearts

Hearts

Geschrieben von admin on July 28, 2010

Java Fx:

Erstellen von aktiven Elementen, Maus-Interaktion, 

Bitte die Kommentare im Quellcode beachten.

package herberlin;

import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.paint.LinearGradient;
import javafx.scene.paint.Stop;
import javafx.scene.paint.Color;
import javafx.scene.Group;
import javafx.scene.shape.QuadCurve;
import javafx.scene.paint.RadialGradient;
import javafx.scene.CustomNode;
import javafx.scene.Node;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.util.Math;
import javafx.scene.shape.Rectangle;
import javafx.stage.Screen;
import javafx.scene.effect.DropShadow;

// Definiere Farbverlauf für das Herz
var fill = RadialGradient {
            centerX: 0.5
            centerY: 0.5
            focusX: 0.6
            focusY: 0.3
            radius: 1
            stops: [
                Stop {
                    color: Color.BISQUE
                    offset: 0.0
                },
                Stop {
                    color: Color.RED
                    offset: 1.0
                },
            ]
        };
// initialisiere Herzen im Array
var hearts: Heart[];

for (i in [0..12]) {
    hearts[i] = new Heart();
}
// Herzen referenzieren Vorgänger
for (i in [12..0 step -1]) {
    hearts[i].heart = hearts[i + 1];
    println("H{i}: {hearts[i]} h-1: {hearts[i+1]}");
}

// Global: Mausposition
var mouseX=0.0;
var mouseY=0.0;

Stage {
    title: "MouseFollow"
    scene: Scene {
        // Scene-Hintergrund
        fill: LinearGradient {
            startX: 0.0
            startY: 0.0
            endX: 0.0
            endY: 1.0
            stops: [
                Stop {
                    color: Color.RED
                    offset: 0.0
                },
                Stop {
                    color: Color.DARKOLIVEGREEN
                    offset: 1.0
                },
            ]
        }
        width: 640
        height: 480
        content: [

            // Hintergrundrechteck erforderlich, um die Mausposition
            // zu bekommen; läßt sich nicht direkt an der Stage festmachen!
            Rectangle {
                width: Screen.primary.visualBounds.width;
                height: Screen.primary.visualBounds.height;
                fill: Color.TRANSPARENT
                onMouseMoved: function (ev) {
                    mouseX = ev.x;
                    mouseY= ev.y;
                    // println(ev);
                }
            }

            // Herzen 
            hearts
        ]
    }
}

// Timeline mit keyframe - Action
Timeline {
    repeatCount: Timeline.INDEFINITE
    keyFrames: [
        KeyFrame {
            time: 100ms
            action: function () {
                for (heart in hearts) {
                    heart.doAction();
                }

            }
        }
    ]
}.play(); // starten

// Herz erweitert CustomNode
class Heart extends CustomNode {

    // Vorgänger
    public var heart: Heart;
    // Größe für pulsieren
    var myFactor = 0.0;

    // wird von der Timeline aufgerufen;
    // definiert Verhalten 
    public function doAction(): Void {
        // gewünschte Bewegung horizontal / vertikal
        var dX = 0.0;
        var dY = 0.0;
        // orientiert sich am Vorgänger
        if (heart != null) {
            dX = (this.translateX - heart.translateX + 10) / 5;
            dY = (this.translateY - heart.translateY) / 5;
        } else {

            // orientiert sich  an der Maus
            dX = (this.translateX - mouseX + 50) / 3;
            dY = (this.translateY - mouseY + 50) / 3;
        }
        // Bewegung berechnen
        this.translateX -= dX;
        this.translateY -= dY;
        // Größenänderung
        myFactor += 0.2;
        this.scaleX = Math.atan(0.1 + (Math.abs(dX) + Math.abs(dY)) / 20) + Math.abs(Math.sin(myFactor) / 5);
        this.scaleY = scaleX;
    }

    // create überschreiben, um das Erscheinungsbild des Objekts
    // zu definieren
    // (gibt Node zurück)
    public override function create(): Node {
        return Group {
                    content: [
                        // linker Bogen
                        QuadCurve {
                            startX: 50.0 startY: 60.0
                            endX: 50.0 endY: 20.0
                            controlX: 0.0 controlY: 0.0
                            fill: fill
                        },
                        // rechter Bogen
                        QuadCurve {
                            startX: 50.0 startY: 60.0
                            endX: 50.0 endY: 20.0
                            controlX: 100.0 controlY: 0.0
                            fill: fill
                        }
                    ]
                    // umgebendes Leuchten
                    effect: DropShadow {
                        offsetX: 0
                        offsetY: 0
                        color: Color.ORANGE
                        radius: 50
                    }
                }
    }
}

Comments:

Sie müssen angemeldet sein um eine Nachricht zu erstellen. Anmelden »

Tags