Flash

ExternalInterfaceのaddCallbackが実行されないエラー

via:
ExternalInterfaceでActionScriptの関数呼び出し失敗への対策 – blog.katsumata.tv
ExternalInterfaceのはまりどころを再検証 -tech.kayac.com

jsとswfを繋げるためにExのcallとaddCallbackを使いまくるんですが、ときどきaddCallbackが動作しないことがあります。
これのために土日月を費やしてしまいました。

//swf.objidはFlashを書き出しているSWFObjectの第二引数
function call0(){
var player = document.all? window[swf.objid] : document[swf.objid];
player.OverlayCallBack0()
}

普通はこれでFlash側の OverlayCallBack0() 関数が動くはずなんですが、うんともすんとも言いません。そこで、もう諦めて「ブッダ」読んで寝ようと思ったときに

try{
call0();
}catch(e){
alert(e)
}

ってやってみたら、alertされて「TypeError:player.OverlayCallBack0 is not a Function.」と表示されました。これはエラーがキャッチされた証拠です。で、このエラーは何かというと、flash側の用意ができていないよ、ということらしい。Firebugコンソールで普通に「call0()」とタイプするとちゃんとFlashは動きます。どういうこっちゃ。

上記のエントリでは、JSの関数を実行したいときはASから呼べ、と書いてありますが逆にASをJSから確実に呼びたいときはどうすればいいんでしょうねぇ? Flash自体はローディングを用意してあるので、ロードが完了したらcallbackして、その先の処理を進めているから、Flashがロードできていない状態というのはありえないわけです。じゃあなぜ??

ASを呼ぶにはASから? JSを呼ぶのはASから、というのは楽ですが、ASを呼ぶためのJSが is not a Function. なのは意味不明です。。。。

TAKUMI ICON CLOCKみたいなもの

僕が愛用しているTAKUMIのKIRIという腕時計があるんですが、部屋用の掛け時計(ICONCLOCK)もとても良いです。

TAKUMIラブなのでICONCLOCKを模したアナログ時計を作ってみました。


TAKUMI ICON CLOCK TKM40-W ホワイト IDEA 2500046

TAKUMI KIRI watch(W) TKM20-W

AS3で書いたんですが中身はAS2のままでListenerまわりだけの直しで対応できました。
いちおうダウンロードはこちら(ver9 .fla形式)。

Flash(SWF)をビデオのようにシークするMCcontrollerV2forAS3

via:
mcコントローラV2.1外部読み込み版
mcコントローラV2

AS3で書いてみました。ボリュームコントローラはまだ途中ですが、スマートな書き方があったら教えてくださいませ。

っていうか、AS3で書き出すSWFでタイムラインアニメーションを作ろうなんて思う人はいないと思いますが。。AIRでFLVでもSWFでも意識しないでドラッグ&ドロップ→シーク、というマルチプレイヤーを作るときぐらいしか役に立ちませんが公開します。

っていうかこういう形式でいいのかな。class設計が甘いと思いますが、使い方はflaファイルを見てみてください。
AS3はframeRateを取得できるので、AS2版みたいに数字を設定しなくても、ステージに置くだけで使えるようになります。

難点としては、ReleaseOutSideの処理をしていないので、シークつまみ(knob2)をぐいぐいやっちゃうと反応しないというところです。AS3でどうやんの。

いちおうダウンロードはこちら(verCS3 .fla形式を含むzip)