JavaFXが段々楽しくなってきた。

というより、"淡々粛々ドキュメント書く自分自身から現実逃避するために、久しぶりにいじった"から楽しく感じたんだろう(;・∀・)


ねこび〜んがパタパタするやつ(コレ↓)ベースに、デスクトップマスコットが出来た。
http://d.hatena.ne.jp/images/diary/G/GENS/2008-07-17.gif


ニコニコにあった「もやしもんのスクリーンセーバー作った」の、2D/一匹な劣化版。
複数匹には出来るけど、まずは公開できるようにとアプレット勉強中。


Java SE 6 Update 10でWindowsでも透明に出来るようになったのね。
JNAのライブラリで無理くりやってたのが、簡単に。ヽ(*´∀`)ノ
JNAのメーリングリストで「Update10でネイティブ対応するぜ」って聞いてRC1を入れたけど、Netbeansが起動直後に落ちるようになったも昔。
正式リリースはさすがに安定してる。


透明フレームはコチラで情報を。
非矩形フレーム、あるいは透明フレーム



以下、アレなコードだけど一応ソース

import javafx.animation.Timeline;
import javafx.animation.KeyFrame;
import javafx.scene.image.*;
import javafx.application.Frame;
import javafx.application.Stage;
import javafx.application.WindowStyle;

import javax.imageio.ImageIO;
import java.net.URL;


var imageRA = readImage("{__DIR__}/../img/neko_happy_ra.gif");
var imageRB = readImage("{__DIR__}/../img/neko_happy_rb.gif");
var imageLA = readImage("{__DIR__}/../img/neko_happy_la.gif");
var imageLB = readImage("{__DIR__}/../img/neko_happy_lb.gif");

var random = new java.util.Random;
var scr = Screen.getSize();
var xmax : Integer = scr.width;
var ymax : Integer = scr.height;
var x : Integer = xmax/2;
var y : Integer = ymax/2;
var xaxis : Boolean = getRandomBoolean();
var yaxis : Boolean = getRandomBoolean();

var image  : Image;
var imageA : Image;
var imageB : Image;
if (xaxis==true) {
    imageA = imageLA;
    imageB = imageLB;
} else {
    imageA = imageRA;
    imageB = imageRB;
}

var frame = Frame {
    x: bind x
    y: bind y
    width: 40
    height: 30
    windowStyle: WindowStyle.TRANSPARENT
    visible: true
    stage: Stage {
        fill: null
        content: [
             ImageView {
                width: 40
                height: 30;
                image: bind image
            }
        ]
    }
};
frame.window.setAlwaysOnTop(true);

var timeline : Timeline = Timeline {
    repeatCount: Timeline.INDEFINITE
    keyFrames : [
        KeyFrame {
            time : 40ms                    
            action : function(): Void  {
                if (xaxis==false) {x=x+2;}
                else {x=x-2;}

                if (yaxis==false) {y++;}
                else {y--;}

                if (x>=xmax) {x=0;}
                else if (x<0) {x=xmax;}

                if (y>=ymax) {y=0;}
                else if (y<0) {y=ymax;}
            }
        }
    ]
};
timeline.start();

var direction : Timeline = Timeline {
    repeatCount: Timeline.INDEFINITE
    keyFrames : [
        KeyFrame {
            time : 5000ms
            action : function(): Void {
                //var random = new java.util.Random;
                var i : Integer = random.nextInt(3);
                if (i==1) {
                    if (xaxis==true) {
                        xaxis=false;
                        imageA=imageRA;
                        imageB=imageRB;
                    }
                    else {
                        xaxis=true;
                        imageA=imageLA;
                        imageB=imageLB;
                    }
                }
                if (i==2) {
                    if (yaxis==true) {yaxis=false;}
                    else {yaxis=true;}
                }
            }
        }
    ]
}
direction.start();

var animation : Timeline = Timeline {
    repeatCount: Timeline.INDEFINITE
    keyFrames : [
        KeyFrame {
            time : 200ms
            action : function(): Void {
                if(image==imageA) {image=imageB}
                else {image=imageA}
            }
        }
    ]
}
animation.start();

private function readImage(url : String) : Image {
    var bufImage = ImageIO.read(new URL(url));
    var image = Image.fromBufferedImage(bufImage);
    return image;
}

private function getRandomBoolean() : Boolean {
    var i = random.nextInt(2);
    if (i==0) {return true;}
    else {return false;}
}