「AS3.0」カテゴリーアーカイブ

外部ファイル読み込みでswf/flvのファイルパスの違い

某所から「flvが再生できないので見て欲しい」と連絡があって(私が作ったものではない)、flaファイルを見たらコンポーネントにflvをリンクしているだけ。
いろいろ調べてみたら、flvのファイルパスの起点は、swfが貼ってあるHTMLではなく、swfになるらしい。いつのバージョンからだったか、外部読み込みのパスがswfからHTMLになったのは覚えていたけど、flvのパスがまた別だとは知らなかった。
※ちなみにコンポーネントのスキンはswfなのでHTML起点だけど、パブリッシュ設定でswfの出力先をサブフォルダにすると同じ場所に書き出されてしまう。この辺りは「ちょっとなあ」と思う。
フツーにHTMLとswfが同階層にあれば何もする必要はないし、サーバ絡みのコンテンツだとflv自体が別サーバだったりすることもあるからか、今まで問題に遭遇したことがなかったです。
う〜ん、わかっているようで気づいてないことがいろいろあるなあ。
下記サイトのお世話になりました。感謝。

親エレメント名を一括で取得

文字通り、特定のエレメントから遡って、全ての親エレメント名を取得するための関数を書きました。XMLは下層に向かっての処理はいろいろあるけど、上層に向かっての処理は少ない気がする。前提として、XMLは上から下に向かって使うものなのか? いや、そんなことないよね。単に階層化されたデータな訳だから。

//—————————
// 親ノード名取得(再帰)
//—————————
function getParentName_xml(xml:XML,array:Array):void
{
if (xml.parent() != undefined)
{
array.unshift(xml.parent().name());
getParentName_xml(xml.parent(),array);
}
}
前回の件みたいに単なる見落としの可能性もあるので、もっと簡便な方法を知ってる方は教えてください。

XMLから特定のエレメントを抽出(文字列で指定)

XMLをいじってて、XMLオブジェクトのすべての子孫(子、孫、ひ孫など)から特定のエレメントを抽出するには、descendant accessor(..)を使って
 
var resultList:XMLList = xml..aa;
 

と出来るのですが、このaaが文字列の場合にはどうすればいいか?

 
何かメソッドがあるはずだと探しまくって発見したのが、XML.descendants()でした。

var resultList:XMLList = xml.descendants(“aa”);

 

しかし散々探したあげく、見つけた場所がdescendant accessor(..)のヘルプにある関連項目からのリンクだったという・・・。灯台下暗しというけれど、ヘルプの見方に問題がありありです。うう…(T_T)。
 
 

外接円を描いてみた

ここのところ必要に迫られて、いろいろ図形の描画をしました。で、前回のカスタム線に続いて、今度は外接円を描きました。サンプルはこちら
円の公式(r*r = (x – a)* (x – a)+(x -b)*(x -b))と3点の座標から連立方程式を作って、解いただけです。…と書くと簡単そうですけど、ASの式にするのに結構手間がかかりました。数学苦手だし(笑)。スクリプトはこんな感じです。
//3点から円を描く
function drawCircleFromPoint()
{
//任意の3点から円の半径、中心点を求める
//(3点の座標と円の公式の連立方程式)
var A:Number = Math.pow(point1.x,2) – Math.pow(point0.x,2) + Math.pow(point1.y,2) – Math.pow(point0.y,2);
var B:Number = point1.y – point0.y;
var C:Number = Math.pow(point2.x,2) – Math.pow(point0.x,2) + Math.pow(point2.y,2) – Math.pow(point0.y,2);
var D:Number = point2.y – point0.y;
var E:Number = point1.x – point0.x;
var F:Number = point2.x – point0.x;
var b:Number = (F*A – E*C)/(B*F – D*E)/2;
var a:Number = (C – 2*b*D)/(2*F);
var r:Number = Math.sqrt(Math.pow(point0.x – a,2) + Math.pow(point0.y – b,2));
//求めた円を描画
var sp_gr:Graphics = sp.graphics;
sp_gr.clear();
//円;
sp_gr.lineStyle(1,0x00FF00,1);
sp_gr.drawCircle(a,b,r);
//中心点;
sp_gr.moveTo(a-3,b-3);
sp_gr.lineTo(a+3,b+3);
sp_gr.moveTo(a-3,b+3);
sp_gr.lineTo(a+3,b-3);
}

※point0,point1,point2はそれぞれ円のmcを指します(サンプル参照)。

いざ書こうとすると意外と面倒なのでメモとして。あんまり用途がないかもしれませんけど…。

Arrayの落とし穴(2) – ゼロの配列

普段あまり使わないのだけれど、Arrayは・・・

var array:Array = new Array(0,2)

とやっても生成できます。で、たまたま横着してこの方式で・・・

array = new Array(0)

とやって、array[0] == 0 になると思ったら、要素ゼロの配列になってしまい、しばらく「何でだろうな??」とはまってしまいました。ヘルプ通りの仕様なんですけどね。

var array:Array = new Array(0,2)
trace(array,array.length) >> 0,2 2
array = new Array(0)
trace(array,array.length) >>  0

まあこんなコトで躓くこともないと思いますが、自分ではまたやりかねないのでメモ。

