バタバタしていて詳しく読めてないですけど、wonderflと連動しているのだそうです。詳しくはこちらをどーぞ。
大人の科学 x wonderfl – wonderflが釣り堀に!魚釣りゲームをつくろう
そういや、釣り堀来月潰れるから、明日とかまた行きたいんだけどな。
それどころじゃないか・・・。ムハ
タグ: flash
プロトタイプやらスケルトンを急ぎで作りたいときに、まれにfl.controls系を使いますが、配置の際に高さの問題がでてきて、いつも忘れてバタバタするのでメモ。
fl.controls系でテキストフィールド(textArea)を内包しているコンポーネントは高さが100pxになる。変数で配置して行く場合など非常にうっとおしいことになる。単体でのheightはoverrideされて見た目の高さを取得できるが、親DisplayObjectのheightは100px。ちなみにgetRectだと単体でも100になる。これはoverrideされていないらしい。(半端だ)
これの原因は大概コンポーネントの中に含まれるtextAreaで、autoSizeがカマされてない素の状態でaddChildされているのかheight=100である。fl.controls.TextInputだと以下のような感じで調整してやれば最適な高さになる。
ただfl.controls.ComboBoxとかだと階層化していてめんどくさいので、
な感じでやっちゃう。
全部試したことがないので、NGなコンポーネントもあるかも知れないけど。
ということでメモ
A、B、・・・Cである・・・
Beyond Interaction ―メディアアートのためのopenFrameworksプログラミング入門
本書は、インタラクションデザインやメディアアートの現場で現在最も注目されている制作環境、「openFrameworks」の世界初の解説書です。 openFrameworksというC++のフレームワークを使用して、プログラミングの初歩から高度な応用まで、具体的なサンプルを作成しながら実践的に学んでいくことを目的にしています。プログラミングの経験のない初心者から、メディアアートに興味を持ち自分で何かを作りたいと考えている方、 ProcessingやFlashなど他の環境は経験しているがより強力なプログラミング環境を探し求めている方まで、多くの方々にとって有益な情報を提供しています。
来週発売だそうです。
ちなみに最初に覚えた言語はFortran。
覚えたいものが多くて
おじいさんにはしんどいですね。
UNOのプロレスゲームもそうですが、こういう対戦ものにはまります。
城戸さん、カイブツさん、かんたさん関係ということです。
WEBがどうこうというよりもゲームとして面白いです。
ということでブログパーツを貼ってみる。
32 ビットを超えたときのuintの挙動
32bitを超えた値だと、超過部分が-1に変化してしまう。
つまりこんな挙動になる。
実行結果
0 @ 4294967295
1 @ 99
2 @ 98
3 @ 198
4 @ 197
finish 197
ややこしいね。
例えば
とすると
0 @ 4294967205
1 @ 9
2 @ 8
3 @ 108
4 @ 107
finish 107
こーなる。
ああ面倒くさい。
ちなみにNumberは53 ビットまで使用可能なので、Numberで計算するとこんな感じになる。
最後にuintに変換した部分は、また超過部分が-1で演算されるので答えは同じになってしまうけど・・。
0 @ 4294967205
1 @ 4294967305
2 @ 8589934600
3 @ 8589934700
4 @ 12884901995
finish 12884901995
to uint = 107
再コンパイル無しでのプレビュー機能。
すげーほしい。
ほしくね?
オラめっさ欲しいわ
SecurityDomain周り
SecurityDomainで諸々メモ。(まだ間違っている部分があるかもしれない)
条件
・セキュリティポリシーファイルを読込先サーバに配置できない
として、どーやってそのサーバに配置されているソースを読み込むか?ということでProxyのような働きをするswfを用意し、それを介して読込先サーバのリソースにアクセスしてみるようなかんじ。
・Security.allowDoaminの設定。
Security.allowDoamin(“*”)でも良いが、危険なので
な感じで動的に設定した方がよさげ。
・LoaderContextの設定
checkPolicyFile = false;
securityDomain =null;
これらを設定するとcrossdomain.xmlを参照し、その時点で停止。
ApplicationDoaminの設定は問題ないが、Security.allowDoamin前に確認されるからか、適応されないっぽい。まぁLoaderContext無しで動くようにする必要がある。
・子swf内クラスのイベント
取得するにはdispatchを受け付けるように、親にもSecurity.allowDoaminが必要(当たり前ですが)
・子swfでのクラス定義のタイミング
ポリシーファイルが定義されている場合は、子swfの変数として
var a:hoge = new Hoge()
見たいにして定着させるが、Security.allowDoaminで開放する場合には、解放後定義しないと参照できない。つまりコンストラクタで
とした後に
new Hoge();
等と空打ちして焼き付ける。
・子swfのクラスの取得
SecurityDomainが同じ場合は、ApplicationDoamin.currentDoamin.getDefinitionでクラスを取得できるが、前述の通りSecurityDomainが異なるためApplicationDoamin.currentDoaminに子swfが含まれていない。このため
みたいに取得する。ただし、これを親クラス側で変数に代入して流用は可能。
ただし型指定をするとエラーになる。
簡単なのは子クラスを格納するクラスを作って、その中にStaticで格納するのが楽。
・Loader系
子swfで定義されたLoader拡張クラスを、親swfでgetDefinitionして取得した後は、親でインスタンス化しても使用可能。ただしcontnt等セキュリティエラーに抵当するプロパティもある。例えばBitmapDataを取得したい場合は、子swfに含まれるLoader拡張クラスの中で、BitmapData化して引き渡すなどの処理が必要。
こんなかんじ?このBtimapは親で自由に使える。Sprite系なども基本newしてしまえば自由に使えるが、SecurityDomainを超えた要素はやはりセキュリティエラーになるので注意。(この辺ローカルでは確認できないので、サーバ上で確認するしかないのだけど・・、そこが非常に面倒)
ただリダイレクト系の分散負荷のシステムだと、結局このproxySWFとそこから呼ばれるソースのIPがまた変わってしまうという延々とループな感じの挙動にってしまう。イメージやらswfやらが対象であればバイナリ化してLoadしたほうが圧倒的に楽。ただFLVの場合が・・・・汗
ということでとりあえずメモ。
結局最終的には、行ごとにTraceを書いて、どこでバグが起きているのか?を書き出している。
Progressionなら、name指定すれば良いのは分かっているが、全部のコマンドにnameを指定するのは正直しんどい。なんか勝手にそのASの何行目のコマンドだよ!とか取得して埋め込めないものだろうか?とか書いてみる。
ゴメンナサイ、ゴメンナサイ。
地道にがんばります。
さて、現実的に使うためにどーするか?ということを考えてみます。特にProgressionで・・・。
問題点としては
1)共有フォントの読み込みがドキュメントクラスのコンストラクタ前に発動してしまう。
2)ProgressionでRSLを配置するとCastDocumentの”_onInit”がロストしてしまう。
この2点をなんとか解決したいと思います。
2)はloaderInfoの”Event.COMPLETE”がRSLが存在すると発動しないというのが起因しているかと思います。(何故なのか?は不明。そもそもRSLのローディングが管理できないのでどーしていいのやら)
ということで、コチラは無理やり”CastDocument”のコンストラクタに
として、_onInitに連結します。(override出来ないから)
これに関しては諸々調べていますが、問題が発生する可能性があるので、暫定的な処理とさせてください。実際にこの手法を用いる際にはリスクがあることをご理解の上、実装してください。(今のところ問題が発生するものとしないものの2つのパターンがあることは確認していますが、明確な切り分けは出来ていません。)
一応_onInitの重複発動(Preloader経由だと”Event.COMPLETE”が発動するので)防止のために、”onInit”の最初に以下の一文を入れておく。
以前apeirophobia: 特定の文字だけを埋め込んだフォントのランタイム共有方法(AS 2.0)というエントリーを書いたけど、今度はAS3版。既出のリソースとしては
FACEs: as3:フォントのダイナミックなローディング
CS3版 フォントのダイナミックなローディング|_level0.KAYAC
あたりが有名なところ。
で、このやり方で読み込む親SWFの中に同じフォントを用いた静止テキストを配置すると、フォントが表示されなくなるという問題がある。これはPlayer8以前に見られたフォントのconflictと同じような状態(詳細はapeirophobia: 特定の文字だけを埋め込んだフォントのランタイム共有方法(AS 2.0))。恐らくフォントクラスが親SWFで先に設定されてしまうことで、外部SWFのフォントクラスが適応されないというのが理由だと思う。(そう考えるとPlayer8の原因とは違うのかもしれないけど)
簡単に検証したい人はCS3版 フォントのダイナミックなローディング|_level0.KAYACのサンプルをDLして、loader.flaのステージ上にAXIS Std Hで静的テキストを配置すると再現できます。
AS3から外部SWFのクラスアクセスはApplicationDomainの設定も絡んできて、ちょっと原因の切り分けがややこしくなっているので、検証してみました。
なんか良く分からない部分もあるのですが、とりあえず忘れないようにダラダラ書いておきます。
Flashには幾つかundocumented functionが存在するのだけど、そのうちの一つ”addFrameScript”。
存在は知っていたのだけど、今まで上手く動作せず、どーしたもんかしら?と放置していた。ちと今回どうしても使いたくなってきたので改めてClassを見てみたらこんな感じだった。
// NON-DOCUMENTED (MANUAL ADDITION)
/**
* Attach a callback method to a frame. Note that this will replace any timeline code or
* previously attached callback.
* The callback method should not expect any parameter.
* @param frameTarget frame number (starting from 0).
* @param notifyCallback method to attach.
*/
public function addFrameScript(frame:uint, notify:Function):void;
やー (starting from 0).だった。これだけで長い間放置していた・・・汗
ちなみに複数フレームに一気に追加する場合には
削除する場合には
となります。
ちなみにflashguruでは
というような記述がありますが、これは動作確認取れませんでした。
ちなみにProgressionの”ExMovieClip”クラスではループ再生制御のためにコンストラクタで
されているので、ループさせる場合等には1フレーム程多目にフレームを定義しておかないとフレームアクションが上書きされてしまいます。
Ref.FlashGuru Consulting – Undocumented Actionscript 3
Inheritance — Flash CS3
この辺ではまり中・・・・。
EventDispatcherのStatic化も面倒だ。
なんか良い解決策は無いかしら?
のアイコンを並べて配置すると押し間違えが多発する。アイコンのデティールは選択時の判別において、あまり重要で無いということを身をもって体感できる。これにpopFileやmixiのアイコンなんか並べたら更に分かりにく使いにくくできそうだ。
今回は正確に言うと検証ではなく、改造です・・・。
今後のバージョンアップ等を考えると同期が取れなくなるのでお勧めしません。実装される方は一応自己責任でお願いします。
ドキュメントには掲載されていないのですが、
jp.progression.core.managers.HistoryManager
という履歴を管理するクラスがあります。基本的にはブラウザの「戻る」「進む」ボタンに対応してシーンを遷移させる働きをしています。これを使用しているクラスとしては
jp.progression.core.managers.KeyboardManager
jp.progression.core.managers.SceneManager
jp.progression.core.ui.CastObjectContextMenu
の3つがあります。コンテキストとかは標準的に表に出てくるので使っている人も多いと思います。
で、これと同じ働きをする「back」「next」ボタンをFlash内で実装する場合
という感じになります。
ただ履歴とその中における現在の位置の関係が分からないため、これ以上戻れない、進めない状態になったときにボタンを殺したりすることができません。(その口を見つけられていないだけかもしれないけど)
つまりHistoryManager._positionとHistoryManager._histories.lengthの関係をチェックして、フロントのボタンの制御を行える口を用意したいなと・・。
ただposition、histories共にprivate static属性のためextendsもできず・・・ということでHistoryManagerに2つメソッドを追加してしまいました。
apeirophobia: Loaderの読み込み強制終了 Loader.close編、apeirophobia: Loaderの読み込み強制終了 Loader.unload編の続き。Progression3でやるとどうなるか?の検証。
主要なコードは以下の通り。本当はもっとスマートな書き方がCastImageLoaderにはありますが、敢えてここはcontentsLoaderInfoと比較するためにこの記述の仕方で・・。
CODE:1
で、一点注意点としてはCastEventは”UNLOAD”イベントを持たないので、その部分だけはEvent.UNLOADを使用します。あ、あとcontentLoaderInfoではなく直接CastImageLoaderを監視します。
プレビュー/ダウンロードシミュレートでの実行結果は
1:読み込み中にclose実行>読み込みは中断されず、COMPLETEイベント発生。ただし_loaderは表示されない。
2:読み込み前にclose実行>特に問題なし
3:読み込み後にclose実行>_loader消去
4:読み込み中にclose実行後、再度読み込み>2回目の読み込みCOMPLETEイベントが発生するが、_loaderが表示されない。
5:読み込み完了後にclose実行後、再度読み込み>問題なく表示
6:読み込み後、再度読み込み中にclose実行>unloadが無視され、COMPLETE発生後表示されてしまう。
という感じに。読み込みは中断されずCOMPLETEイベントは発生してしまいますが、表示されることはありません。
ただし4、5、6あたりが挙動が不審なところで、読み込み中にunloadを実行する、もしくは一度unlaod無しでCOMPLETEしてしまうとcontents(DisplayObject)の制御が利かなくなるようです。(ExLoader、ExImageLoader、CastImageLoaderの中を見てみましたが、ちょっと原因良く分からなかった)
HTTP経由での実行結果は
1:読み込み中にclose実行>読み込み中断。
2:読み込み前にclose実行>特に問題なし
3:読み込み後にclose実行>_loader消去
4:読み込み中にclose実行後、再度読み込み>問題なし
5:読み込み完了後にclose実行後、再度読み込み>問題なく表示
6:読み込み後、再度読み込み中にclose実行>問題なし
という結果になりました。プレビュー環境でおかしかった4、5、6辺りはHTTP経由では問題ないようです。
で、話はちょっと横にそれますが、contentsLoaderInfoのイベントとのタイミングですが、普通にLoadingした場合
CastImageLoader::ロード開始
contentLoaderInfo::ロード開始
CastImageLoader::ロード完了
contentLoaderInfo::ロード完了
というようにCastImageLoaderのイベントのほうが先に実行されています。ステキです。
では続いて、CastImageLoaderに最適と思われる記述の仕方をしてみます。
前回(apeirophobia: Loaderの読み込み強制終了 Loader.close編)の続き。
とりあえず主要なコードは以下のような感じ。
CODE:1
これをプレビュー/ダウンロードシミュレートで実行すると
1:読み込み中にunload実行>読み込み止らず、読み込み完了して表示
2:読み込み終了後にunload実行>表示されていた_loaderが消去
3:読み込み前にunload実行>何も起きない。
といった感じ。closeの時のように例外throwは無い。ということでhttp経由で検証。
1:読み込み中にunload実行>読み込み止らず、読み込み完了して表示
2:読み込み終了後にunload実行>表示されていた_loaderが消去
3:読み込み前にunload実行>何もおきない
という感じで、どうしようもない感じに終わりましたw
つまりunloadは読み込みが完了したcontentLoaderInfoに対してのみ有効なようです。
ということでcloseと組み合わせて使うのが正解のようですが、なんにしてもプレビュー環境で動作が確認できないのでその辺が面倒です。はぃ。
じゃ次はprogression3のCastImageLoader等で同様の処理を行う場合にどするか?(多分ほとんど一緒だとは思いますが)検証することにします。
外部イメージのローディング途中で他の処理やシーンに遷移したい場合等、ローディングを任意に中止する部分で現在はまり中ということで検証を時系列的にメモ。
“Loader”クラスには”close”と”unload”という似たようなメソッドが2つほどある。
closeは
Loader インスタンスに対して現在進行中の load() メソッドの処理をキャンセルします。
一方unloadは
load() メソッドを使用してロードされた、この Loader オブジェクトの子を削除します。関連したLoaderInfo オブジェクトの property は null にリセットされます。他のオブジェクトが参照している可能性があるため、子は必ずしも破棄されるとは限りません。ただし、Loader オブジェクトの子ではなくなります。
と定義されている。
とりあえず”close”から検証してみる。
CODE:1
既にこの時点でCLOSEイベントを取得する口が見つからない(汗 EVENT.CLOSEは”Socket”,”XMLSocket”だけにしか用意されていないイベント。つまり発動したとしても結果を拾えないという謎な感じになっている。
Progressionの便利機能の一つに
sync : Boolean
ブラウザ上でコンテンツを実行している場合に、URL と Progression インスタンスのシーンを同期させるかどうかを取得または設定します。 同一コンテンツ上で有効化できる Progression インスタンスは 1 つのみであり、複数に対して有効化を試みた場合、最後に有効化された Progression インスタンス以外の sync プロパティは自動的に false に設定されます。
があるわけですが、”Index(CastDocument)”クラス内でコマンドを使って外部ファイルのローディング処理等をしつつ、”sync=true”にしていると、コマンド処理待ちをすっ飛ばして自動的にfirstSceneIdシーンに遷移してしまいます。(prog.goto( prog.firstSceneId );”を記述していない場合、プレビュー環境では遷移しないのですがブラウザ上でみると遷移しちゃう)
各シーン毎に必要なものを読み込む様な形であれば問題ないのですが、先読みデータ前提で各シーンの設定していると(例えば外部イメージをbitmapdataとして保持して、そこから呼び出したり)、読み込み前のためにnullになってしまってエラーが出てきます。
でわどするか?っつーと”prog.sync = false;”の設定をコマンドの中にいれて設定を同期させてしまいます。つまり先読み処理が終わった後、且つ最初のシーンへの移動の間で設定する。こんな感じ
CODE-1
これで多分大丈夫。
多分・・。