2010年8月12日木曜日

VideoCube Final

やっと終わり。OpenOfficeで書いた内容を転記するのにこんなに時間がかかるとは思わなかった。

ということで、なかなかまとまらないが、3D展開は除いて、大体の作りと雰囲気は分かった。JavaFXで感覚的に不思議なのは、プロパティなのか変数なのか、その違いが基本的にないのだと思うが、初期化のみ可とかいうアクセス(識別子)があったりする辺り。値をセットしてるのに=じゃなく:で良かったり。それに直にインスタンスを生成する場合、後からそれを変更しようと思ってもできない。やり方があるのかもしれないが、今は変数にしておくか、変更したい変数に別な変数をbindして後でその変数を変えるかの何れかにしている。

Stage {
title: "Application title"
scene: Scene {
width: 250
height: 80
content: [
Text {
font: Font {
size: 16
}
x: 10
y: 30
content: "Application content"
}
]
}
}

おなじみの新規プロジェクトで生成されるMain.fxのコード。

var mstage = Stage {
title: "Application title"
scene: Scene {
width: 250
height: 80
content: [
Text {
font: Font {
size: 16
}
x: 10
y: 30
content: "Application content"
}
]
}
}

これを変数に代入しておくと、

mstage.title = "後から変更したタイトル。特に意味はないけど。";
var mtexts = mstage.scene.content[mnode | mnode instanceof Text];
for (mnode in mtexts)
{
var mtext:Text = mnode as Text;
mtext.content = "new text({mtext})";
}

のように後からstage.titleやscene.contentが使える。とはいえ、突然降って湧いたようなシーケンスの抽出だが、いろいろ調べているうち、こうなった。最初はこう。

for ( mnode in mstage.scene.content)
{
var mtext:Text;
if ( mnode instanceof Text)
{
mtext = mnode as Text;
mtext.content = "new text{mtext}";
}
}

こっちのほうが速そうだが、switchが使えない不満をシーケンスの抽出で紛らわせてみた。シーケンスについてはこちらを参考にさせて頂いた。ありがとうございます。

実は最初、contentの中のTextを選び出すのに自分のクラスが何かを調べる方法-instanceof-が分からなくて、"Javafx クラス 調べる"だとヒットせず、"java クラス 調べる"で引いてinstanceofを得、"javafx instanceof"でようやく。ちなみにこちらの演算子一覧表がわかりやすい。ありがとうございます。

instanceofか。なんで演算子なんだーjava。どう考えてもクラス名っていうのは自分のプロパティだと思うが。つまりオブジェクトの要素であって、なんならクラスに属するぞオブジェクトであってもいいぐらい。というより演算子というマジックに幻惑されるだけで、printlnみたいなJavaFX内蔵関数みたいに思っておけばいいのか。


エルサルバドルうまい! 難を言えばちょっと薄い。濃いめに入れても変わんなそうだけど一応やってみよう次回。ゆえに非常にあっさりしていて豆そのものに比べてナッツの風味はとけ込んでおらず、クランベリーのような酸味の中に果実特有のさわやかさが顔をのぞかせる。


つまり、if (isInstance(mnode,"Text"))やif(mnode.className == “Text”)(※これは便宜上勝手に書いてるだけ) と if ( mnode instanceof Text )との違いしかなく、後者(演算子)の方が短い。わかる、わかるよそれは。しかもinstanceofがメッセージっぽくて良い。isInstanceOfなら尚。わかる、それもわかる。例え的外れだとしても。でもね、節操とか、統一性とか、あると思うわけですよ。何が故の演算子か。やはりそれは数学的背景なんかが望まれるわけで、むしろそういったものは関数ライブラリ〜とかいってクラスライブラリだったり関数ライブラリだったりしているのが現状ではないか。実際、演算子で算術っぽくないのはjavaならinstanceofとlength(javafxはsizeof)、javafxでさらにreverseとindexofがあるだけ。こうしたことに答えてくれるinside java & the FXみたいな本が(できればWeb連動で)出版されると嬉しい。

さて話を本当に戻してまとめよう。

1. 定周期処理はTimelineで書ける。
2. イベントハンドラはonMouseClickedのようにプロパティ(的な変数)になっている。なんかcssの擬似クラスみたい。


(2010.8.14追記)
というより、関数ポインタだと思えばいい話だった。この辺、このプロパティっぽく感じるところへの何かこう、勘違いが拭いきれないが、それも徐々に薄らいでいると思う。要するに馴染みの問題で、馴染んできているということではなかろうか。
(2010.8.14追記)


3. プロパティの変化捕捉みたいな処理はon replaceで書ける。変数全般で書けるのが偉い?
4. bindは対象となる変数が変化したら再評価される。※1
5. PerspectiveTransformとCustomNodeは相性が悪いのか、マウスイベントが拾えなくなる。あ、Windowsで試してないじゃん。

これだけ分かれば後は3D->2Dの座標変換が分かればVideoCubeは書けるはずだ。

他に、

6. 何気に派生クラスを作ることは何となく分かっていた。
7. CustomNodeは抽象クラスなのでcreateのoverrideが必須なのもいつの間にか知っていた。

(2010.8.16追記)createはoptionの間違いだった。children変数が空な場合。APIリファレンスにあるようにchildren(Nodeのシーケンス)に設定がthe preferred choiceなので好ましい、ということのようだ。(2010.8.16追記)

8. Stage、SceneときてSceneのcontentの配列にオブジェクトを入れていくというのも、何となくわかっていた。
9. Scene.contentは先に入れた方が下になって表示されるのは動かしてみて一目瞭然だったが、zオーダのようなレイヤというか重ね位置制御が出来るのかは知らない。zオーダはVBから来ている知識。

(2010.9.26追記)zオーダではないが、deleteしてinsert after(またはbefore)を使えば近いことができるかもしれない。実際に試してはいない。公式チュートリアルにて。順番はともかく、シーケンスに入れたり出したりしようと思っていることがあって、ここに追記しておく次第。(2010.9.26追記)

とか、細かいことで、

10. Timelineはplay、pauseで実行(動作)を制御できる。
11. keyFrames: [at(0s) { var1 => 90; var2 => 0 }]みたいな省略記法がある。
12. JFileChooserは難しいことをしなければ恐ろしく簡単に使える。

などがあった。

※1 いろいろbindについてはこちらの記事が非常に詳しい。ありがとうございます。バウンド関数やオブジェクトのbindの注意事項(毎回インスタンスが生成される)など、VideoCubeでは見えてこない話も満載。特にMVCという観点からbindの必要性、重要性を説明されている点は見逃せない。MVCやデザインパターンとはできるだけ距離を置きたい派※2な自分にも結構効く。

※2 というよりプログラミングと距離を置きたい派

0 件のコメント:

コメントを投稿