JavaFXが段々楽しくなってきた。
というより、"淡々粛々ドキュメント書く自分自身から現実逃避するために、久しぶりにいじった"から楽しく感じたんだろう(;・∀・)
ねこび〜んがパタパタするやつ(コレ↓)ベースに、デスクトップマスコットが出来た。
ニコニコにあった「もやしもんのスクリーンセーバー作った」の、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;} }