2010年7月25日日曜日

VideoCube 5

さて。

細かい話は飛ばして、Styleの中にFaceが6個定義されていて、そのうち1つはstartVideoURL、その他は何もセットされてないので、くるくるアニメーションが動くことになるはずだが、まだ具体的に理解できていない。errorという変数の名前がよくないと思う。自分本位に言えば、errorは恐らくnoMediaとかになるべきで、場合によってはerrorはerrorで必要かもしれない。

次はFaceだが、その前に、Stageの下にコードがある。rotationである。こうやってコードがあちこちにあると、なんだよなあってことになる。そこでStageの上に移動。ついでに先頭(importの下)にあったdefも軒並みclassの下に持ってきて、あれ。エラー? なんとdefをclassの中でbindしてるじゃないか。とりあえず変数はclassより後で宣言しても問題ないが、そういう問題じゃないほうが問題ではないのか。classの中で何処に有るともわからんちんの変数をbindしたらってことは、あ〜クラス変数ってこと? でもないか。そもそもJavaFXにクラス変数は無いようだが、現時点では定かでない。とにかく、相対的にクラスよりグローバルな変数にbindできるということは便利だというか、そうできないと困ることが多そうだし。まあ現時点では作法的な問題は無視できるので、置いておこう。ただもう少しbindの位置関係が分かりやすい方法というか、混乱しないうまい方法があれば、良いと思う。

話は飛ぶが、マウスポインタの解説を読ませていただいて、気づいたこと。

マウスポインタの位置を取得するには次のようにすると良い。

var point:PointerInfo = MouseInfo.getPointerInfo();
var x: Number = point.getLocation().x;
var y: Number = point.getLocation().y;

ここでJava知らずな私としては、MouseInfo.getPointerInfo()のインスタンスは何処にいるのか?と。そうすると思いつくのは「その辺にある」ということ、つまりテンポラリなものが自動的に展開されてメソッドが呼ばれ、結果としてきっとPointerInfoというクラスのインスタンスが返るのだろうと。じゃあひょっとしてx,yをいきなり取れるのかと思いたくなるのが人情というもの。

//var point:PointerInfo = MouseInfo.getPointerInfo();
var x = MouseInfo.getPointerInfo().getLocation().x;
var y = MouseInfo.getPointerInfo().getLocation().y;

本当は結果を確認するのにマウスの位置に座標を文字(背景なし)で表示したかったが、いまだそんなことがすぐ書ける訳でもなく、

println("{x},{y}");

でw。

できるじゃないですか。なるほど。でも最初MouseInfo.getPointerInfo.getLocation().x;と()なしで書いたがエラーになってしまい、getLocation().xと書かれているのを見て、あ、()要るのね、ということに気づいた。じゃ逆にgetLocationで切ったら?

var loc = MouseInfo.getPointerInfo().getLocation();
var x = loc.x;
var y = loc.y;

書けるじゃん:D
最初lこのgetLocation()が返す型が分からんと思い、ググろうとして、あ、JavaFXはデフォルト省略できるから・・といきなり=してみると、おお、うまくいくじゃないかすごいすごい。おまけにvar x = loc.とドットを打ったところでコード補完が表示され、java.awt.Pointらしいということも判明。今回は特にコードを書くことの直接の役には立ってないが、理解が深まるという点で大いに役に立ったし、とても助かった。やるなNetBeans、いつかDogBeansを作ってやろうという野望が再燃したことは言うまでもない。

気になるのはどの書き方が良いのかというより、マウス座標のx,yは同時に同じ座標を指してなければならないのは言うまでもないので、xとyが別々の座標、つまりxを取ってる間にマウスが動いてからyを取ってしまうことの無いよう気をつけたい。今回のようなケースではまず起こり得ないだろうが。

0 件のコメント:

コメントを投稿