<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>trick7 &#187; action script</title>
	<atom:link href="http://www.trick7.com/blog/category/action-script/feed" rel="self" type="application/rss+xml" />
	<link>http://www.trick7.com/blog</link>
	<description>flashの勉強・書籍・サイトについて</description>
	<lastBuildDate>Mon, 05 Dec 2011 08:49:15 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Soundクラスのplay()の第一引数</title>
		<link>http://www.trick7.com/blog/2011/10/01-211742.php</link>
		<comments>http://www.trick7.com/blog/2011/10/01-211742.php#comments</comments>
		<pubDate>Sat, 01 Oct 2011 12:17:42 +0000</pubDate>
		<dc:creator>tera</dc:creator>
				<category><![CDATA[action script]]></category>

		<guid isPermaLink="false">http://www.trick7.com/blog/?p=2068</guid>
		<description><![CDATA[Flash CS3に作った頃のSWFが最近動かなくなっているとのことで調査。 ２年以上SWF自体は変更していないのでブラウザ（FlashPlayer）側に原因がありそうだということで調べていたら、単音をループ再生させているところが原因でした。 seChannel = se.play( -40, 9999); playの第一引数にマイナス指定しているのは、ループ時に-40ミリ秒の無音を空けたかったため。以前はこれで動いてた。今のブラウザで見ると play() の第一引数がマイナスだと Chrome の FlashPlayer では0扱いとなり、FireFox では音が鳴らない上に、それ以外の部分まで操作不能になるという状況だった。 結局、-40でスクリプト側で無音を確保するのをやめて音声データ側に無音を継ぎ足して解決させました。 あと、CS3の時の.flaファイルをCS5で開いてパブリッシュしたら、フォント埋め込みのダイナミックフォントが一切表示されなくて焦った。 textField.embedFonts = true; をコメントアウトすれば動くので、理由を探ったところ ActionScript 上の TextFormat インスタンスでのフォント指定文字列がCS5だと変わっていた。（※どうやらCS4から変わったらしい） 大重さんの「フォントの英語名を調べる &#8211; ActionScript 3.0入門ノート CS4」のエントリを見て英語名を調べて指定し直したところ、きちんとテキストが表示されるようになった。 ※実は変更前も英語指定だったんだけど、なんか違う英語表記に変わっていた。]]></description>
			<content:encoded><![CDATA[				<p>Flash CS3に作った頃のSWFが最近動かなくなっているとのことで調査。<br />
				２年以上SWF自体は変更していないのでブラウザ（FlashPlayer）側に原因がありそうだということで調べていたら、単音をループ再生させているところが原因でした。<br />
				<code>seChannel = se.play( -40, 9999);</code><br />
				playの第一引数にマイナス指定しているのは、ループ時に-40ミリ秒の無音を空けたかったため。以前はこれで動いてた。今のブラウザで見ると play() の第一引数がマイナスだと Chrome の FlashPlayer では0扱いとなり、FireFox では音が鳴らない上に、それ以外の部分まで操作不能になるという状況だった。<br />
				結局、-40でスクリプト側で無音を確保するのをやめて音声データ側に無音を継ぎ足して解決させました。</p>
				<p>あと、CS3の時の.flaファイルをCS5で開いてパブリッシュしたら、フォント埋め込みのダイナミックフォントが一切表示されなくて焦った。<br />
				<code>textField.embedFonts = true;</code><br />
				をコメントアウトすれば動くので、理由を探ったところ ActionScript 上の TextFormat インスタンスでのフォント指定文字列がCS5だと変わっていた。（※どうやらCS4から変わったらしい）<br />
				大重さんの「<a href="http://oshige.com/flash/as3note_cs4/2009/10/post-62.html">フォントの英語名を調べる &#8211; ActionScript 3.0入門ノート CS4</a>」のエントリを見て英語名を調べて指定し直したところ、きちんとテキストが表示されるようになった。<br />
				※実は変更前も英語指定だったんだけど、なんか違う英語表記に変わっていた。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.trick7.com/blog/2011/10/01-211742.php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>gotoAndStop(2)後のaddEventListenerの挙動</title>
		<link>http://www.trick7.com/blog/2010/08/31-150149.php</link>
		<comments>http://www.trick7.com/blog/2010/08/31-150149.php#comments</comments>
		<pubDate>Tue, 31 Aug 2010 06:01:49 +0000</pubDate>
		<dc:creator>tera</dc:creator>
				<category><![CDATA[action script]]></category>

		<guid isPermaLink="false">http://www.trick7.com/blog/?p=2052</guid>
		<description><![CDATA[あるMC&#8221;panel&#8221;のフレーム1に&#8221;btn1&#8243;、フレーム2に&#8221;btn2&#8243;があり、これを条件分岐で切り替える構造のFlashだとする。下みたいな実装。 if(hoge){ panel.btn1.addEventListener(MouseEvent.CLICK, mouseDownHandler); }else{ panel.gotoAndStop(2); panel.btn2.addEventListener(MouseEvent.CLICK, mouseDownHandler); } 要はフレーム移動直後に、その移動先フレームにのみ存在するボタンに対して addEventListener するケース。 FlashIDE上でのパブリッシュ設定が FlashPlayer10 の時は動くのに、FlashPlayer9 設定に切り替えると null エラーになる。 ビックリした。 ちなみに両フレームともにまたがるように配置されたボタンなら大丈夫、あくまでgotoAndStop移動後に初登場のオブジェクトに対してイベント付けた時に起こる。]]></description>
			<content:encoded><![CDATA[				<p>あるMC&#8221;panel&#8221;のフレーム1に&#8221;btn1&#8243;、フレーム2に&#8221;btn2&#8243;があり、これを条件分岐で切り替える構造のFlashだとする。下みたいな実装。</p>
				<p><code>if(hoge){<br />
				    panel.btn1.addEventListener(MouseEvent.CLICK, mouseDownHandler);<br />
				}else{<br />
				    panel.gotoAndStop(2);<br />
				    panel.btn2.addEventListener(MouseEvent.CLICK, mouseDownHandler);<br />
				}</code></p>
				<p>要はフレーム移動直後に、その移動先フレームにのみ存在するボタンに対して addEventListener するケース。</p>
				<p>FlashIDE上でのパブリッシュ設定が <strong>FlashPlayer10 の時は動くのに、FlashPlayer9 設定に切り替えると null エラー</strong>になる。</p>
				<p>ビックリした。</p>
				<p>ちなみに両フレームともにまたがるように配置されたボタンなら大丈夫、あくまでgotoAndStop移動後に初登場のオブジェクトに対してイベント付けた時に起こる。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.trick7.com/blog/2010/08/31-150149.php/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Gravity2D ライブラリが簡単＆楽しそう</title>
		<link>http://www.trick7.com/blog/2010/08/16-211236.php</link>
		<comments>http://www.trick7.com/blog/2010/08/16-211236.php#comments</comments>
		<pubDate>Mon, 16 Aug 2010 12:12:36 +0000</pubDate>
		<dc:creator>tera</dc:creator>
				<category><![CDATA[action script]]></category>

		<guid isPermaLink="false">http://www.trick7.com/blog/?p=2045</guid>
		<description><![CDATA[「flashゲーム作成記」の poliG さんが公開されている Gravity2D が楽しそうすぎです。 デモを見ればどれだけ簡単か、どれだけ楽しそうなことできそうかがすぐ分かると思います。 link: flashゲーム作成記 &#124; Box2Dを簡単に扱えるようにするGravity2D]]></description>
			<content:encoded><![CDATA[				<p>「flashゲーム作成記」の poliG さんが公開されている Gravity2D が楽しそうすぎです。<br />
				<a href="http://flash.polig.daa.jp/?eid=1382070">デモを見れば</a>どれだけ簡単か、どれだけ楽しそうなことできそうかがすぐ分かると思います。</p>
				<p>link: <a href="http://flash.polig.daa.jp/?eid=1382070">flashゲーム作成記 | Box2Dを簡単に扱えるようにするGravity2D</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.trick7.com/blog/2010/08/16-211236.php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>インスタンスが存在するかどうか調べるAS3</title>
		<link>http://www.trick7.com/blog/2010/03/19-011928.php</link>
		<comments>http://www.trick7.com/blog/2010/03/19-011928.php#comments</comments>
		<pubDate>Thu, 18 Mar 2010 16:19:28 +0000</pubDate>
		<dc:creator>tera</dc:creator>
				<category><![CDATA[action script]]></category>

		<guid isPermaLink="false">http://www.trick7.com/blog/?p=1874</guid>
		<description><![CDATA[インスタンスが、表示リストに存在しているかどうかは、getChildByName()メソッドを使って判定することができます。(via FlashゲームPG講座 for AS3.0)(contains を使った判定方法もこの類かと) それとは違い、インスタンスを作ったかどうかを判定したい時がありましたよ！というのが今回のテーマ。 あるクラス内で、new して&#8221;mc1&#8243;というインスタンスを生成したとする。でも&#8221;mc2&#8243;は生成せず、&#8221;mc3&#8243;は生成する。mc1と3はインスタンス生成はしたものの addChild はしていない状態。 インスタンス名の数字の部分をint型の変数を使ってハンドリングしようとした時、 if(this["mc"+num]){ addChild(this["mc"+num]) //なんか処理 } で、変数numをカウントアップしていって・・みたいなコード書くと、1と3の時は動くけれど、2の時にリファレンスエラー ReferenceError: Error #1069: Property mc2 not found on Main(※クラス名) and there is no default value. になっちゃう。エラーは困る。幸い1と3の時は正常に動いているので、try,catchを使って try{ if(this["mc"+num]){ addChild(this["mc"+num]) //なんか処理 } }catch(e:Object){ trace("エラーは無視するぜ"); } という感じでエラーだけ無視して難を逃れましたと。e の type は trace(typeof e) で Object だったのでそうしておきました。]]></description>
			<content:encoded><![CDATA[				<p>インスタンスが、<strong>表示リスト</strong>に存在しているかどうかは、getChildByName()メソッドを使って判定することができます。(via <a href="http://hakuhin.jp/as3/container.html#CONTAINER_04">FlashゲームPG講座 for AS3.0</a>)(<a href="http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/flash/display/DisplayObjectContainer.html#contains%28%29">contains を使った判定方法</a>もこの類かと)</p>
				<p>それとは違い、インスタンスを作ったかどうかを判定したい時がありましたよ！というのが今回のテーマ。</p>
				<p><span id="more-1874"></span></p>
				<p>あるクラス内で、new して&#8221;mc1&#8243;というインスタンスを生成したとする。でも&#8221;mc2&#8243;は生成せず、&#8221;mc3&#8243;は生成する。mc1と3はインスタンス生成はしたものの addChild はしていない状態。<br />
				インスタンス名の数字の部分をint型の変数を使ってハンドリングしようとした時、</p>
				<pre>
if(this["mc"+num]){
    addChild(this["mc"+num])
    //なんか処理
}</pre>
				<p>で、変数numをカウントアップしていって・・みたいなコード書くと、1と3の時は動くけれど、2の時にリファレンスエラー<br />
				ReferenceError: Error #1069: Property mc2 not found on Main(※クラス名) and there is no default value.<br />
				になっちゃう。エラーは困る。幸い1と3の時は正常に動いているので、try,catchを使って</p>
				<pre>
try{
    if(this["mc"+num]){
        addChild(this["mc"+num])
        //なんか処理
    }
}catch(e:Object){
    trace("エラーは無視するぜ");
}</pre>
				<p>という感じでエラーだけ無視して難を逃れましたと。e の type は trace(typeof e) で Object だったのでそうしておきました。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.trick7.com/blog/2010/03/19-011928.php/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>FLVPlayback コンポーネントのバッファまわり</title>
		<link>http://www.trick7.com/blog/2010/03/01-140038.php</link>
		<comments>http://www.trick7.com/blog/2010/03/01-140038.php#comments</comments>
		<pubDate>Mon, 01 Mar 2010 05:00:38 +0000</pubDate>
		<dc:creator>tera</dc:creator>
				<category><![CDATA[action script]]></category>

		<guid isPermaLink="false">http://www.trick7.com/blog/?p=1860</guid>
		<description><![CDATA[再生コントロールバーのない、高画質垂れ流し動画を使うケースは、なるたけロード時間を短くすることを心がけると思います。 FLVPlayback コンポーネントを使う場合、 再生の途中で途切れない程度に十分にダウンロード（バッファ）できたら再生開始 それでも途中でバッファがなくなったら「ローディング中ですよ」アイコンとか表示 そこからある程度バッファが貯まったら再生開始 という実装が良さそう。 まず1は FLVPlayback コンポーネントのデフォルトのバッファ時間は0.1らしい(via:godagoda.net)ので、5秒ぐらいにする。僕もプログレッシブダウンロードなんで「低速環境で画質アップ」効果を期待。 //バッファタイムをデフォルト0.1から５秒に変更 my_flvPlayback.bufferTime = 5; 2は bufferingStateEntered イベントを監視して、途中でバッファの為に動画が一時停止したらローディングアイコンをaddChildして表示する。bufferingStateEntered は途中で止まる時だけじゃなく、しょっぱなも呼び出されるイベントだということに注意。 再び再生が開始されたら playingStateEntered イベントでローディングアイコンを消す。 このときの再生って、また bufferTime で設定した秒数ぶん（5秒）バッファできたら再開するってことでいいのかな。（※今から2,3を実装するところ） FLVPlayback コンポーネント上に FLV ロードするような場合、ローカル環境上の「ダウンロードのシュミレート」ではシュミレートできないらしく、サーバーにアップして試すんだけど、今時ネットも高速回線なので、なかなかこういった低速回線用のデバッグが面倒。 追記：Firefox Throttle(Windowsのみ) というアドオンを使えば、回線速度を低速シミュレートできると kinkuma_design さまに教えていただきました。 追記2：上記2,3も実装。シークバーのないビデオコンテンツだとしても、ローディング状況を確認しつつ開発したい時は、コンポーネントインスペクタから、SeekBarをステージ上に配置して、インスタンス名 sb（任意）とした時 my_flvPlayback.seekBar = sb; とするだけでローディング状況をバーで知ることができて簡単。あとはお好みで BufferingBar も使えます。こちらはバッファ状態になった時だけ床屋のくるくるみたいなのが表示されるというパーツ。 別方法として FLVPlayback コンポーネントにスキンをあてる方法もあるけど、なぜか当て込むと コンポーネントのwidthが２倍に算出されておかしかったのでやめた。スキンの場合はスキン用のswfも別途アップロードするのを忘れずに。 追記3：バッファ状況も十分なのに映像が止まることがある。裏側でガベージコレクションが発動してる疑惑。もしそうなら、動画再生中は強制的に GC を止めたい。できるのか？ 追記4：ここまでの記事を全部見直し。再生が始まった後で、ダウンロード待ちの状態に戻して十分にダウンロードされてから自動的に再生を再開するには、pause() メソッドを使用し、次に playWhenEnoughDownloaded() メソッドを使用します。とある。3 の playingStateEntered も「バッファリング状態に移行してから再生状態に移行することが多いので、play() [...]]]></description>
			<content:encoded><![CDATA[				<p>再生コントロールバーのない、高画質垂れ流し動画を使うケースは、なるたけロード時間を短くすることを心がけると思います。<br />
				FLVPlayback コンポーネントを使う場合、</p>
				<ol>
				<li>再生の途中で途切れない程度に十分にダウンロード（バッファ）できたら再生開始</li>
				<li>それでも途中でバッファがなくなったら「ローディング中ですよ」アイコンとか表示</li>
				<li>そこからある程度バッファが貯まったら再生開始</li>
				</ol>
				<p>という実装が良さそう。<br />
				まず1は FLVPlayback コンポーネントのデフォルトのバッファ時間は0.1らしい(<a href="http://www.godagoda.net/blog/2008/09/flvplayback_1.html">via:godagoda.net</a>)ので、5秒ぐらいにする。僕もプログレッシブダウンロードなんで「低速環境で画質アップ」効果を期待。</p>
				<pre>//バッファタイムをデフォルト0.1から５秒に変更
my_flvPlayback.<a href="http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/fl/video/FLVPlayback.html#bufferTime">bufferTime</a> = 5;</pre>
				<p>2は <a href="http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/fl/video/FLVPlayback.html#event:bufferingStateEntered">bufferingStateEntered</a> イベントを監視して、途中でバッファの為に動画が一時停止したらローディングアイコンをaddChildして表示する。bufferingStateEntered は途中で止まる時だけじゃなく、しょっぱなも呼び出されるイベントだということに注意。</p>
				<p>再び再生が開始されたら <a href="http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/fl/video/FLVPlayback.html#event:playingStateEntered">playingStateEntered</a> イベントでローディングアイコンを消す。<br />
				このときの再生って、また bufferTime で設定した秒数ぶん（5秒）バッファできたら再開するってことでいいのかな。<br />（※今から2,3を実装するところ）<br />
				FLVPlayback コンポーネント上に FLV ロードするような場合、ローカル環境上の「ダウンロードのシュミレート」ではシュミレートできないらしく、サーバーにアップして試すんだけど、今時ネットも高速回線なので、なかなかこういった低速回線用のデバッグが面倒。</p>
				<p>追記：<a href="https://addons.mozilla.org/ja/firefox/addon/5917">Firefox Throttle</a>(Windowsのみ) というアドオンを使えば、回線速度を低速シミュレートできると <a href="http://www.kuma-de.com/">kinkuma_design さま</a>に教えていただきました。</p>
				<p>追記2：上記2,3も実装。シークバーのないビデオコンテンツだとしても、ローディング状況を確認しつつ開発したい時は、コンポーネントインスペクタから、SeekBarをステージ上に配置して、インスタンス名 sb（任意）とした時</p>
				<pre>my_flvPlayback.seekBar = sb;</pre>
<p>とするだけでローディング状況をバーで知ることができて簡単。あとはお好みで BufferingBar も使えます。こちらはバッファ状態になった時だけ床屋のくるくるみたいなのが表示されるというパーツ。<br />
別方法として FLVPlayback コンポーネントにスキンをあてる方法もあるけど、なぜか当て込むと コンポーネントのwidthが２倍に算出されておかしかったのでやめた。スキンの場合はスキン用のswfも別途アップロードするのを忘れずに。</p>
<p>追記3：バッファ状況も十分なのに映像が止まることがある。裏側でガベージコレクションが発動してる疑惑。もしそうなら、動画再生中は強制的に GC を止めたい。できるのか？</p>
<p>追記4：ここまでの記事を全部見直し。再生が始まった後で、ダウンロード待ちの状態に戻して十分にダウンロードされてから自動的に再生を再開するには、pause() メソッドを使用し、次に playWhenEnoughDownloaded() メソッドを使用します。とある。3 の playingStateEntered も「バッファリング状態に移行してから再生状態に移行することが多いので、play() メソッドを呼び出した直後または対応するコントロールをクリックした直後には、イベントが発生しない場合があります。」とあるので、上記リスト通りの実装すると信頼性低くなるなこりゃ。</p>
<p>playingStateEntered がデリケートなんだったら stateChange で監視しようと思ったんだけど、同じ動画を再度見ようとすると STATE_CHANGE すら動かない場合がある。困った。<br />
ここまでわかったのは、VideoEvent.READY だからといって、即 playWhenEnoughDownloaded() とは限らないので、playWhenEnoughDownloaded() で再生スタートしたタイミングで任意メソッドを動かしたいんだけど、playingStateEntered も stateChange も（ローカルでは動くのに、ネットに上げると）バッファされないケース（でもstateは変わってるのになぁ？）で呼び出されないケースがあるからこれから独自実装しようとしている。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.trick7.com/blog/2010/03/01-140038.php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FLV使う時さぁ</title>
		<link>http://www.trick7.com/blog/2010/02/15-191817.php</link>
		<comments>http://www.trick7.com/blog/2010/02/15-191817.php#comments</comments>
		<pubDate>Mon, 15 Feb 2010 10:18:17 +0000</pubDate>
		<dc:creator>tera</dc:creator>
				<category><![CDATA[action script]]></category>

		<guid isPermaLink="false">http://www.trick7.com/blog/?p=1839</guid>
		<description><![CDATA[前のエントリの FLV動画をタイムラインに貼付け、タイムライン上で所定の場所にフレームスクリプトを書いて制御する 動画にキューポイントを設定し、制御する で、1を選ぶデメリットって何だろうなと。→追記：swf全部ロードしてからでないと再生が始まらないことか。 →さらに追記：これ嘘でした。子swfのルートのタイムラインに貼り付けたFLVはプログレッシブダウンロードできます。feb19様にいただいたコメントを参照！ 親swfから子swfをロードする構成で、子swfのタイムラインに直接貼るか、子swfにFLVPlaybackコンポーネントを貼るかの違いであれば、どっちでもいいような、むしろ1の方が手っ取り早いように思えてきた。親swf自体にFLVPlaybackコンポーネントを用意するのが（unloadのやり方が下手くそな僕には）メモリリーク対応的にはベストかもだけど、今回それはやらないとして。やっぱりそうしたほうがいいな。最終的にはコメントに追記したような仕様にしました。メモリリークも解決しました。]]></description>
			<content:encoded><![CDATA[				<p><a href="http://www.trick7.com/blog/2010/02/15-185843.php">前のエントリ</a>の</p>
				<ol>
				<li>FLV動画をタイムラインに貼付け、タイムライン上で所定の場所にフレームスクリプトを書いて制御する</li>
				<li>動画にキューポイントを設定し、制御する</li>
				</ol>
				<p>で、1を選ぶデメリットって何だろうなと。<br /><strong>→追記：<del datetime="2010-02-16T16:11:14+00:00">swf全部ロードしてからでないと再生が始まらない</del>ことか。</strong><br />
				→さらに追記：これ嘘でした。子swfのルートのタイムラインに貼り付けたFLVはプログレッシブダウンロードできます。feb19様にいただいたコメントを参照！<br />
				<br />親swfから子swfをロードする構成で、子swfのタイムラインに直接貼るか、子swfにFLVPlaybackコンポーネントを貼るかの違いであれば、どっちでもいいような、<del datetime="2010-02-15T14:05:23+00:00">むしろ1の方が手っ取り早いように思えてきた。</del>親swf自体にFLVPlaybackコンポーネントを用意するのが（<strong>unloadのやり方が下手くそな僕には</strong>）メモリリーク対応的にはベストかもだけど、<del datetime="2010-02-15T14:05:23+00:00">今回それはやらないとして。</del><del datetime="2010-02-16T16:11:14+00:00">やっぱりそうしたほうがいいな。</del>最終的にはコメントに追記したような仕様にしました。メモリリークも解決しました。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.trick7.com/blog/2010/02/15-191817.php/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>FLV/F4Vのキューポイント</title>
		<link>http://www.trick7.com/blog/2010/02/15-185843.php</link>
		<comments>http://www.trick7.com/blog/2010/02/15-185843.php#comments</comments>
		<pubDate>Mon, 15 Feb 2010 09:58:43 +0000</pubDate>
		<dc:creator>tera</dc:creator>
				<category><![CDATA[action script]]></category>

		<guid isPermaLink="false">http://www.trick7.com/blog/?p=1836</guid>
		<description><![CDATA[動画をそのまま再生させて終わりというのではなく、動画の最後までいったらちょっと戻してループさせるとか、映像の特定のタイミングで関数を呼び出したりするときは、 FLV動画をタイムラインに貼付け、タイムライン上で所定の場所にフレームスクリプトを書いて制御する 動画にキューポイントを設定し、制御する が思い浮かびます。 ただ、1の方法は動画がFLVならOKですが、F4Vだと駄目です。FLVに変換する必要があります。手元にあったのがF4Vだったので2をやってみようと思いました。（結局キューポイントを埋め込むのでFLV変換してもいいんですけどね。） 次に、SWF上にビデオを埋め込むには Videoクラスを作って自力でいろいろ実装していく FLVPlaybackコンポーネントを使う 方法があって、（いろいろ不評ポイントはあるものの）コンポーネントを使う方が簡単なのでここも2にする。 さて、F4VってのはCS4の時に採用した動画形式で、要はH.264なんですが、H.264と違ってキューポイントが埋め込めるのがメリット。 キューポイントといっても ナビゲーションキューポイント イベントキューポイント ActionScriptキューポイント の3タイプがあり、1と2はFLV/F4Vに直接埋め込むキューポイントでAdobeMediaEncoderを使って埋め込みます。3はASやFlashIDE上であとから設定できます。 ただ、動画再生ヘッダを所定位置に移動させるseek系の指定先は（時間を直接指定する方法もありますが、キューポイントを指定先に使う場合は）ナビゲーションキューポイントしか使えません。 キューポイントによるナビゲーションの移動は FLVPlaybackインスタンス.seekToNavCuePoint("キューポイント名") でいけるとあるが、これが&#8221;Invalid seek&#8221;だと怒られる。ちゃんとナビゲーションキューポイントを指定しており、他につまづくような箇所はなさそうに思える。 なんだこれと１時間ぐらい格闘したけどわからんかったので、結局seekSeconds(秒数)メソッドを使うようにした。seekSecondsメソッドはseekと違い、引数に小数点以下 3 桁までの精度 (ミリ秒精度)で設定できる。もちろん分は秒に直して指定。１分23秒04(1:23:04)なら、83.04と指定。seekSeconds直後はコンポーネントが停止するみたいなんでmyFLVblayback.play();で再開させる。 それにしてもseekToNavCuePointが使えないのが気になる。海外でも同じInvalid seek症状な人を散見。今後deliciousして情報を追います。 追記： FLVPlaybackコンポーネントを含む子swfをアンロードした時にFLVの音が残り続ける現象に遭遇。ipuhekeさんと同様の現象だと考え、activeVideoPlayerIndexを設定しようとするも、コンポーネントのプロパティパネルからは設定できないらしく、スクリプトから設定することになる。 もはや設計を見直した方が早そうなので、FLVPlaybackコンポーネント１個用意して、このあたりのサンプルコードを参考に作り直すことにした。 追記： MetadataEvent.CUE_POINTイベントを監視して、ハンドラ内でキューポイント名分岐させたいとする。 eventObject.vpでインデックス（チャンネル番号的なもの）は取得できるが、eventObject.infoだと[Object Object]が返ってくるので Spark の Dumper を使って import org.libspark.utils.Dumper; trace(Dumper.toString(eventObject.info)); のようにして中身を覗くと、 $var = { 'type' =&#60; actionscript,←キューのタイプ 'name' =&#60; showTitle,←キュー名 'time' =&#60; 3,←キュー設定した時間 } が入っている。よってキューポイント名は [...]]]></description>
			<content:encoded><![CDATA[				<p>動画をそのまま再生させて終わりというのではなく、動画の最後までいったらちょっと戻してループさせるとか、映像の特定のタイミングで関数を呼び出したりするときは、</p>
				<p><span id="more-1836"></span></p>
				<ol>
				<li>FLV動画をタイムラインに貼付け、タイムライン上で所定の場所にフレームスクリプトを書いて制御する</li>
				<li>動画にキューポイントを設定し、制御する</li>
				</ol>
				<p>が思い浮かびます。<br />
				ただ、1の方法は動画がFLVならOKですが、F4Vだと駄目です。FLVに変換する必要があります。手元にあったのがF4Vだったので2をやってみようと思いました。（結局キューポイントを埋め込むのでFLV変換してもいいんですけどね。）</p>
				<p>次に、SWF上にビデオを埋め込むには</p>
				<ol>
				<li>Videoクラスを作って自力でいろいろ実装していく</li>
				<li>FLVPlaybackコンポーネントを使う</li>
				<ul>
				<p>方法があって、（いろいろ不評ポイントはあるものの）コンポーネントを使う方が簡単なのでここも2にする。</p>
				<p>さて、F4VってのはCS4の時に採用した動画形式で、要はH.264なんですが、H.264と違ってキューポイントが埋め込めるのがメリット。<br />
				キューポイントといっても</p>
				<ol>
				<li>ナビゲーションキューポイント</li>
				<li>イベントキューポイント</li>
				<li>ActionScriptキューポイント</li>
				</ol>
				<p>の3タイプがあり、1と2はFLV/F4Vに直接埋め込むキューポイントでAdobeMediaEncoderを使って埋め込みます。3はASやFlashIDE上であとから設定できます。</p>
				<p>ただ、動画再生ヘッダを所定位置に移動させるseek系の指定先は（時間を直接指定する方法もありますが、キューポイントを指定先に使う場合は）ナビゲーションキューポイントしか使えません。</p>
				<p>キューポイントによるナビゲーションの移動は</p>
				<pre>FLVPlaybackインスタンス.seekToNavCuePoint("キューポイント名")</pre>
<p>でいけるとあるが、これが&#8221;Invalid seek&#8221;だと怒られる。ちゃんとナビゲーションキューポイントを指定しており、他につまづくような箇所はなさそうに思える。</p>
<p>なんだこれと１時間ぐらい格闘したけどわからんかったので、結局seekSeconds(秒数)メソッドを使うようにした。seekSecondsメソッドはseekと違い、引数に小数点以下 3 桁までの精度 (ミリ秒精度)で設定できる。もちろん分は秒に直して指定。１分23秒04(1:23:04)なら、83.04と指定。seekSeconds直後はコンポーネントが停止するみたいなんでmyFLVblayback.play();で再開させる。</p>
<p>それにしてもseekToNavCuePointが使えないのが気になる。海外でも同じInvalid seek症状な人を散見。今後<a href="http://delicious.com/trick7/FLVPlayback">deliciousして</a>情報を追います。</p>
<p>追記：</p>
<p>FLVPlaybackコンポーネントを含む子swfをアンロードした時にFLVの音が残り続ける現象に遭遇。<a href="http://blog.ipuheke.jp/?p=46">ipuhekeさんと同様の現象</a>だと考え、activeVideoPlayerIndexを設定しようとするも、コンポーネントのプロパティパネルからは設定できないらしく、スクリプトから設定することになる。<br />
もはや設計を見直した方が早そうなので、FLVPlaybackコンポーネント１個用意して、<a href="http://help.adobe.com/ja_JP/ActionScript/3.0_UsingComponentsAS3/WS5b3ccc516d4fbf351e63e3d118a9c65586-7fde.html">このあたりのサンプルコード</a>を参考に作り直すことにした。</p>
<p>追記：</p>
<p>MetadataEvent.CUE_POINTイベントを監視して、ハンドラ内でキューポイント名分岐させたいとする。<br />
eventObject.vpでインデックス（チャンネル番号的なもの）は取得できるが、eventObject.infoだと[Object Object]が返ってくるので <a href="http://www.libspark.org/wiki/dealforest/Dumper">Spark の Dumper</a> を使って</p>
<pre>import org.libspark.utils.Dumper;
trace(Dumper.toString(eventObject.info));</pre>
				<p>のようにして中身を覗くと、</p>
				<pre>$var = {
           'type' =&lt; actionscript,←キューのタイプ
           'name' =&lt; showTitle,←キュー名
           'time' =&lt; 3,←キュー設定した時間
       }</pre>
				<p>が入っている。よって<strong>キューポイント名は eventObject.info.name で取得できる。</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.trick7.com/blog/2010/02/15-185843.php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>子swfから親swfの変数・メソッドを呼び出す</title>
		<link>http://www.trick7.com/blog/2010/02/10-132711.php</link>
		<comments>http://www.trick7.com/blog/2010/02/10-132711.php#comments</comments>
		<pubDate>Wed, 10 Feb 2010 04:27:11 +0000</pubDate>
		<dc:creator>tera</dc:creator>
				<category><![CDATA[action script]]></category>

		<guid isPermaLink="false">http://www.trick7.com/blog/?p=1830</guid>
		<description><![CDATA[flvビデオをタイムラインに貼付けてちょっとフレームアクション追加してswf化、それを子swfとして、親swfからロードして使うというケースがあるとします。 その中で再生中のムービーのあるタイミングで親swfのメソッドを実行したいことがあります。 つまり表題のように子swfから親swfの変数・メソッドを呼び出すというケース。 僕のケースでは親swfのドキュメントクラス(Main.as)内で定義したメソッドを呼び出したかったので、子flaのフレームアクション上から、Main(root.parent.parent).hoge()みたいにキャストして呼び出そうとしたら、子swfの単品flaパブリッシュ時に「未定義である可能性が高いメソッド Main の呼び出しです。」と当然怒られる。（失敗１） で、キャストするのをやめて root.parent.parent.hoge() だと、 「未定義である可能性のあるメソッド hoge を、静的型・・・」と怒られる。（失敗２） ネットで調べて下記記事を拝見： 外部swfから親を呼ぶ &#124; Miscellaneous notes var ld:Loader = loaderInfo.loader; var maintl:MovieClip = ld.root as MovieClip; maintl.hoge(); // 親の関数 と子flaのフレーム上に書いてパブリッシュ成功。親swfへのアクセスも成功。（成功１） あれ？Main型でキャストしなくてもhoge()たたけるの？と不思議に思って失敗１のアプローチで MovieClip(root.parent.parent).hoge(); でもいけた。（成功２） ※こちらの記事も参考に。あとで試させてもらおう。 AS3 読み込んだ子swfにアクセス　読み込んだ子swfから親swfにアクセス &#124; as3 &#124; メモ &#124; pandama]]></description>
			<content:encoded><![CDATA[				<p>flvビデオをタイムラインに貼付けてちょっとフレームアクション追加してswf化、それを<strong>子swf</strong>として、<strong>親swf</strong>からロードして使うというケースがあるとします。<br />
				その中で再生中のムービーのあるタイミングで親swfのメソッドを実行したいことがあります。<br />
				つまり表題のように<strong>子swfから親swfの変数・メソッドを呼び出す</strong>というケース。</p>
				<p><span id="more-1830"></span></p>
				<p>僕のケースでは親swfのドキュメントクラス(Main.as)内で定義したメソッドを呼び出したかったので、子flaのフレームアクション上から、Main(root.parent.parent).hoge()みたいにキャストして呼び出そうとしたら、子swfの単品flaパブリッシュ時に「未定義である可能性が高いメソッド Main の呼び出しです。」と当然怒られる。<strong>（失敗１）</strong></p>
				<p>で、キャストするのをやめて root.parent.parent.hoge() だと、<br />
				「未定義である可能性のあるメソッド hoge を、静的型・・・」と怒られる。<strong>（失敗２）</strong></p>
				<p>ネットで調べて下記記事を拝見：</p>
				<p><a href="http://www.insprt.com/blog/?p=73">外部swfから親を呼ぶ | Miscellaneous notes</a></p>
				<pre>var ld:Loader = loaderInfo.loader;
var maintl:MovieClip = ld.root as MovieClip;
maintl.hoge(); // 親の関数</pre>
				<p>と子flaのフレーム上に書いてパブリッシュ成功。親swfへのアクセスも成功。<strong>（成功１）</strong></p>
				<p>あれ？Main型でキャストしなくてもhoge()たたけるの？と不思議に思って失敗１のアプローチで</p>
				<pre>MovieClip(root.parent.parent).hoge();</pre>
<p>でもいけた。<strong>（成功２）</strong></p>
<p>※こちらの記事も参考に。あとで試させてもらおう。<br />
<a href="http://www.pandama.net/memo/2009/10/as3-swfswfswf.php">AS3 読み込んだ子swfにアクセス　読み込んだ子swfから親swfにアクセス | as3 | メモ | pandama</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.trick7.com/blog/2010/02/10-132711.php/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>addEventListenerで実行するメソッドにパラメーター渡す</title>
		<link>http://www.trick7.com/blog/2009/08/25-145851.php</link>
		<comments>http://www.trick7.com/blog/2009/08/25-145851.php#comments</comments>
		<pubDate>Tue, 25 Aug 2009 05:58:51 +0000</pubDate>
		<dc:creator>tera</dc:creator>
				<category><![CDATA[action script]]></category>

		<guid isPermaLink="false">http://www.trick7.com/blog/?p=1406</guid>
		<description><![CDATA[タイトルの通り、そういうことをしたい時があります。 探したら apeirophobia さまのブログに書かれていました。 apeirophobia: addEventListenerで一緒に引数を渡したい addEventListener(Event.SELECT, hoge(3)); private function hoge(num:int){ return function(e:Event):void{ trace("番号："+num); } } みたいな感じにするそうな。 hogeメソッドにvoid指定するとなんでエラーになるのかとか、そういうプログラム的なことにあまり興味が湧かずにコピペして動いて安心してしまう僕はプログラマ属性ゼロだなぁと思ったりした。]]></description>
			<content:encoded><![CDATA[				<p>タイトルの通り、そういうことをしたい時があります。</p>
				<p>探したら apeirophobia さまのブログに書かれていました。<br />
				<a href="http://blog.img8.com/archives/2008/04/003758.html">apeirophobia: addEventListenerで一緒に引数を渡したい</a></p>
				<pre>addEventListener(Event.SELECT, hoge(3));
private function hoge(num:int){
	return function(e:Event):void{
		trace("番号："+num);
	}
}</pre>
				<p>みたいな感じにするそうな。<br />
				hogeメソッドにvoid指定するとなんでエラーになるのかとか、そういうプログラム的なことにあまり興味が湧かずにコピペして動いて安心してしまう僕はプログラマ属性ゼロだなぁと思ったりした。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.trick7.com/blog/2009/08/25-145851.php/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>ある条件下でのフレームのランダム移動における再帰処理</title>
		<link>http://www.trick7.com/blog/2009/08/07-133839.php</link>
		<comments>http://www.trick7.com/blog/2009/08/07-133839.php#comments</comments>
		<pubDate>Fri, 07 Aug 2009 04:38:39 +0000</pubDate>
		<dc:creator>tera</dc:creator>
				<category><![CDATA[action script]]></category>

		<guid isPermaLink="false">http://www.trick7.com/blog/?p=1354</guid>
		<description><![CDATA[あまりこんなケースはないと思うけれど、 あるムービークリップシンボルのフレーム内を直前のフレームと重複がないように移動させたい。ただし次に移動すべきフレームは配列として[1,4,5,10]のような配列に記録されている時： myMc.gotoAndStop(shuffleFrame(nextArray)) function shuffleFrame(arr:Array):Number{ var rdm = Math.floor(Math.random()*arr.length); var jumpFrame:Number = nextArray[rdm]; var preFrame:Number = myMc._currentframe; if(preFrame==jumpFrame){ return shuffleFrame(arr); }else{ return jumpFrame; } } 再帰処理する時の return が必要なのかどうなのか迷ってはまったという覚え書き。AS2です。]]></description>
			<content:encoded><![CDATA[				<p>あまりこんなケースはないと思うけれど、<br />
				あるムービークリップシンボルのフレーム内を直前のフレームと重複がないように移動させたい。ただし次に移動すべきフレームは配列として[1,4,5,10]のような配列に記録されている時：</p>
				<p><span id="more-1354"></span></p>
				<pre>myMc.gotoAndStop(shuffleFrame(nextArray))
function shuffleFrame(arr:Array):Number{
	var rdm = Math.floor(Math.random()*arr.length);
	var jumpFrame:Number = nextArray[rdm];
	var preFrame:Number = myMc._currentframe;
	if(preFrame==jumpFrame){
		<strong>return</strong> shuffleFrame(arr);
	}else{
		return jumpFrame;
	}
}</pre>
				<p>再帰処理する時の return が必要なのかどうなのか迷ってはまったという覚え書き。AS2です。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.trick7.com/blog/2009/08/07-133839.php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

