JavaFX – Wusel Hack

JavaFX wird wohl irgendwann in der Zukunft mal die Art neu definieren, wie man mit der Java Familie GUIs baut. Das Previewrelease ist noch sehr pre Alpha. So gibt es derzeit kein Konzept für große Integer (long, BigInt) und die Anbindung an Java oder EJB Applikationen ist sehr rudimentär. Nichts desto trotz kann man damit wirklich angenehm leicht kleine Grafikprogrämmchen bauen. Da fühlt man sich gleich an die Zeit am alten Atari zurückversetzt.

Hier aus der Zeit dann auch ein kleines Programm, wo viele kleine schwarze Kugeln eine große rote Kugel jagen. Have Fun 😉

Mit WebStart ausführen

/*
 * Wusel.fx
 *
 * Created on 29.09.2008, 17:51:08
 */

package wusel;

import java.lang.Math;
import javafx.scene.*;
import javafx.scene.paint.*;
import javafx.scene.geometry.*;
import javafx.application.*;
import javafx.scene.transform.*;
import javafx.input.*;
import javafx.animation.*;
import java.lang.System;

/**
 * @author tschuett
 */

var WIDTH=800;
var HEIGHT=800;
var FOLLOWERS=200;

class Position {
    attribute x: Integer;
    attribute y: Integer;
}

class Target {
    attribute pos : Position;
}

class Follower {
    attribute target : Target;
    attribute direction: Number = Math.random() * Math.PI * 2;
    attribute pos: Position;
    attribute speed: Integer = 1;
    attribute maxSpeed: Integer =
    10 + (5 * Math.random()) as Integer;
    attribute turnSpeed =  Math.PI / 10;
    private attribute lockAngle = turnSpeed;
    private attribute lastDist: Number = 1E99;

    function move() {
        var dx = target.pos.x - pos.x;
        var dy = target.pos.y - pos.y;
        var dist = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy,2));
        var angle =  Math.atan2(dy, dx) - direction ;
            if (
        speed < maxSpeed and lastDist > dist) {
                speed++;
        } else if( lastDist < dist and speed > 2)
        {
                speed--;
        }
        lastDist = dist;
            if (
        Math.abs(angle) < lockAngle) {
            direction += (
            Math.random() * turnSpeed * 2 - turnSpeed);
        } else if (angle < 0 or angle > Math.PI) {
            direction -= turnSpeed;
        } else {
            direction += turnSpeed;
        }
        direction = direction mod (Math.PI * 2.0);

        pos.x += (speed * Math.cos(direction)) as Integer;
        pos.y += (
        speed * Math.sin(direction)) as Integer;
    }
}

var t = Target {
    pos: Position {x:WIDTH / 2 ; y:HEIGHT / 2 }
}

var followers =
for(i in [0..FOLLOWERS]){
    Follower{
        target: t
        pos: Position {
            x:0;
            y:0;
        }
    }
}
Frame {
    visible: true
    width: WIDTH height: HEIGHT
    title: "Wusel"
    resizable: false
    closeAction: function (){
        System.exit(0);
    }
    stage: Stage {
        fill: Color.WHITE
        content: [
            Rectangle {
                x: 0, y: 0
                width: WIDTH, height: HEIGHT
                fill: Color.WHITE
                onMouseClicked:function(e:MouseEvent){
                    System.exit(0);
                }
                onMouseMoved: function (e:MouseEvent){
                    t.pos.x =
                    e.getStageX() as Integer;
                    t.pos.y =
                    e.getStageY() as Integer;
                }
            },
            for (f in followers){
                Circle {
                    centerX: bind f.pos.x , centerY: bind f.pos.y
                    radius: 2
                    fill: Color.BLACK
                }
            },
            Circle {
                centerX: bind t.pos.x , centerY: bind t.pos.y
                radius: 5
                fill: Color.RED
        }]
    }
}
var anim = Timeline { keyFrames: [
        KeyFrame { time: 20ms
            action: function(){
                for (f in followers){
                    f.move();
                }
            }

        }]
    repeatCount: Timeline.INDEFINITE
};
anim.start();

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *


+ 6 = neun