Schneller Start

Ok, ich gebe zu, ich bin ein bisschen altmodisch. Alle Welt benutzt Ubuntu (ich habe es neulich mal probehalber installiert und es ist cool) und ich sitze seit ewig und drei Tagen auf meiner Fedora.
Normalerweise ist es wirklich keine gesonderte erwähnung wert aber der Bootprozess von der neuen Fedora 10 ist einfach nett. Das geht so rattenschnell. Einfach nur nett.
Ok, spätestens mit dem nächsten Release werden das alle Linux Distributionen haben – aber im Moment macht das mein altes Fedora endlich mal wieder cooler als den Rest der Welt 🙂

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();