素直にこうすれば、何の問題も起きないんですけどねw。
array = [0]
trace(array,array.length) >> 0 1

[追記]2011.5.11
野中さんから情報いただきました。初期化は[]を使う方が速いらしいです。

いろんな線を描くクラスを作ってみた

GraphicsでmoveTo,lineToで線を描く時に、Flash上でできる破線、点線などの描画が出来ない。みんなどうしてるのか・・・と調べると、結局自作するしかないようなので、CustomLine用のクラスを書いてみました。点線、破線、波線、二重線に対応してます。サンプルはこちら
こういうのって汎用ライブラリはないのかな〜。役に立つようならwonderflにでも投稿してみようかしらん。でももうあるかな?
この手のいいライブラリがあったら教えて下さい。

AACオーディオをNetStreamで再生する際の問題点

ちょっとはまったのでメモ。
AACファイルをNetStreamを使って再生する場合、FLVと同様に・・・
rcv_ns.play(url_flv);
rcv_ns.seek(0);
rcv_ns.pause();

みたいな感じで、先頭に位置づけておいて、NetStream.resume()とNetStream.puase()を切り替えて、再生・一時停止を実装しています。例えば、こんな感じ。
if (isNowPlaying) {
//終了の場合は、巻き戻して再生
if (flg_finish) {
flg_finish = false;
rcv_ns.seek(0);
}
rcv_ns.resume();
} else {
rcv_ns.pause();
}
この状態で、NetStream.seek(0)で一時停止(NetStream.pause())した状態で放置しておくと、NetStream.resume()してもAACが再生されなくなってしまいます。つまり初期状態や先頭まで巻き戻した状態でそのままにしておくと、再生ボタンが効かなくなるということです。
FLVでテストしても問題は発生せず、どうもAACに固有の問題のようです。結局、NetStream.resume()の前には、強制的にNetStream.timeで位置合わせしてやることで解決しました。
if (isNowPlaying) {
//終了の場合は、巻き戻して再生
if (flg_finish) {
flg_finish = false;
rcv_ns.seek(0);
} else {
rcv_ns.seek(rcv_ns.time);
}
rcv_ns.resume();
} else {
rcv_ns.pause();
}
う〜ん、なんか釈然としないけど、バグなんだろうか?
直接は関係ないですが、AdobeのサイトにAAC関連の記事を見つけたので貼っておきます。NetStreamで読み込むAACにSoundTransformを使う方法なんて事も書いてあります。

東京ひよこの会(第1回勉強会)みんなで共有ファイルのDL

3/5に東京ひよこの第一回勉強会を開催しました。
初めての幹事でよくわからぬままの見切り発車でしたが、各自制作のファイルを元にそれぞれ有意義な発表だったと思います。各参加者、会場提供のビバマンボさんに感謝です。ちょっと時間を見誤り、予定を1時間もオーバーしてしまいましたが(笑)。
持ち寄ったファイルはみんなで共有ということで、ここからDLできます。参加者は勿論、惜しくも参加できなかった方もご覧になって「どんな会だったのか」を感じていただけるといいかもです。
みなさん続々とブログ等に感想、解説など書いて下さってます。是非、Twitterでハッシュタグ#tokyopiyoをチェック!
これを機会に第二回、第三回と続くといいなと思います。

外部swfからフォントをロードする際の注意点

これまたハマったのでメモ。

ライブラリで「新規フォント…」を選択、リンケージ設定して単独のswfとして書きだし、本体のswfと分離して、外部swfからフォントを埋め込むテクニックがありますが、この時、本体側のテキストフィールドに同じフォントが指定されていると、フォントの適用ができません。
例えば、フォントを適用しようとするtextFieldに同じフォントが指定されていると、文字が表示されません(textFieldはフォント埋め込みせず、テキストは空の状態)。
またムービークリップがmc1,mc2とタイムライン上に時系列に並んでいる(例:1-5フレームにmc1、6-10フレームにmc2)場合で・・・
  • mc1には、外部swfからASでフォント適用するtextFieldがある。
  • mc2には、外部swfのフォントが指定されたtextFieldがある。
のようになっていると、最初にmc1を表示したときには文字が表示されているが、mc2を表示した後に再度mc1を表示すると、文字が見えないという現象が起きます(mc2のtextFieldはテキストの有無は問わず)。
正確な理由はわかりませんが、本体swfと外部swfで同じ名前のフォントを使おうとしてコンフリクトしているとか、既に本体側にフォントがあると見なされてスルーされるか..でしょうか。
わざわざ外部swfにするフォントを本体側に指定すること自体が無意味なわけですが、レイアウト確認用に文字を入れておいて、後から外部フォント化するなど、指定が残ってしまう場合もあるので、要注意だと思います(実際、ハマりましたし)。
外部swfからフォントをロードする方法については、下記サイトを参考にしました。感謝。

IE7でwindow.openする際の注意点

ExternalInterface.call()で”window.open”を使って、別ウィンドウを開こうとしてマハったのでメモ。

IE7で”window.open”を使う場合は、swfのEMBEDで「wmode=”transparent”」にしないといけないらしい。最近の仕事は分業が多くて、自分でHTML書く機会も少ないので、全然知らなかったです。というか、やったけど忘れているのか?
下記のサイトを参考にしました。感謝。