<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>Webクリ★ライフスタイル</title>
        <link>http://studio-ensyu.com/life-style/</link>
        <description>日々Webの片隅でクリエイティブを叫ぶFlashクリエイター「NoBody」のネタ日記と、Flash技術置場です。</description>
        <language>ja</language>
        <copyright>Copyright 2011</copyright>
        <lastBuildDate>Tue, 25 May 2010 23:56:00 +0900</lastBuildDate>
        <generator>http://www.sixapart.com/movabletype/</generator>
        <docs>http://www.rssboard.org/rss-specification</docs>
        
        <item>
            <title>Flashでマルチタッチ対応してみたよ。</title>
            <description><![CDATA[<p>タイトル通りです。<br /> 英語版の体験版で、Flash CS5の新機能、マルチタッチに対応させてみました。</p> <p>&nbsp;</p> <script type="text/javascript" src="http://ext.nicovideo.jp/thumb_watch/sm10845398"></script><noscript><a href="http://www.nicovideo.jp/watch/sm10845398">【ニコニコ動画】Flashでマルチタッチ対応してみたよ。</a></noscript> <p>&nbsp;</p> <p>てか、いつもの仕事の感覚で動画作ったら、ニコニコ動画での諸々の制限がきつくて文字がつぶれちゃった～。</p> <p>てことで、こっちにも解説必要だね。</p> <p class="code">stage.scaleMode = StageScaleMode.NO_SCALE;<br /> <br /> Multitouch.inputMode = MultitouchInputMode.GESTURE;<br /> <br /> test_mc.addEventListener(TransformGestureEvent.GESTURE_ROTATE , rotateFunc);<br /> test_mc.addEventListener(TransformGestureEvent.GESTURE_ZOOM , zoomFunc);<br /> <br /> <br /> function rotateFunc(e:TransformGestureEvent):void{<br /> &nbsp;&nbsp;&nbsp; test_mc.rotation += e.rotation;<br /> }<br /> <br /> function zoomFunc(e:TransformGestureEvent):void{<br /> &nbsp;&nbsp;&nbsp; test_mc.scaleX = test_mc.scaleY *= e.scaleX;<br /> }</p> <p>Multitouch.inputMode = MultitouchInputMode.GESTURE;</p> <p>取得するタッチの種類を設定します。こうすると、OS標準のタッチイベントを処理できます。<br /> もしもジェスチャーを独自に実装する場合は「TOUCH_POINT」を設定します。併用はできません。</p> <p>指を使ってくるくる回す処理をする場合は「TransformGestureEvent.GESTURE_ROTATE」を使用します。<br /> その際、「TransformGestureEvent.GESTURE_ROTATE」では、一回の処理ごとの角度を取得出来ます。<br /> あくまで、「一回の処理ごと」なので、「ENTER_FRAME」と同様に、代入ではなく加算します。</p> <p>次に、指を開いて拡大させる処理です。「TransformGestureEvent.GESTURE_ZOOM」を追加します。<br /> 「TransformGestureEvent.GESTURE_ZOOM」では、一回の処理ごとのスケールを取得します。<br /> スケールはパーセンテージで取得するので、ここは掛け算します。</p> <p>ルイズがとても可愛いですね。</p> <p>てことで、簡単な解説を終わります。今回使用したPCは、<a target="_blank" href="http://h50146.www5.hp.com/products/portables/personal/tx2/">HPのtx2</a>という機種です。<br /> 他にもタッチに対応したPCは色々出てるので、試してみるといいでしょう。</p>]]></description>
            <link>http://studio-ensyu.com/life-style/2010/05/flash-1.html</link>
            <guid>http://studio-ensyu.com/life-style/2010/05/flash-1.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">ActionScript3.0</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">Flash</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">マルチタッチ</category>
            
            
            <pubDate>Tue, 25 May 2010 23:56:00 +0900</pubDate>
        </item>
        
        <item>
            <title>papervision3dのParticleFieldをアニメーションさせる。（BetweenAS3.bezierを使ってゆらゆら動かす）</title>
            <description><![CDATA[<p>そろそろこのサンプルも終わりにしようかと思うんで、ゆらゆら動く部分の実装を解説しましょうかね。</p> <p><span style="font-size: 120%;"> <p><a href="http://studio-ensyu.sakura.ne.jp/files/flash/091122_particleFldEX/particleMoveFld.html" onclick="window.open(this.href,'','resizable=no,location=no,menubar=no,scrollbars=no,status=no,toolbar=no,fullscreen=no,dependent=no,width=1000,height=600,status'); return false"><strong>動作サンプル（重いかもしれないんで別窓で）</strong></a></p> </span></p> <p><a href="http://studio-ensyu.sakura.ne.jp/files/file/particleTest.zip"><span style="font-size: 120%;"><strong>サンプルファイル一式（Flash CS4形式）</strong></span></a></p> <p>最終的には上のようなものを作ります。<br /> サンプルファイルは、きちんとクラス作ってますが、一応ココでの解説では、タイムラインコードで示します。<br /> 多分コピペすれば動くはず。</p> <p>んで、このゆらゆら動くアニメーションには、BetweenAS3.bezierというメソッドを使います。<br /> bezierといえば、<a href="http://www.project-nya.jp/modules/weblog/details.php?blog_id=1163" target="_blank">こんな感じ</a>。あとは<a href="http://www40.atwiki.jp/spellbound/pages/89.html" target="_blank">ここ</a>もいい感じの解説があります。</p> <p>ただし、全てのパーティクルに対して個々にベジェ曲線を設定するわけにもいかんので、ベジェ曲線のコントロールポイントの数とか位置はランダムに取得するようにしたいのです。</p> <p class="code">//パーティクルのベジェの直径<br /> var dist:int = 500;<br /> //コントロールポイントの最大値、この変数に1を足した数が最大値になる。<br /> var bezierMax:int = 10;<br /> for (var i:int = 0 ; i &lt; len ; i++) {<br /> &nbsp;&nbsp;&nbsp; //-----------<br /> &nbsp;&nbsp;&nbsp; //xzの基準位置を取得<br /> &nbsp;&nbsp;&nbsp; var centerX:int = particleArray[i].x;<br /> &nbsp;&nbsp;&nbsp; var centerZ:int = particleArray[i].z;<br /> &nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; //Tweenの最小値を計算<br /> &nbsp;&nbsp;&nbsp; var minX:int = centerX - dist / 2;<br /> &nbsp;&nbsp;&nbsp; var minZ:int = centerZ - dist / 2;<br /> &nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; //ベジェのコントロールポイントの数<br /> &nbsp;&nbsp;&nbsp; var countX:int = (Math.random() * bezierMax) + 2;<br /> &nbsp;&nbsp;&nbsp; var countZ:int = (Math.random() * bezierMax) + 2;<br /> &nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; //ベジェのコントロールポイントを格納する。<br /> &nbsp;&nbsp;&nbsp; var pointArrayX:Array = new Array();<br /> &nbsp;&nbsp;&nbsp; var pointArrayZ:Array = new Array();<br /> &nbsp;&nbsp;&nbsp; //ベジェを格納するオブジェクト<br /> &nbsp;&nbsp;&nbsp; var pointObj:Object = new Object();<br /> &nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; //ベジェのコントロールポイントを算出<br /> &nbsp;&nbsp;&nbsp; for (var forX:int = 0 ; forX &lt; countX ; forX++) {<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pointArrayX.push( int(Math.random() * dist) + minX );<br /> &nbsp;&nbsp;&nbsp; }<br /> &nbsp;&nbsp;&nbsp; for (var forZ:int = 0 ; forZ &lt; countZ ; forZ++) {<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pointArrayZ.push( int(Math.random() * dist) + minZ );<br /> &nbsp;&nbsp;&nbsp; }<br /> &nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; //Tweenの引数用のオブジェクト<br /> &nbsp;&nbsp;&nbsp; pointObj.x = pointArrayX;<br /> &nbsp;&nbsp;&nbsp; pointObj.z = pointArrayZ;<br /> <br /> &nbsp;&nbsp;&nbsp; var tweenXZ:IObjectTween = BetweenAS3.bezier(particleArray[i] , { x:centerX , z:centerZ } , null , pointObj , tweenTime , Linear.linear);<br /> }</p> <p>こんな感じで、bezierメソッドの第4引数にベジェのコントロールポイントを渡すのですが、ここの値はオブジェクト型を渡せばいいので、予めランダムな値の[x , y]というプロパティを持ったオブジェクトを作って、そいつを渡せば、ランダムなベジェ曲線のアニメーションを作ることができます。</p> <p>その際に</p> <p class="code">//xzの基準位置を取得<br /> var centerX:int = particleArray[i].x;<br /> var centerZ:int = particleArray[i].z;<br /> &nbsp;&nbsp;&nbsp; <br /> //Tweenの最小値を計算<br /> var minX:int = centerX - dist / 2;<br /> var minZ:int = centerZ - dist / 2;</p> <p>こんな感じで、それぞれのプロパティの値を中心にして、コントロールポイントの範囲を決めてやります。</p> <p>あとは、この処理を前回のエントリーのコードに移植してあげればOK。<br />てなわけで、タイムラインで動かす場合は下のコードををコピペしてみてくれ。</p> <p class="code">&nbsp;import org.papervision3d.view.BasicView;<br />import org.papervision3d.materials.special.MovieAssetParticleMaterial;<br />import org.papervision3d.objects.special.ParticleField;<br />import org.papervision3d.cameras.CameraType;<br /><br />import org.libspark.betweenas3.BetweenAS3;<br />import org.libspark.betweenas3.easing.Linear;<br />import org.libspark.betweenas3.events.TweenEvent;<br />import org.libspark.betweenas3.tweens.IObjectTween;<br />import org.libspark.betweenas3.tweens.ITween;<br /><br /><br />var world:BasicView = new BasicView(640 , 320 , true , false , CameraType.DEBUG);<br />var particleTweenArray:Array = new Array();<br /><br />var mf:MovieAssetParticleMaterial = new MovieAssetParticleMaterial(&quot;test&quot;);<br />mf.smooth = true;<br /><br />var fld:ParticleField = new ParticleField(mf , 200 , 1);<br /><br />stage.addChild(world);<br />world.scene.addChild(fld);<br /><br />world.startRendering();<br /><br />fld.y = -500<br />world.camera.zoom = 50;<br /><br />var tweenTime:int = 10;<br />var particleArray:Array = fld.particles;<br />var len:int = particleArray.length;<br /><br />//--------------<br />//パーティクルのベジェの直径<br />var dist:int = 500;<br />//コントロールポイントの最大値、この変数に1を足した数が最大値になる。<br />var bezierMax:int = 10;<br />//--------------<br /><br />var delay:Number = 0;<br />for (var i:int = 0 ; i &lt; len ; i++) {<br />&nbsp;&nbsp;&nbsp; particleArray[i].y = 0;<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;//-----------<br />&nbsp;&nbsp; &nbsp;//xzの基準位置を取得<br />&nbsp;&nbsp; &nbsp;var centerX:int = particleArray[i].x;<br />&nbsp;&nbsp; &nbsp;var centerZ:int = particleArray[i].z;<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;//Tweenの最小値を計算<br />&nbsp;&nbsp; &nbsp;var minX:int = centerX - dist / 2;<br />&nbsp;&nbsp; &nbsp;var minZ:int = centerZ - dist / 2;<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;//ベジェのコントロールポイントの数<br />&nbsp;&nbsp; &nbsp;var countX:int = (Math.random() * bezierMax) + 2;<br />&nbsp;&nbsp; &nbsp;var countZ:int = (Math.random() * bezierMax) + 2;<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;//ベジェのコントロールポイントを格納する。<br />&nbsp;&nbsp; &nbsp;var pointArrayX:Array = new Array();<br />&nbsp;&nbsp; &nbsp;var pointArrayZ:Array = new Array();<br />&nbsp;&nbsp; &nbsp;var pointObj:Object = new Object();<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;//ベジェのコントロールポイントを算出<br />&nbsp;&nbsp; &nbsp;for (var forX:int = 0 ; forX &lt; countX ; forX++) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pointArrayX.push( int(Math.random() * dist) + minX );<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;for (var forZ:int = 0 ; forZ &lt; countZ ; forZ++) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pointArrayZ.push( int(Math.random() * dist) + minZ );<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;//Tweenの引数用のオブジェクト<br />&nbsp;&nbsp; &nbsp;pointObj.x = pointArrayX;<br />&nbsp;&nbsp; &nbsp;pointObj.z = pointArrayZ;<br />&nbsp;&nbsp; &nbsp;//-----------<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; var tweenY:IObjectTween = BetweenAS3.tween(particleArray[i] , { y:2000} , null , tweenTime , Linear.linear);<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;//-----------<br />&nbsp;&nbsp; &nbsp;var tweenXZ:IObjectTween = BetweenAS3.bezier(particleArray[i] , { x:centerX , z:centerZ } , null , pointObj , tweenTime , Linear.linear);<br />&nbsp;&nbsp; &nbsp;//-----------<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;var tweenXYZ:ITween = BetweenAS3.parallel(tweenY , tweenXZ);<br />&nbsp;&nbsp;&nbsp; tweenY.stopOnComplete = false;<br />&nbsp; <br />&nbsp;&nbsp;&nbsp; delay += 0.5;<br />&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; var delayTween:ITween = BetweenAS3.delay(tweenXYZ , delay);<br />&nbsp;&nbsp;&nbsp; delayTween.play();<br />&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; particleTweenArray.push(tweenXYZ);<br />&nbsp;&nbsp;&nbsp; delayTween.addEventListener(TweenEvent.COMPLETE , tweenCompFunc(i));<br />}<br />function tweenCompFunc(index:int):Function {<br />&nbsp;&nbsp;&nbsp; return function(e:TweenEvent):void {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; particleTweenArray[index].play();<br />&nbsp;&nbsp;&nbsp; }<br />}</p>]]></description>
            <link>http://studio-ensyu.com/life-style/2010/01/papervision3dparticlefieldbetw.html</link>
            <guid>http://studio-ensyu.com/life-style/2010/01/papervision3dparticlefieldbetw.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">ActionScript3.0</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">Flash</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">Papervision3D</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">beTweenAS3</category>
            
            
            <pubDate>Fri, 29 Jan 2010 19:33:21 +0900</pubDate>
        </item>
        
        <item>
            <title>papervision3dのParticleFieldをアニメーションさせる。（ディレイを使って、アニメーションをバラバラに実行）</title>
            <description><![CDATA[<p>アニメーションの話はまた次回～<br /> とか書いておきながら、2ヶ月近く放置してしまったのだが・・・。</p><p>最終的には&darr;のような物を作ります。</p> <p><span style="font-size: 120%;"><p><a href="http://studio-ensyu.sakura.ne.jp/files/flash/091122_particleFldEX/particleMoveFld.html" onclick="window.open(this.href,'','resizable=no,location=no,menubar=no,scrollbars=no,status=no,toolbar=no,fullscreen=no,dependent=no,width=1000,height=600,status'); return false"><strong>動作サンプル（重いかもしれないんで別窓で）</strong></a></p> </span></p><p><a href="http://studio-ensyu.sakura.ne.jp/files/file/particleTest.zip"><span style="font-size: 120%;"><strong>サンプルファイル一式（Flash CS4形式）</strong></span></a></p> <p>前回はParticleFieldで生成されるパーティクルにアニメーションを適用させる方法までを解説しました。</p> <p>今回は、それに味付けして、個々にアニメーションするようにして</p><p><span style="font-size: 120%;"><strong><a href="http://studio-ensyu.sakura.ne.jp/files/flash/100128_particleFldEX/particleTest.html" onclick="window.open(this.href,'','resizable=no,location=no,menubar=no,scrollbars=no,status=no,toolbar=no,fullscreen=no,dependent=no,width=1000,height=600,status'); return false"><strong>こんなやつを作ってみましょう。</strong></a></strong></span></p><p>因みに、用意したサンプルのソースでは、ParticleFieldクラスのサブクラスとして実装しています。</p> <p>まず、パーティクルのアニメーションをずらすには、「delay()」を使います。<br /> 前回のコードを、</p> <p class="code">var delay:Number = 0;<br /> for (var i:int = 0 ; i &lt; len ; i++) {<br /> &nbsp;&nbsp;&nbsp; particleArray[i].y = 0;<br /> &nbsp;&nbsp;&nbsp; var tweenY:IObjectTween = BetweenAS3.tween(particleArray[i] , { y:2000} , null , tweenTime , Linear.linear);<br /> &nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; var delayTween:ITween = BetweenAS3.delay(tweenY);<br /> &nbsp;&nbsp;&nbsp; delayTween.play();<br /> }</p> <p>とか書けば、一個一個ばらばらにアニメーションを開始すると思います。<br /> この際のyの目標座標は、ParticleFieldのデフォルトの高さである2000に設定します。</p> <p>前回は、fld.fieldHeightこうかきましたが、どうやらprivateらしく、実行したら、値にアクセスできませんでした。</p> <p>んで、このままだとアニメーションが終わったら、終わったまんまになってしまうので、リピート再生させるために「stopOnComplete = false;」を設定してあげなくてはいけませんが、delayTweenのほうでリピート再生させると、ディレイ時間も反映させてしまうため、ものによっては、ディレイ時間が20秒とかになってしまいます。</p> <p>なので、</p> <p class="code"><strong>var particleTweenArray:Array = new Array();</strong><br /> var delay:Number = 0;<br /> for (var i:int = 0 ; i &lt; len ; i++) {<br /> &nbsp;&nbsp;&nbsp; particleArray[i].y = 0;<br /> &nbsp;&nbsp;&nbsp; var tweenY:IObjectTween = BetweenAS3.tween(particleArray[i] , { y:2000} , null , tweenTime , Linear.linear);<br /> &nbsp;&nbsp;&nbsp; tweenY.stopOnComplete = false;<br /> &nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; var delayTween:ITween = BetweenAS3.delay(tweenY);<br /> &nbsp;&nbsp;&nbsp; delayTween.play();<br /> <br /> &nbsp;&nbsp;&nbsp; <strong>particleTweenArray.push(tweenY);<br /> &nbsp;&nbsp;&nbsp; delayTween.addEventListener(TweenEvent.COMPLETE , tweenCompFunc(i));</strong><br /> }<br /> <strong>function tweenCompFunc(index:int):Function {<br /> &nbsp;&nbsp;&nbsp; return function(e:TweenEvent):void {<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; particleTweenArray[index].play();<br /> &nbsp;&nbsp;&nbsp; }<br /> }</strong></p> <p>こんな風に書き換えます。</p><p>ディレイを与えたムービーが終わったら、リピート再生になっているtweenYのほうを再生開始するように設定します。</p> <p>次回はゆらゆら動くようなアニメーションをつけてみます。</p> <p>因みに、タイムラインコードとして書く場合の全てのコードは</p> <p class="code">import org.papervision3d.view.BasicView;<br /> import org.papervision3d.materials.special.MovieAssetParticleMaterial;<br /> import org.papervision3d.objects.special.ParticleField;<br /> import org.papervision3d.cameras.CameraType;<br /> <br /> import org.libspark.betweenas3.BetweenAS3;<br /> import org.libspark.betweenas3.easing.Linear;<br /> import org.libspark.betweenas3.events.TweenEvent;<br /> import org.libspark.betweenas3.tweens.IObjectTween;<br /> import org.libspark.betweenas3.tweens.ITween;<br /> <br /> <br /> var world:BasicView = new BasicView(640 , 320 , true , false , CameraType.DEBUG);<br /> var particleTweenArray:Array = new Array();<br /> <br /> var mf:MovieAssetParticleMaterial = new MovieAssetParticleMaterial(&quot;test&quot;);<br /> mf.smooth = true;<br /> <br /> var fld:ParticleField = new ParticleField(mf , 200 , 1);<br /> <br /> stage.addChild(world);<br /> world.scene.addChild(fld);<br /> <br /> world.startRendering();<br /> <br /> fld.y = -500<br /> world.camera.zoom = 50;<br /> <br /> var tweenTime:int = 10;<br /> var particleArray:Array = fld.particles;<br /> var len:int = particleArray.length;<br /> <br /> var delay:Number = 0;<br /> for (var i:int = 0 ; i &lt; len ; i++) {<br /> &nbsp;&nbsp;&nbsp; particleArray[i].y = 0;<br /> &nbsp;&nbsp;&nbsp; var tweenY:IObjectTween = BetweenAS3.tween(particleArray[i] , { y:2000} , null , tweenTime , Linear.linear);<br /> &nbsp;&nbsp;&nbsp; tweenY.stopOnComplete = false;<br /> &nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; delay += 0.5;<br /> &nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; var delayTween:ITween = BetweenAS3.delay(tweenY , delay);<br /> &nbsp;&nbsp;&nbsp; delayTween.play();<br /> &nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; particleTweenArray.push(tweenY);<br /> &nbsp;&nbsp;&nbsp; delayTween.addEventListener(TweenEvent.COMPLETE , tweenCompFunc(i));<br /> }<br /> function tweenCompFunc(index:int):Function {<br /> &nbsp;&nbsp;&nbsp; return function(e:TweenEvent):void {<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; particleTweenArray[index].play();<br /> &nbsp;&nbsp;&nbsp; }<br /> }</p>]]></description>
            <link>http://studio-ensyu.com/life-style/2010/01/papervision3dparticlefield-1.html</link>
            <guid>http://studio-ensyu.com/life-style/2010/01/papervision3dparticlefield-1.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">ActionScript3.0</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">Flash</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">Papervision3D</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">beTweenAS3</category>
            
            
            <pubDate>Wed, 27 Jan 2010 18:56:23 +0900</pubDate>
        </item>
        
        <item>
            <title>papervision3dのParticleFieldで生成されるパーティクルをアニメーションさせてみよう。</title>
            <description><![CDATA[<p>似たような事をやってる人が見当たんなかったんで（wonderflをくまなく探せばそういう人もいるかもしれませんが・・・）。<br />
まぁでもなんとかなるだろうということで、<a target="_blank" href="http://papervision3d.googlecode.com/svn/trunk/as3/trunk/docs/index.html">オフシャルのドキュメント</a>と、ソースコードを読みながらやってみました。</p>
<p><a onclick="window.open(this.href,'','resizable=no,location=no,menubar=no,scrollbars=no,status=no,toolbar=no,fullscreen=no,dependent=no,width=1000,height=600,status'); return false" href="http://studio-ensyu.sakura.ne.jp/files/flash/091122_particleFldEX/particleMoveFld.html"><span style="font-size: 130%;"><strong>そしてできたものがこれです。（重いかもしれないんで別窓で）</strong></span></a></p>
<p><a href="http://studio-ensyu.sakura.ne.jp/files/file/particleTest.zip"><span style="font-size: 130%;"><strong>サンプルファイル一式（Flash CS4形式）</strong></span></a></p>
<p>それにしても、こうしてAdobe公式のリファレンスと体裁を同じくしてくれると楽でいいですね。<br />
英語ほとんど分りませんが、こういう形式にしてもらえると、変数・戻り値・引数の型を見ればなんとなくわかりますからね。</p>
<p>ちなみに、Papervision3Dの使い方に関しては、<a target="_blank" href="http://clockmaker.jp/blog/2009/02/pv3d_frame_action_01/">こちらのブログ</a>が詳しいです。<br />
今回Papervision3Dのバージョンは<a target="_blank" href="http://code.google.com/p/papervision3d/">2.1 rev920</a>を使います。<br />
また、アニメーション時のTweenライブラリに、<a href="http://www.libspark.org/wiki/BetweenAS3/en" target="_blank">BetweenAS3</a>を利用します。使用するバージョンはAlpha r3022です。<br />
それぞれダウンロードしてクラスパスを通すか、Flaファイルと同一階層に[org]以下を入れて作業してください。</p>
<p>そんなこんなで本題に入ります。</p>
<p><a href="http://papervision3d.googlecode.com/svn/trunk/as3/trunk/docs/org/papervision3d/objects/special/ParticleField.html" target="_blank">ParticleField</a>に関してはいろんなところで紹介されているので詳細は省きますが、指定した数分だけ、パーティクルをランダムに指定したエリアに配置してくれるという便利なクラスです。</p>
<p>使い方は<a target="_blank" href="http://flash.polig.daa.jp/?day=20080905">このサイト</a>がわりとシンプルに解説してくれていますね。</p>
<p>要は、<a href="http://papervision3d.googlecode.com/svn/trunk/as3/trunk/docs/org/papervision3d/objects/special/ParticleField.html" target="_blank">[ParticleField</a>クラス]のインスタンスを、Papervision3DのsceneにaddChildしてあげればいいわけですね。</p>
<p>ちなみに、<a onclick="window.open(this.href,'','resizable=no,location=no,menubar=no,scrollbars=no,status=no,toolbar=no,fullscreen=no,dependent=no,width=1000,height=600,status'); return false" href="http://studio-ensyu.sakura.ne.jp/files/flash/091122_particleFldEX/particleFld.html"><strong><span style="font-size: 130%;">こんな風</span></strong></a>になります。</p>
<p><a href="http://papervision3d.googlecode.com/svn/trunk/as3/trunk/docs/org/papervision3d/objects/special/ParticleField.html" target="_blank">ParticleField</a>は、第一引数に、パーティクルのマテリアルを受け取りますが、たいていのチュートリアルでは[<a target="_blank" href="http://papervision3d.googlecode.com/svn/trunk/as3/trunk/docs/org/papervision3d/materials/special/ParticleMaterial.html">ParticleMaterial</a>クラス]のインスタンスを渡しています。<br />
このクラスは、指定された色とサイズの正方形をパーティクルの素材にするようです。</p>
<p>ただ、できれば自分で作った素材を使いたいものです。<br />
そうしてドキュメントをたぐっていったら、[<a target="_blank" href="http://papervision3d.googlecode.com/svn/trunk/as3/trunk/docs/org/papervision3d/materials/special/ParticleMaterial.html">ParticleMaterial</a>クラス]のサブクラスに[<a target="_blank" href="http://papervision3d.googlecode.com/svn/trunk/as3/trunk/docs/org/papervision3d/materials/special/BitmapParticleMaterial.html">BitmapParticleMaterial</a>][<a href="http://papervision3d.googlecode.com/svn/trunk/as3/trunk/docs/org/papervision3d/materials/special/MovieAssetParticleMaterial.html" target="_blank">MovieAssetParticleMaterial</a>]というのがあるじゃないですか。</p>
<p>[<a target="_blank" href="http://papervision3d.googlecode.com/svn/trunk/as3/trunk/docs/org/papervision3d/materials/special/BitmapParticleMaterial.html">BitmapParticleMaterial</a>クラス]はパーティクルマテリアルのソースにBitmapDataを、[<a target="_blank" href="http://papervision3d.googlecode.com/svn/trunk/as3/trunk/docs/org/papervision3d/materials/special/MovieAssetParticleMaterial.html">MovieAssetParticleMaterial</a>クラス]は、リンケージさせたインスタンスをそれぞれ指定できるようです。<br />
しかもインスタンスを指定する場合、アニメーションさせることも可能らしい。</p>
<p>てな訳で、ちょいと光ってるグラフィックを作って&quot;test&quot;という名前でリンケージさせて</p>
<p class="code">var mf:MovieAssetParticleMaterial = new MovieAssetParticleMaterial(&quot;test&quot;);<br />
var fld:ParticleField = new ParticleField(mf , 200 , 1);</p>
<p>&nbsp;こうします。<br />
すると指定したグラフィックで、200個のパーティクルを、指定した大きさでランダムに配置します。<br />
ちなみに、サイズの部分に引数を渡さない場合、幅、高さ、奥行きはデフォルト値の2000になります。</p>
<p>さて、問題はここからです。</p>
<p>ここまでできれば、後はこれらのパーティクル一個一個をbeTweenAS3でTweenさせてやればいい。<br />
beTweenAS3のパフォーマンスならば、200個程度きっと軽々さ！？</p>
<p>でもどうやってパーティクル一個一個を取得するんだろう？</p>
<p>そうしてまた、ドキュメントをたぐって[<a target="_blank" class="signatureLink" href="http://papervision3d.googlecode.com/svn/trunk/as3/trunk/docs/org/papervision3d/core/geom/Particles.html#particles">particles</a>]というパラメータを発見、さすがにドキュメントだけでは分らなかったので、幾つかのサイトを見たら、どうやら画面に配置したパーティクルを格納した配列らしい。</p>
<p>[<a href="http://papervision3d.googlecode.com/svn/trunk/as3/trunk/docs/org/papervision3d/objects/special/ParticleField.html" target="_blank">ParticleField</a>クラスの]親クラスである[<a target="_blank" href="http://papervision3d.googlecode.com/svn/trunk/as3/trunk/docs/org/papervision3d/core/geom/Particles.html">Particles</a>クラス]を見てみると[<a target="_blank" class="signatureLink" href="http://papervision3d.googlecode.com/svn/trunk/as3/trunk/docs/org/papervision3d/core/geom/Particles.html#addParticle%28%29">addParticle</a>(particle:<a target="_blank" href="http://papervision3d.googlecode.com/svn/trunk/as3/trunk/docs/org/papervision3d/core/geom/renderables/Particle.html">Particle</a>):void]なんてのがあって、最終的には[particles]には[Particleクラス]のインスタンスの配列になるっぽい。</p>
<p>てことで、「particles[i].x」とか書けば、見事パーティクル一個一個の座標を操作できる。</p>
<p class="code">var tweenTime:int = 10;<br />
var particleArray:Array = fld.particles;<br />
var len:int = particleArray.length;<br />
for (var i:int = 0 ; i &lt; len ; i++) {<br />
&nbsp;&nbsp;&nbsp; //パーティクルの位置を一番下に<br />
&nbsp;&nbsp;&nbsp; particleArray[i].y = 0;<br />
&nbsp;&nbsp;&nbsp; var tweenY:IObjectTween = BetweenAS3.tween(particleArray[i] , { y:fld.fieldHeight} , null , tweenTime , Linear.linear);<br />
&nbsp;&nbsp;&nbsp; tweenY.stopOnComplete = false;<br />
&nbsp;&nbsp;&nbsp; tweenY.play();<br />
}</p>
<p>で、各パーティクルは、下から上までアニメーションします。<br />
beTweenAS3に関しては<a target="_blank" href="http://blog.izm-design.com/2009/08/14-020321.php">コチラ</a>とかが分りやすいです。<br />
あとは、<a target="_blank" href="http://www.project-nya.jp/modules/weblog/details.php?blog_id=1161">にゃあプロジェクト</a>さんが、色々とやってるようです。</p>
<p>ちなみに上記コードは、particleArray[i]のyに0を入れた後、beTweenAS3で0～fld.fieldHeight「フィールドの高さ、つまり一番上」まで、等速で10秒のアニメーションをさせます。</p>
<p>tweenY.stopOnComplete = false;</p>
<p>[stopOnComplete]はその名の通り、アニメーションが終了したらstopするか？<br />
の設定なので、trueで一回きり、falseでリピートになります。これで、個々のパーティクルを下から上にリピート再生させることができました。</p>
<p>ただし、このままだと全てのパーティクルが、一斉に動き出した上に動きも全く一緒です。<br />
なので、アニメーションの開始をずらして、さらには、もっとランダムっぽい曲線的な動きとかを入れたいし、あとは開始点と終了点で違和感なく消えてもらいたいですね。</p>
<p>もういい加減眠いので、アニメーションのブラッシュアップ部分は次回に回します。</p>
<p>ちなみに、今回の全コード</p>
<p class="code">import org.papervision3d.view.BasicView;<br />
import org.papervision3d.materials.special.MovieAssetParticleMaterial;<br />
import org.papervision3d.objects.special.ParticleField;<br />
import org.papervision3d.cameras.CameraType;<br />
<br />
import org.libspark.betweenas3.BetweenAS3;<br />
import org.libspark.betweenas3.easing.Linear;<br />
import org.libspark.betweenas3.events.TweenEvent;<br />
import org.libspark.betweenas3.tweens.IObjectTween;<br />
import org.libspark.betweenas3.tweens.ITween;<br />
<br />
<br />
var world:BasicView = new BasicView(640 , 320 , true , false , CameraType.DEBUG);<br />
var particleTweenArray:Array = new Array();<br />
<br />
var mf:MovieAssetParticleMaterial = new MovieAssetParticleMaterial(&quot;test&quot;);<br />
mf.smooth = true;<br />
<br />
var fld:ParticleField = new ParticleField(mf , 200 , 1);<br />
<br />
stage.addChild(world);<br />
world.scene.addChild(fld);<br />
<br />
world.startRendering();<br />
<br />
fld.y = -500<br />
world.camera.zoom = 50;<br />
<br />
var tweenTime:int = 10;<br />
var particleArray:Array = fld.particles;<br />
var len:int = particleArray.length;<br />
for (var i:int = 0 ; i &lt; len ; i++) {<br />
&nbsp;&nbsp;&nbsp; //パーティクルの位置を一番下に<br />
&nbsp;&nbsp;&nbsp; particleArray[i].y = 0;<br />
&nbsp;&nbsp;&nbsp; var tweenY:IObjectTween = BetweenAS3.tween(particleArray[i] , { y:2000} , null , tweenTime , Linear.linear);<br />
&nbsp;&nbsp;&nbsp; tweenY.stopOnComplete = false;<br />
&nbsp;&nbsp;&nbsp; tweenY.play();<br />
}</p>]]></description>
            <link>http://studio-ensyu.com/life-style/2009/11/papervision3dparticlefield.html</link>
            <guid>http://studio-ensyu.com/life-style/2009/11/papervision3dparticlefield.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">ActionScript3.0</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">Flash</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">Papervision3D</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">beTweenAS3</category>
            
            
            <pubDate>Sun, 22 Nov 2009 00:06:49 +0900</pubDate>
        </item>
        
        <item>
            <title>AirでFlvPlayer</title>
            <description><![CDATA[<p>AirでFLVプレイヤー作りました。</p><p><a href="http://studio-ensyu.sakura.ne.jp/files/file/flvPlayer.zip">&gt;&gt;ダウンロードはコチラ</a></p> <p><a target="_blank" href="http://hakenjob.mycom.co.jp/wcb/">マイコミさんでやらせてもらってるセミナー</a>で受講生からの希望があったんで、Flvプレイヤーを公開します。<br /> 一応ちょこっとだけ改造して、flv f4v mp4(H264のみ)に対応しています。</p> <p>一応ソースコード（CS3形式）も添付してるんで、ご参考までに見てみてください。</p> <p>一応コチラにもソースをぺとり</p> <p class="code">import fl.video.*;<br /> import flash.events.*;<br /> import flash.display.Sprite;<br /> import flash.filesystem.File;<br /> import flash.net.FileFilter;<br /> import flash.desktop.*;<br /> <br /> stage.quality = &quot;best&quot;;<br /> flle_txt.visible = false;<br /> <br /> //ステージの拡大モードを設定<br /> stage.scaleMode = StageScaleMode.NO_SCALE;<br /> stage.align = StageAlign.TOP_LEFT;<br /> <br /> //widhtを基準とした、heightのアス比<br /> var aspect:Number;<br /> <br /> //コントロールを設定<br /> player.playPauseButton = control_mc.playPauseButton_mc;<br /> player.stopButton = control_mc.stopButton_mc;<br /> player.seekBar = control_mc.seekBar_mc;<br /> player.muteButton = control_mc.muteButton_mc;<br /> player.volumeBar = control_mc.volumeBar_mc;<br /> player.fullScreenButton = control_mc.fullScreenButton_mc;<br /> //下マージン<br /> var bottomMargin:int = 3;<br /> //プレイヤーとコントロールのマージン<br /> var ctrlMargin:int = 4;<br /> <br /> //プレイヤーの初期設定<br /> player.autoRewind = true;<br /> player.x = 5;<br /> player.y = 30;<br /> <br /> //player.source = &quot;test.flv&quot;;<br /> <br /> //メタを取得できたら、コントロールをビデオの下に吸着<br /> player.addEventListener(MetadataEvent.METADATA_RECEIVED , moveControl);<br /> //吸着用のメソッド<br /> function moveControl(event:MetadataEvent):void{<br /> &nbsp;&nbsp;&nbsp; aspect = player.metadata.height/player.metadata.width;<br /> &nbsp;&nbsp;&nbsp; windowFit();<br /> }<br /> <br /> //ステージのサイズに合わせてアス比固定で拡大縮小<br /> stage.addEventListener(Event.RESIZE , videoResize);<br /> function videoResize(event:Event):void{<br /> &nbsp;&nbsp;&nbsp; var playerWidth:Number = stage.stageWidth - 10;<br /> &nbsp;&nbsp;&nbsp; var playerHeight:Number = playerWidth * aspect;<br /> &nbsp;&nbsp;&nbsp; var ctrlsHeight:Number = control_mc.height + bottomMargin + player.y;<br /> &nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; if(playerHeight + ctrlsHeight &lt; stage.stageHeight){<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; player.setSize(playerWidth , playerHeight);<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //ドラッグターゲットのサイズ設定<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; dragTarget_mc.width = playerWidth;<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; dragTarget_mc.height = playerHeight;<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //BGのサイズ指定<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; bg_mc.width = stage.width;<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; bg_mc.height = stage.height;<br /> &nbsp;&nbsp;&nbsp; }else{<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; playerHeight = stage.stageHeight - ctrlsHeight;<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; playerWidth = playerHeight/aspect;<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; player.setSize(playerWidth , playerHeight);<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //ドラッグターゲットのサイズ設定<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; dragTarget_mc.width = playerWidth;<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; dragTarget_mc.height = playerHeight;<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //BGのサイズ指定<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; bg_mc.width = stage.width;<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; bg_mc.height = stage.height;<br /> &nbsp;&nbsp;&nbsp; }<br /> &nbsp;&nbsp;&nbsp; ctrlMove();<br /> }<br /> <br /> //ウィンドウを操作するためのオブジェクト<br /> var window:NativeWindow = this.stage.nativeWindow;<br /> <br /> //ウインドウを初期サイズにフィットさせる<br /> function windowFit(){<br /> &nbsp;&nbsp;&nbsp; window.height = 34 + player.y + player.metadata.height + ctrlMargin + control_mc.height + bottomMargin;<br /> &nbsp;&nbsp;&nbsp; window.width = 18 + player.metadata.width;<br /> &nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; flle_txt.text = window.height + &quot;　&quot; + window.width;<br /> &nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; player.setSize(player.metadata.width , player.metadata.height);<br /> &nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; ctrlMove();<br /> }<br /> <br /> //コントロールを右下に吸着<br /> function ctrlMove():void{<br /> &nbsp;&nbsp;&nbsp; control_mc.y = player.y + player.height + 5;<br /> &nbsp;&nbsp;&nbsp; close_btn.x = (player.width+5) - close_btn.width - 4;<br /> &nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; var mov:Number = control_mc.x = (player.width+5) - 318;<br /> &nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; if(mov &gt;= 7){<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; control_mc.x = mov;<br /> &nbsp;&nbsp;&nbsp; } else {<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; control_mc.x = 7;<br /> &nbsp;&nbsp;&nbsp; }<br /> }<br /> <br /> //ボタン設定<br /> open_btn.buttonMode = true;<br /> fit_btn.buttonMode = true;<br /> close_btn.buttonMode = true;<br /> //フィットボタンでムービーサイズを元に戻す<br /> fit_btn.addEventListener(MouseEvent.CLICK , fitVideo);<br /> //ムービーリサイズ<br /> function fitVideo(event:MouseEvent){<br /> &nbsp;&nbsp;&nbsp; windowFit();<br /> }<br /> //クローズボタン<br /> close_btn.addEventListener(MouseEvent.CLICK , winClose);<br /> function winClose(event:MouseEvent){<br /> &nbsp;&nbsp;&nbsp; window.close();<br /> }<br /> <br /> //オープンボタンでのファイル選択処理<br /> open_btn.addEventListener(MouseEvent.CLICK , fileOpen);<br /> <br /> //ファイルタイプをFLVのみに設定<br /> //ファイルブラウズ処理<br /> var fileLoader:File = new File();<br /> fileLoader.addEventListener(Event.SELECT , fileSelected);<br /> var filter:FileFilter = new FileFilter(&quot;Flvファイル&quot;, &quot;*.flv; *f4v; *mp4&quot;);<br /> <br /> function fileOpen(event:MouseEvent):void{<br /> &nbsp;&nbsp;&nbsp; fileLoader.browseForOpen(&quot;ファイルの選択&quot;, [filter]);<br /> }<br /> function fileSelected(event:Event){<br /> &nbsp;&nbsp;&nbsp; player.source = fileLoader.url;<br /> &nbsp;&nbsp;&nbsp; flle_txt.text = fileLoader.url;<br /> }<br /> <br /> //ドラッグ＆ドロップ処理<br /> dragTarget_mc.addEventListener(NativeDragEvent.NATIVE_DRAG_ENTER, onDragIn);<br /> dragTarget_mc.addEventListener(NativeDragEvent.NATIVE_DRAG_DROP, onDrop);<br /> <br /> //ドラッグ許可<br /> function onDragIn(event:NativeDragEvent):void{<br /> &nbsp;&nbsp;&nbsp; flle_txt.text = &quot;Drag&quot;;<br /> &nbsp;&nbsp;&nbsp; var dropData:Clipboard = event.clipboard;<br /> <br /> &nbsp;&nbsp;&nbsp; if (dropData.hasFormat(ClipboardFormats.FILE_LIST_FORMAT)) {<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; NativeDragManager.acceptDragDrop(event.target);<br /> &nbsp;&nbsp;&nbsp; }<br /> }<br /> <br /> //ドロップ処理<br /> function onDrop(event:NativeDragEvent):void{<br /> &nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; var droppedData:Array = event.clipboard.getData(ClipboardFormats.FILE_LIST_FORMAT);<br /> &nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; var file:File = droppedData[droppedData.length -1];<br /> &nbsp;&nbsp;&nbsp; if(file.extension == &quot;flv&quot; || file.extension == &quot;FLV&quot; || file.extension == &quot;F4V&quot; || file.extension == &quot;f4v&quot; || file.extension == &quot;mp4&quot; || file.extension == &quot;MP4&quot;){<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; player.source = file.url;<br /> &nbsp;&nbsp;&nbsp; }<br /> }</p>]]></description>
            <link>http://studio-ensyu.com/life-style/2009/09/airflvplayer.html</link>
            <guid>http://studio-ensyu.com/life-style/2009/09/airflvplayer.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">ActionScript3.0</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">FLV</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">Flash</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">air</category>
            
            
            <pubDate>Sat, 26 Sep 2009 18:53:55 +0900</pubDate>
        </item>
        
        <item>
            <title>ActionScript3.0でXML:その4.エレメントの有無チェック</title>
            <description><![CDATA[<script src="http://studio-ensyu.sakura.ne.jp/files/flash/AC_RunActiveContent.js" language="javascript"></script> <script language="javascript">
	if (AC_FL_RunContent == 0) {
		alert("このページでは \"AC_RunActiveContent.js\" が必要です。");
	} else {
		AC_FL_RunContent(
			'codebase', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0',
			'width', '550',
			'height', '290',
			'src', 'http://studio-ensyu.sakura.ne.jp/files/flash/090612_XMLTest/xmltest',
			'quality', 'high',
			'pluginspage', 'http://www.macromedia.com/go/getflashplayer',
			'align', 'middle',
			'play', 'true',
			'loop', 'true',
			'scale', 'showall',
			'wmode', 'window',
			'devicefont', 'false',
			'id', 'xmltest',
			'bgcolor', '#ffffff',
			'name', 'xmltest',
			'menu', 'true',
			'allowFullScreen', 'false',
			'allowScriptAccess','sameDomain',
			'movie', 'http://studio-ensyu.sakura.ne.jp/files/flash/090612_XMLTest/xmltest',
			'salign', ''
			); //end AC code
	}
</script> <p><a href="http://studio-ensyu.sakura.ne.jp/files/file/xmltest.fla"><strong>&gt;&gt;Flaファイルをダウンロード</strong></a></p> <p>とうとうこのエントリーを最後に、このサンプルともお別れですね。<br /> そういえば、このサンプルの元ネタとも、今週でお別れですね。寂しいものです。</p> <p>さて、前回はエレメントの生成・追加をやったのですが、その際にエレメントがダブってしまうのは、あんまりよろしくないぞ。<br /> というわけで、「XMLクラスに、例えば指定エレメントのノードがあるかどうか調べるメソッドでもないかしら？」と思って探してみたのですが、残念ながらそんな便利なメソッドはありませんでした。</p> <p>例えば<br /> <strong><em>XMLデータ.何かしらのメソッド(@id == &quot;なんか文字列&quot;);</em></strong><br /> で、Boolean型を返してくれると非常にありがたかったのですが・・・</p> <p>しかし、無いもんは無い。って事で、他の処理で代用するしかありません。<br /> 要するに、<strong>指定した値での、XMLエレメントの有無チェック</strong>が出来ればいいのです。</p> <p>というわけで実験。</p> <p class="code">if(test_xml.member.(name ==&quot;田井中　律&quot;) ){<br /> &nbsp;&nbsp;&nbsp; trace(&quot;エレメントがありますよ～ﾉｼ&quot;);<br /> }</p> <p>&nbsp;「エレメントがありますよ～ﾉｼ」と出力されます。<br /> しかし・・・</p> <p class="code">if(test_xml.member.(name ==&quot;ありえないエレメント&quot;) ){<br /> &nbsp;&nbsp;&nbsp; trace(&quot;エレメントがありますよ～ﾉｼ&quot;);<br /> }</p> <p>「エレメントがありますよ～ﾉｼ」と出力されます。<br /> 最悪だ・・・。</p> <p>そこに、救世主が現れた。<br /> その名も「<a target="_blank" href="http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/XML.html#toXMLString()">toXMLString()メソッド</a>」</p> <p>そもそもこのメソッドは、実行したXML オブジェクトのエレメントのストリング表現を返すメソッドです。<br /> なので、例えば「test_xml.member.(name ==&quot;田井中　律&quot;).toXMLString()」を実行すると</p> <p>&lt;member part=&quot;Dram&quot;&gt;<br /> &nbsp; &lt;name&gt;田井中　律&lt;/name&gt;<br /> &lt;/member&gt;</p> <p>上記の値を、XMLデータではなく、<strong>String値</strong>で返します。<br /> 大切なことなので2回言いますが、<strong>上記データは、XMLデータではなくStringデータです。</strong></p> <p>そして、上記のスクリプトを</p> <p class="code">if(test_xml.member.(name ==&quot;田井中　律&quot;).toXMLString() ){<br /> &nbsp;&nbsp; &nbsp;trace(&quot;エレメントがありますよ～ﾉｼ&quot;);<br /> }</p> <p class="code">if(test_xml.member.(name ==&quot;ありえないエレメント&quot;).toXMLString() ){<br /> &nbsp;&nbsp;&nbsp; trace(&quot;エレメントがありますよ～ﾉｼ&quot;);<br /> }</p> <p>このように記述すれば、上のコードは、「エレメントがありますよ～ﾉｼ」と出力され、下のコードは何も出力されません。else節があれば、そちらが実行されます。</p> <p>てなわけで</p> <p>前回のエントリーの、あずにゃん追加ボタン部分の関数を</p> <p class="code">/*----------------------------------------------<br /> ■addAzusaHandler<br /> ■概要<br /> test_xmlにazunyan_xmlを追加する。<br /> ----------------------------------------------*/<br /> function addAzusaHandler(event:MouseEvent):void{<br /> &nbsp;&nbsp;&nbsp; var azunyanName:String = azunyan_xml.name.toString();<br /> &nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; //test_xmlにあずにゃんがいたらreturnする。<br /> &nbsp;&nbsp;&nbsp; if(test_xml.member.(name == azunyanName).toXMLString() ){<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return;<br /> &nbsp;&nbsp;&nbsp; }<br /> &nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; test_xml.appendChild(azunyan_xml);<br /> &nbsp;&nbsp;&nbsp; inIt();<br /> }</p> <p>このように書き換えました。</p> <p class="code">var azunyanName:String = azunyan_xml.name.toString();</p> <p>で、追加予定のXMLデータのnameエレメントの値を取得して、</p> <p class="code">if(test_xml.member.(name == azunyanName).toXMLString() ){<br /> &nbsp;&nbsp;&nbsp; return;<br /> }</p> <p>&nbsp;上記処理で、当該memberエレメントが既に存在していたら、returnで、関数から抜けます。</p> <p>つぎに俺も入部ボタン部分の関数を</p> <p class="code">/*----------------------------------------------<br /> ■addOreHandler<br /> ■概要<br /> oreNameの値とorePartの値から、XMLノードを生成して<br /> test_xmlに追加する。<br /> ----------------------------------------------*/<br /> function addOreHandler(event:MouseEvent):void{<br /> &nbsp;&nbsp;&nbsp; var nameStr:String = oreName.text;<br /> &nbsp;&nbsp;&nbsp; var partStr:String = orePart.text;<br /> &nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; //テキストが空の場合return<br /> &nbsp;&nbsp;&nbsp; if(nameStr == &quot;&quot; || partStr == &quot;&quot;){<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return;<br /> &nbsp;&nbsp;&nbsp; }<br /> &nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; //名前・パートが被る場合return<br /> &nbsp;&nbsp;&nbsp; if(test_xml.member.(@part == partStr).(name == nameStr).toXMLString() ){<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return;<br /> &nbsp;&nbsp;&nbsp; }<br /> &nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; //入力内容から、XMLを生成する<br /> &nbsp;&nbsp;&nbsp; var addXML:XML = &lt;member part={partStr}&gt;&lt;name&gt;{nameStr}&lt;/name&gt;&lt;/member&gt;;<br /> &nbsp;&nbsp;&nbsp; test_xml.appendChild(addXML);<br /> &nbsp;&nbsp;&nbsp; inIt();<br /> }</p> <p>&nbsp;こんな風に書き換えます。<br />こちらは、名前・パートの両方で抽出しています。一人の人間が複数パートを担当したり、ひとつのパートに複数担当がいたりってのはよくあるんで、Jazzとかオーケストラだと特に。</p>]]></description>
            <link>http://studio-ensyu.com/life-style/2009/06/actionscript30xml4.html</link>
            <guid>http://studio-ensyu.com/life-style/2009/06/actionscript30xml4.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">AS3.0でXML</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">ActionScript3.0</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">Flash</category>
            
            
            <pubDate>Wed, 17 Jun 2009 17:29:24 +0900</pubDate>
        </item>
        
        <item>
            <title>ActionScript3.0でXML:その3.エレメントの生成と追加</title>
            <description><![CDATA[<script src="http://studio-ensyu.sakura.ne.jp/files/flash/AC_RunActiveContent.js" language="javascript"></script> <script language="javascript">
	if (AC_FL_RunContent == 0) {
		alert("このページでは \"AC_RunActiveContent.js\" が必要です。");
	} else {
		AC_FL_RunContent(
			'codebase', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0',
			'width', '550',
			'height', '290',
			'src', 'http://studio-ensyu.sakura.ne.jp/files/flash/090612_XMLTest/xmltest',
			'quality', 'high',
			'pluginspage', 'http://www.macromedia.com/go/getflashplayer',
			'align', 'middle',
			'play', 'true',
			'loop', 'true',
			'scale', 'showall',
			'wmode', 'window',
			'devicefont', 'false',
			'id', 'xmltest',
			'bgcolor', '#ffffff',
			'name', 'xmltest',
			'menu', 'true',
			'allowFullScreen', 'false',
			'allowScriptAccess','sameDomain',
			'movie', 'http://studio-ensyu.sakura.ne.jp/files/flash/090612_XMLTest/xmltest',
			'salign', ''
			); //end AC code
	}
</script> <p><a href="http://studio-ensyu.sakura.ne.jp/files/file/xmltest.fla"><strong>&gt;&gt;Flaファイルをダウンロード</strong></a></p> <p>しつこく、このサンプルを使います。</p> <p>さて、次にプログラムからXMLエレメントを生成したり、XMLオブジェクトにエレメントを追加する方法を解説します。<br /> これが出来ると、他のアプリケーションとのデータのやり取りの際に、統一された汎用フォーマットを利用できるので、開発が楽になります。</p> <p>上記サンプルだと、「あずにゃん入部」ボタンと「俺も入部」ボタンになりますね。</p> <p>あずにゃん入部ボタンは予め用意した下記のようなXMLデータを利用しています。</p> <p class="code">//あずにゃんのデータ<br /> var azunyan_xml:XML = <br /> &lt;member part=&quot;Guitar&quot;&gt;<br /> &nbsp;&nbsp;&nbsp; &lt;name&gt;中野　梓&lt;/name&gt;<br /> &lt;/member&gt;;</p> <p>&nbsp;追加するボタンの処理は</p> <p class="code">test_xml.appendChild(azunyan_xml);</p> <p>&nbsp;このように、「XMLデータ.appendChild(追加するXMLデータ)」と記述します。<br /> すると、「&lt;houkagoTeaTime&gt;」エレメントの末尾に、指定したXMLデータが追加されます。</p><p><strong>その後、コンボボックスのデータプロバイダの設定処理を行えば、入部した部員やパートがコンボボックスに追加されます。</strong></p> <p>次に「俺も入部」ボタンで、入力データから生成したエレメントの挿入は</p> <p class="code">var nameStr:String = oreName.text;<br /> var partStr:String = orePart.text;<br /><br /> //テキストが空の場合return<br />if(nameStr == &quot;&quot; || partStr == &quot;&quot;){<br />&nbsp;&nbsp;&nbsp; return;<br />}<br /> <br />var addXML:XML = &lt;member part={partStr}&gt;&lt;name&gt;{nameStr}&lt;/name&gt;&lt;/member&gt;;<br /> test_xml.appendChild(addXML);</p> <p>&nbsp;このように記述します。「oreName」「orePart」はそれぞれテキスト入力のテキストフィールドです。どちらかのテキストが入ってなかったら、returnによって、以降の処理を飛ばします。</p> <p>キモになるのは、</p> <p class="code">var addXML:XML = &lt;member part={partStr}&gt;&lt;name&gt;{nameStr}&lt;/name&gt;&lt;/member&gt;;</p> <p>この部分です。<br /> ここで実際に入力データを格納した変数から、XMLエレメントを生成してるのですが、その際XML表現の中に変数を使う場合は「{変数名}」とします。</p> <p>もし、{}を使用しなかった場合、「partStr」や「nameStr」は普通に文字列として扱われて、下記のようなXMLエレメントになってしまいます。気をつけましょう。</p> <p class="code">&lt;member part=partStr&gt;<br /> &nbsp;&nbsp;&nbsp; &lt;name&gt;nameStr&lt;/name&gt;<br /> &lt;/member&gt;;</p> <p>&nbsp;これで、XMLデータの動的な生成が出来ましたが、問題が残ってます。<br />このままだと、あずにゃんが何人も何人も、桜高校軽音部に入部できてしまいます。</p><p>それはいけません。</p><p>なぜなら僕らの生きがいに、あずにゃんは一人だけです。だからこそ可愛いのです。</p><p>それ以外にも、例えばコンボボックスにデータを再設定する際に、「<a target="_blank" href="http://studio-ensyu.com/life-style/2009/06/actionscript30xml1.html">その1</a>」のやり方のまんまだと、あずにゃんを追加した場合に、Guitarの選択肢が2つ入ってしまったりといった残念が発生します。</p><p>てなわけで、次回はエレメントの有無をチェックしたり、ユニークチェックしたりとかそういう処理を紹介します。</p>]]></description>
            <link>http://studio-ensyu.com/life-style/2009/06/actionscript30xml3.html</link>
            <guid>http://studio-ensyu.com/life-style/2009/06/actionscript30xml3.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">AS3.0でXML</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">ActionScript3.0</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">Flash</category>
            
            
            <pubDate>Wed, 17 Jun 2009 15:14:23 +0900</pubDate>
        </item>
        
        <item>
            <title>ActionScript3.0でXML:その2.コンボボックスでエレメントの抽出</title>
            <description><![CDATA[<script src="http://studio-ensyu.sakura.ne.jp/files/flash/AC_RunActiveContent.js" language="javascript"></script> <script language="javascript">
	if (AC_FL_RunContent == 0) {
		alert("このページでは \"AC_RunActiveContent.js\" が必要です。");
	} else {
		AC_FL_RunContent(
			'codebase', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0',
			'width', '550',
			'height', '290',
			'src', 'http://studio-ensyu.sakura.ne.jp/files/flash/090612_XMLTest/xmltest',
			'quality', 'high',
			'pluginspage', 'http://www.macromedia.com/go/getflashplayer',
			'align', 'middle',
			'play', 'true',
			'loop', 'true',
			'scale', 'showall',
			'wmode', 'window',
			'devicefont', 'false',
			'id', 'xmltest',
			'bgcolor', '#ffffff',
			'name', 'xmltest',
			'menu', 'true',
			'allowFullScreen', 'false',
			'allowScriptAccess','sameDomain',
			'movie', 'http://studio-ensyu.sakura.ne.jp/files/flash/090612_XMLTest/xmltest',
			'salign', ''
			); //end AC code
	}
</script> <p><a href="http://studio-ensyu.sakura.ne.jp/files/file/xmltest.fla"><strong>&gt;&gt;Flaファイルをダウンロード</strong></a></p> <p>今回も、このサンプルを使います。</p> <p><a target="_blank" href="http://studio-ensyu.com/life-style/2009/06/actionscript30xml1.html">前回のエントリー</a>でコンボボックスに、それぞれ「nameエレメント」と、「part属性」をデータプロバイダとして設定しました。</p> <p>コンボボックスの、どの値（セル）が選択されているかは「コンボボックスインスタンス.selectedItem」で参照できるので、</p> <p class="code">nameCmb.addEventListener(Event.CHANGE , nameSelectHandler);<br /> /*----------------------------------------------<br /> ■nameSelectHandler<br /> ■概要<br /> nameCmbから、エレメントを選択すると、選択されたエレメントをselectedTxtAreaに表示し<br /> 当該エレメントをsetected_xmlに代入する<br /> ----------------------------------------------*/<br /> function nameSelectHandler(event:Event):void{<br /> &nbsp;&nbsp;&nbsp; var selectedNodeName:String = event.target.selectedItem.data.toString();<br /> &nbsp;&nbsp;&nbsp; setected_xml = new XMLList(test_xml.member.(name == selectedNodeName) );<br /> &nbsp;&nbsp;&nbsp; selectedTxtArea.text = setected_xml;<br /> }</p> <p>&nbsp;コンボボックスの、選ばれているセルが変更された際に発行されるイベント「CHANGEイベント」で、新しく選ばれたセルが保持している「data」プロパティを取得した値により、「test_xml」から抽出しています。</p> <p>「part属性」で抽出する場合は</p> <p class="code">setected_xml = new XMLList(test_xml.member.(@part == selectedNodepart) );</p> <p>こうなります。</p> <p><a target="_blank" href="http://studio-ensyu.com/life-style/2009/06/actionscript30xmlxml.html">「ActionScript3.0でXML　XMLの基本的な使い方」</a>の応用ですね。</p><p>因みに、ひとつのパートに2人（ツインギター）や、一人の人間が複数パート（ギター&amp;ボーカル）なんてケースも存在するため、抽出したデータは、XMLListクラスを利用します。<br />仮に、XMLクラスを使用した場合、抽出されたエレメントが単一ならば問題ないのですが、複数のエレメントが抽出された場合、ランタイムエラーが発生します。</p>]]></description>
            <link>http://studio-ensyu.com/life-style/2009/06/actionscript30xml2.html</link>
            <guid>http://studio-ensyu.com/life-style/2009/06/actionscript30xml2.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">AS3.0でXML</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">ActionScript3.0</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">Flash</category>
            
            
            <pubDate>Tue, 16 Jun 2009 17:29:55 +0900</pubDate>
        </item>
        
        <item>
            <title>ActionScript3.0でXML:その1.まずはAS3.0らしい扱い方（for eachとかそういうやつ）</title>
            <description><![CDATA[<script src="http://studio-ensyu.sakura.ne.jp/files/flash/AC_RunActiveContent.js" language="javascript"></script> <script language="javascript">
	if (AC_FL_RunContent == 0) {
		alert("このページでは \"AC_RunActiveContent.js\" が必要です。");
	} else {
		AC_FL_RunContent(
			'codebase', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0',
			'width', '550',
			'height', '290',
			'src', 'http://studio-ensyu.sakura.ne.jp/files/flash/090612_XMLTest/xmltest',
			'quality', 'high',
			'pluginspage', 'http://www.macromedia.com/go/getflashplayer',
			'align', 'middle',
			'play', 'true',
			'loop', 'true',
			'scale', 'showall',
			'wmode', 'window',
			'devicefont', 'false',
			'id', 'xmltest',
			'bgcolor', '#ffffff',
			'name', 'xmltest',
			'menu', 'true',
			'allowFullScreen', 'false',
			'allowScriptAccess','sameDomain',
			'movie', 'http://studio-ensyu.sakura.ne.jp/files/flash/090612_XMLTest/xmltest',
			'salign', ''
			); //end AC code
	}
</script> <p><a href="http://studio-ensyu.sakura.ne.jp/files/file/xmltest.fla"><strong>&gt;&gt;Flaファイルをダウンロード</strong></a></p> <p>ActionScript 3.0でXMLを扱う仕組みが簡単になって凄く楽になりましたねぇ。</p> <p>上のサンプルでは、一番右のテキストエリアに生XMLデータ、左のテキストエリアに、左側のコンボボックスから抽出されたエレメントのみを表示するようになっています。</p> <p>さらに、新しいエレメントの追加や、ユーザーの入力から新たなノードを作る機能と、追加される際に、すでに登録されいるかどうかを調べて、2重登録を防ぐ機能を実装しています。</p> <p>とはいえ、いきなり全機能を解説するのはアレなんで、何回かに分けて、ActionScript3.0でXMLを扱う仕組みをちょこっと解説してみようと思います。</p> <p>まずはXMLを用意しましょう。</p> <p class="code">//テスト用XMLデータ<br /> var test_xml:XML = <br /> &lt;houkagoTeaTime&gt;<br /> &nbsp;&nbsp; &nbsp;&lt;member part=&quot;Guitar&quot;&gt;<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;name&gt;平沢　唯&lt;/name&gt;<br /> &nbsp;&nbsp; &nbsp;&lt;/member&gt;<br /> &nbsp;&nbsp; &nbsp;&lt;member part=&quot;Bass&quot;&gt;<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;name&gt;秋山　澪&lt;/name&gt;<br /> &nbsp;&nbsp; &nbsp;&lt;/member&gt;<br /> &nbsp;&nbsp; &nbsp;&lt;member part=&quot;Keyboard&quot;&gt;<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;name&gt;琴吹　紬&lt;/name&gt;<br /> &nbsp;&nbsp; &nbsp;&lt;/member&gt;<br /> &nbsp;&nbsp; &nbsp;&lt;member part=&quot;Dram&quot;&gt;<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;name&gt;田井中　律&lt;/name&gt;<br /> &nbsp;&nbsp; &nbsp;&lt;/member&gt;<br /> &lt;/houkagoTeaTime&gt;;</p> <p>こんな感じでScriptを書きます。AS3.0では、コード内にもXMLを記述出来るんで、一々読み込む必要のないデータや、構造体を作って管理していた変数なんかは、今後XMLに統一するのもいいかもしれませんね。</p> <p>さて、早速これをプログラム内で使ってみましょう。<br /> てことで、左側のコンボボックスにXMLのデータから、値を抽出して、初期設定してみましょう。</p> <p class="code">import fl.data.DataProvider; <br /> //コンボボックスのデータプロバイダ。<br /> var nameItems:Array;<br /> <br /> function setNameCmb(){<br /> &nbsp;&nbsp;&nbsp; nameItems = new Array();<br /> &nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; for each(var elements:Object in test_xml.member){<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; nameItems.push({<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; label:elements.name.toString() ,<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; data:elements.name.toString()<br /> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; });<br /> &nbsp;&nbsp;&nbsp; }<br /> &nbsp;&nbsp;&nbsp; nameCmb.dataProvider = new DataProvider(nameItems);<br /> }</p> <p>サンプルの、「名前で抽出のコンボボックス」の設定の記述です。<br /> nameCmbは、コンボボックスのインスタンス名ですので、コードの最後の</p> <p class="code">nameCmb.dataProvider = new DataProvider(nameItems);</p> <p>この記述で、コンボボックスに「XMLから抽出した値を構造体に格納した配列」を設定しています。</p> <p>んで、実際にXMLに対して処理をしてるのが</p> <p class="code">for each(var elements:Object in test_xml.member)</p> <p>になります。</p> <p>for eachは、()内の「in」の後ろに記述された、XMLエレメントに対して、エレメント数分、繰り返し処理を行います。<br /> このプログラムだと「test_xmlの、memberというエレメントの数分、繰り返し処理をしなさい」という意味で、さらに「in」の前 の「var elements:Object」は、処理の対象のエレメントの一時確保変数です。まぁ「for文」の「var i:int = 0」みたいなもんだと思って下さい。</p> <p>なので、正しくは「test_xmlの、memberというエレメントの数分、elementsという変数名で、繰り返し処理をしなさい」となります。</p> <p>コンボボックスのデータプロバイダは、「label」と「data」が入った構造体の配列を使用するので</p> <p class="code">nameItems.push({<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; label:elements.name.toString() ,<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; data:elements.name.toString()<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; });</p> <p>このようになります。<br /> これで、たとえば「nameItems[0].label」とか「nameItems[2].data」とかで、値をとりだすことができるようになります。要するに、「label」と「data」という2つのデータを対にして、リスト的に扱えるようになるわけです。</p> <p>なるほど、コンボボックスとは相性が良さそうです。</p> <p>ActionScript3.0では、「タグ名.タグ名」という風に、「childNode」とか書かずに、直接タグ名でエレメントを操作できるので、</p> <p class="code">label:elements.name.toString()</p> <p>これだけで、対象ノードのデータを取得することができます。<br /> 上の例だと、elementsは、for each の処理対象のtest_xml.memberエレメントなので、</p> <p class="code">test_xml.member[i].name.toString();</p> <p>て な具合になりますね。ちなみに、複数のノードがある場合は、上のように「test_xml.member[5]」とかで、直接エレメントにアクセスすることが できるので、for each を使わなくても、通常のfor文使って、[i]でXMLエレメントを操作しても構いません。for eachを使った方が圧倒的に楽ですが・・・</p> <p>何はともあれ、これで晴れてバンドメンバーの名前を抽出出来ました。</p> <p>では次は担当パートを抽出してみたいところですが、こちらは「&lt;member part=&quot;Bass&quot;&gt;」のように、属性になっています。さてどうやってとりだそう・・・</p> <p>AS2.0時代は、attributeなんてもんを使ってましたが、AS3.0からは</p> <p class="code">test_xml.member[i].@part.toString();</p> <p>でOK。名前の前に「@」をつけるだけ。</p> <p>なので、コンボボックスの「パートで抽出」は</p> <p class="code">partItems.push({<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; label:elements.@part.toString() ,<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; data:elements.@part.toString()<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; });</p> <p>これでOK。<br /> ただし、ひとつのバンドに同じ楽器担当が複数いる場合もあるので（ツインギターとかツインボーカルとか）ユニークチェックをかけたりしてるんですが、それはまた次の機会に。</p>]]></description>
            <link>http://studio-ensyu.com/life-style/2009/06/actionscript30xml1.html</link>
            <guid>http://studio-ensyu.com/life-style/2009/06/actionscript30xml1.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">AS3.0でXML</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">ActionScript3.0</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">Flash</category>
            
            
            <pubDate>Fri, 12 Jun 2009 17:34:48 +0900</pubDate>
        </item>
        
        <item>
            <title>ActionScript3.0でXML:その0.XMLの基本的な使い方</title>
            <description><![CDATA[<script src="http://studio-ensyu.sakura.ne.jp/files/flash/AC_RunActiveContent.js" language="javascript"></script> <script language="javascript">
	if (AC_FL_RunContent == 0) {
		alert("このページでは \"AC_RunActiveContent.js\" が必要です。");
	} else {
		AC_FL_RunContent(
			'codebase', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0',
			'width', '550',
			'height', '290',
			'src', 'http://studio-ensyu.sakura.ne.jp/files/flash/090612_XMLTest/xmltest',
			'quality', 'high',
			'pluginspage', 'http://www.macromedia.com/go/getflashplayer',
			'align', 'middle',
			'play', 'true',
			'loop', 'true',
			'scale', 'showall',
			'wmode', 'window',
			'devicefont', 'false',
			'id', 'xmltest',
			'bgcolor', '#ffffff',
			'name', 'xmltest',
			'menu', 'true',
			'allowFullScreen', 'false',
			'allowScriptAccess','sameDomain',
			'movie', 'http://studio-ensyu.sakura.ne.jp/files/flash/090612_XMLTest/xmltest',
			'salign', ''
			); //end AC code
	}
</script> <p><a href="http://studio-ensyu.sakura.ne.jp/files/file/xmltest.fla"><strong>&gt;&gt;Flaファイルをダウンロード</strong></a></p> <p>「<a target="_blank" href="http://studio-ensyu.com/life-style/2009/06/actionscript30xml1.html">ActionScript3.0のXMLの取り扱い その1.</a>」の方を先に書いたあとで、そういえば、この話のさらに前提となる部分を多く省いてたなぁという事で、その辺を解説します。</p> <p class="code">//テスト用XMLデータ<br /> var test_xml:XML = <br /> &lt;houkagoTeaTime&gt;<br /> &nbsp;&nbsp; &nbsp;&lt;member part=&quot;Guitar&quot;&gt;<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;name&gt;平沢　唯&lt;/name&gt;<br /> &nbsp;&nbsp; &nbsp;&lt;/member&gt;<br /> &nbsp;&nbsp; &nbsp;&lt;member part=&quot;Bass&quot;&gt;<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;name&gt;秋山　澪&lt;/name&gt;<br /> &nbsp;&nbsp; &nbsp;&lt;/member&gt;<br /> &nbsp;&nbsp; &nbsp;&lt;member part=&quot;Keyboard&quot;&gt;<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;name&gt;琴吹　紬&lt;/name&gt;<br /> &nbsp;&nbsp; &nbsp;&lt;/member&gt;<br /> &nbsp;&nbsp; &nbsp;&lt;member part=&quot;Dram&quot;&gt;<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;name&gt;田井中　律&lt;/name&gt;<br /> &nbsp;&nbsp; &nbsp;&lt;/member&gt;<br /> &lt;/houkagoTeaTime&gt;;</p> <p>こんなXMLデータを用意したとします。</p> <p>そもそもAS3.0でXMLデータを扱う場合は</p> <ol>     <li><a target="_blank" href="http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/XML.html">XMLクラス</a></li>     <li><a href="http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/XMLList.html">XMLListクラス</a></li> </ol> <p>を使います。</p> <p>これらの違いは、詳しくは<a target="_blank" href="http://help.adobe.com/ja_JP/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7ff5.html">こちらのリンク</a>にまかせるとして、簡単に説明すると。<br /> XMLのタグで表わされる部分を、ノードだとかエレメントだとか呼んだりしますが、XMLクラスは、必ず一つのXMLエレメントで構成されている必要があります。</p> <p>なので、複数のエレメントを同じレベルに並べることができません。</p> <p>上記サンプルの例では、test_xmlは「&lt;houkagoTeaTime&gt;」という単一のエレメントで構成されています。</p> <p>XMLListクラスは、複数のエレメントを扱います。<br /> 例えば</p> <p class="code">var testData:String = <br /> &lt;member part=&quot;Guitar&quot;&gt;<br /> &nbsp;&nbsp;&nbsp; &lt;name&gt;平沢　唯&lt;/name&gt;<br /> &lt;/member&gt;;<br /> <br /> testData += &lt;member part=&quot;Bass&quot;&gt;<br /> &nbsp;&nbsp;&nbsp; &lt;name&gt;秋山　澪&lt;/name&gt;<br /> &lt;/member&gt;;<br /> <br /> testData += &lt;member part=&quot;Keyboard&quot;&gt;<br /> &nbsp;&nbsp;&nbsp; &lt;name&gt;琴吹　紬&lt;/name&gt;<br /> &lt;/member&gt;;<br /> <br /> testData += &lt;member part=&quot;Dram&quot;&gt;<br /> &nbsp;&nbsp;&nbsp; &lt;name&gt;田井中　律&lt;/name&gt;<br /> &lt;/member&gt;;</p> <p>こんなコードがあったとして、<br /> testDataの値は</p> <p>&lt;member part=&quot;Guitar&quot;&gt;<br /> &nbsp; &lt;name&gt;平沢　唯&lt;/name&gt;<br /> &lt;/member&gt;<br /> &lt;member part=&quot;Bass&quot;&gt;<br /> &nbsp; &lt;name&gt;秋山　澪&lt;/name&gt;<br /> &lt;/member&gt;<br /> &lt;member part=&quot;Keyboard&quot;&gt;<br /> &nbsp; &lt;name&gt;琴吹　紬&lt;/name&gt;<br /> &lt;/member&gt;<br /> &lt;member part=&quot;Dram&quot;&gt;<br /> &nbsp; &lt;name&gt;田井中　律&lt;/name&gt;<br /> &lt;/member&gt;</p> <p>このように、複数の「&lt;member&gt;」というエレメントで構成されたXML表現になります。<br /> このString型の変数をXMLデータとして扱う場合。</p> <p class="code">var test_xml:XML = new XML(testData);</p> <p>だと、コンパイルエラーになりますが</p> <p class="code">var test_xml:XMLList = new XMLList(testData);</p> <p>という風に、XMLListクラスを利用すると、コンパイルエラーにはなりません。<br /> ただし、複数のエレメントを持ったXMLListオブジェクトは、XMLクラスのメソッドを使う事が出来ないので、使いどころとしては、プログラム上で生成したXMLエレメントの一時作業用に、XMLListクラスを利用し、生成されたXMLListを、XMLクラスのオブジェクトと連結する。といったイメージでしょうか。</p> <p>なので、基本的にはXMLクラスのオブジェクトに対して処理をします。</p> <p>あとはエレメントの抽出方法ですが、<br /> サンプルのXMLデータから値を抽出する場合の例をいくつか。</p> <p class="code">trace(test_xml.member);</p> <p>の出力結果、すべての&lt;member&gt;エレメントを取得します。<br /> &lt;member part=&quot;Guitar&quot;&gt;<br /> &nbsp; &lt;name&gt;平沢　唯&lt;/name&gt;<br /> &lt;/member&gt;<br /> &lt;member part=&quot;Bass&quot;&gt;<br /> &nbsp; &lt;name&gt;秋山　澪&lt;/name&gt;<br /> &lt;/member&gt;<br /> &lt;member part=&quot;Keyboard&quot;&gt;<br /> &nbsp; &lt;name&gt;琴吹　紬&lt;/name&gt;<br /> &lt;/member&gt;<br /> &lt;member part=&quot;Dram&quot;&gt;<br /> &nbsp; &lt;name&gt;田井中　律&lt;/name&gt;<br /> &lt;/member&gt;</p> <p class="code">trace(test_xml.member.name);</p> <p>の出力結果、すべての&lt;member&gt;の&lt;name&gt;エレメントを取得します。<br /> &lt;name&gt;平沢　唯&lt;/name&gt;<br /> &lt;name&gt;秋山　澪&lt;/name&gt;<br /> &lt;name&gt;琴吹　紬&lt;/name&gt;<br /> &lt;name&gt;田井中　律&lt;/name&gt;</p> <p class="code">trace(test_xml.member[0]);</p> <p>の出力結果、指定したindexのエレメントを取得します。<br /> &lt;member part=&quot;Guitar&quot;&gt;<br /> &nbsp; &lt;name&gt;平沢　唯&lt;/name&gt;<br /> &lt;/member&gt;</p> <p class="code">trace(test_xml.member[0].name);</p> <p>の出力結果、指定したindexのエレメントを取得します。<br /> 平沢　唯</p> <p class="code">trace(test_xml.member.@part);</p> <p>属性を取得する場合、@を付けます。出力結果は<br /> GuitarBassKeyboardDram</p> <p class="code">trace(test_xml.member[0].@part);</p> <p>もちろんindexを指定することもできます。</p> <p class="code">trace(test_xml.member.(@part == &quot;Dram&quot;) );</p> <p>条件抽出する場合は上記のように記述。<br /> 出力結果は<br /> &lt;member part=&quot;Dram&quot;&gt;<br /> &nbsp; &lt;name&gt;田井中　律&lt;/name&gt;<br /> &lt;/member&gt;</p> <p class="code">trace(test_xml.member.(name == &quot;秋山　澪&quot;) );</p> <p>エレメントの値に対しても条件抽出できます。<br /> 出力結果は<br /> &lt;member part=&quot;Bass&quot;&gt;<br /> &nbsp; &lt;name&gt;秋山　澪&lt;/name&gt;<br /> &lt;/member&gt;</p><p>以上が、ActionScript3.0でXMLを扱う際の、ほんとのほんとに基礎部分です。<br />以下、用語紹介です。（Flashのヘルプから引用）</p><ul><li><p>エレメント : XML ドキュメント内の単一アイテム。開始タグと終了タグ (タグも含みます) の間にあるコンテンツにより識別されます。 XML エレメントには、テキストデータ、その他のエレメントを含めることができます。また、空であってもかまいません。</p></li><li><p>空のエレメント : 子エレメントを含まない XML エレメント。 空のエレメントは、自己終了タグ（<samp class="codeph">&lt;element/&gt;</samp> など）として記述されることがよくあります。</p></li><li><p>ドキュメント : 単一の XML 構造。 XML ドキュメントには、任意の数のエレメントを含めることができます (また、単一の空のエレメントのみで構成することもできます)。ただし、XML ドキュメントには、ドキュメント内の他のすべてのエレメントを含む単一の最上位エレメントが存在する必要があります。</p></li><li><p>ノード : XML エレメントの別名。</p></li><li><p>属性：エレメント内部にネストする個別の子エレメントとしてではなく、<samp class="codeph">attributename=&quot;value&quot;</samp> の形式でエレメントの開始タグに記述されるエレメントに関連する名前付き値。</p></li></ul>]]></description>
            <link>http://studio-ensyu.com/life-style/2009/06/actionscript30xmlxml.html</link>
            <guid>http://studio-ensyu.com/life-style/2009/06/actionscript30xmlxml.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">AS3.0でXML</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">ActionScript3.0</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">Flash</category>
            
            
            <pubDate>Wed, 10 Jun 2009 00:01:27 +0900</pubDate>
        </item>
        
        <item>
            <title>flashコンテンツのフルスクリーン表示と、ハードウェアアクセラレーション</title>
            <description><![CDATA[<p>今更な感がありますが、AS3.0から、簡単にフルスクリーン機能を実装できるようになりました。</p> <p>その方法は</p> <ol>     <li>FlvPlaybackコンポーネントから、フルスクリーンボタンが配置されたコンポーネントを選択する。</li>     <li>FLV Playback カスタム UI コンポーネントのFullScreenButtonを配置する。</li>     <li>enterFullScreenDisplayState () メソッドを実行する</li>     <li>スクリプトで実装する。</li> </ol> <p>の4パターンが考えられるでしょう。</p> <p>しかし、この4パターンのうち、1～3は、Flvムービーにしか適用できず。<br /> さらに、FlvPlaybackコンポーネントを利用し、かつ、ディスプレイカードによるハードウェアアクセラレーションを利用する場合、コンポーネントの矩形範囲で拡大されてしまい、ビデオソースの解像度は無視されます。<br /> <br /> 例えば</p> <ol>     <li>実際のビデオのソースは、1920&times;1080のフルHDサイズだが、初期起動時は480&times;270で表示する。</li>     <li>画面に配置されたひとつのFlvPlaybackコンポーネントで、480&times;270画面内表示と、1920&times;1080フルスクリーンを切り替える。</li> </ol> <p>上記のケースだと、フルHDの映像を480&times;270に縮小表示している場合、フルスクリーンにした際に<br /> 480&times;270で表示している画面をスケーリングしてしまうため（小さい動画をハードウェア側でスムージングを掛けて表示される）ソースがフルHDの映像だとしても、表示上480&times;270などに縮小している場合は、縮小された画面を引き伸ばしてしまい、小さい動画をただ引き伸ばしただけになってしまいます。</p> <p>どうやらコレは、上記1～3のフルスクリーン実装方法だと、FlvPlaybackコンポーネントのメソッドを呼び出すかたちになるみたいなのですが（FlvPlaybackのenterFullScreenDisplayState () メソッド）どうやらこのメソッドを実行すると、<strong>FlvPlaybackコンポーネントの矩形範囲をハードウェアアクセラレーションでスケーリング表示する</strong>ようです。<span style="color: rgb(255, 0, 0);"><strong><span style="font-size: 130%;">（予想ですが！！）</span></strong></span></p> <p>結果、小さいサイズの動画をただ引き伸ばしたような映像になってしまいます。</p> <p>そこで、FlvPlaybackコンポーネントの機能を使わずに、4の「スクリプトで実装する」ことにしましょう。<br /> スクリプトで実装すると、Flvコンテンツだけでなく、実際のFlashコンテンツもFullScreenで表示することが出来るので、こちらで実装するほうが汎用性がありそうですしね。</p> <p>さて、その方法ですが</p> <p>stage.<a target="_blank" href="http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/flash/display/Stage.html#displayState"><em><strong>displayState </strong></em></a>= <a target="_blank" href="http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/flash/display/StageDisplayState.html"><em><strong>StageDisplayState</strong></em></a>.FULL_SCREEN;</p> <p>と、stageのdisplayStateプロパティを、フルスクリーンなパラメータに設定するだけで、とりあえずFullScreenに出来ます。簡単です。プロパティにパラメータが入ったと同時にフルスクリーンが実行されます。<br /> しかし問題が、コレだけではハードウェアアクセラレーションがかかりません。</p> <p>なので、上記のコードを実行する前に、</p> <p>stage.<a target="_blank" href="http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/flash/display/Stage.html#fullScreenSourceRect"><em><strong>fullScreenSourceRect </strong></em></a>= new <a target="_blank" href="http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/flash/geom/Rectangle.html"><em><strong>Rectangle</strong></em></a>(0, 0, 1920, 1080);</p> <p>上記のコードを実行し、<span style="font-size: 130%;"><strong>フルスクリーンで拡大する矩形エリアを設定</strong></span>します。</p> <p>fullScreenSourceRectプロパティを設定すると<br /> <em>可能な場合、拡大 / 縮小は、ユーザーのコンピュータ上でグラフィックカードやビデオカードを使用してハードウェアで行われます。</em></p> <p>てことで、こういうコードになります。</p> <p class="code">stage.fullScreenSourceRect = new Rectangle(0, 0, 1920, 1080);<br />             stage.displayState = StageDisplayState.FULL_SCREEN;</p> <p>FlvPlaybackコンポーネントの<a target="_blank" href="http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/fl/video/FLVPlayback.html#fullScreenTakeOver"><em><strong>fullScreenTakeOver</strong></em></a>プロパティがtrueの場合（通常デフォルトでture）フルスクリーンに移行すると、自動的にFlvPlaybackコンポーネントは前面に表示され、フルHDのビデオのエリア「Rectangle(0, 0, 1920, 1080);」に対して、フルスクリーンのディスプレイアクセラレーションが実行されます。</p> <p>この方法を利用すれば、Flvではなく、通常のFlashコンテンツに対してフルスクリーン機能を実装できますし、<a target="_blank" href="http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/fl/video/FLVPlayback.html#fullScreenTakeOver"><em><strong>fullScreenTakeOver</strong></em></a>プロパティにfalseを設定した場合は、FlvPlaybackを含んだFlashコンテンツのデザインを、そのままフルスクリーンに出来ます。<br /> その際は、Rectangleに対してRectangle(0, 0, Flashコンテンツの横幅, Flashコンテンツの高さ)を渡してやればOK！</p> <p>ただし、フルスクリーンを実装する再は、スクリプトで実装する再もFlvPlaybackのメソッドを利用する場合も<br /> <a target="_blank" href="http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/flash/display/Stage.html#displayState">必ずマウスクリックまたはキー操作をトリガにする必要が</a>ありあますので、ご注意を。</p> <p>そして、貼り付けるHTML側の、allowFullScreenをtrueに設定してあげるのを忘れないように。</p>]]></description>
            <link>http://studio-ensyu.com/life-style/2009/04/flash.html</link>
            <guid>http://studio-ensyu.com/life-style/2009/04/flash.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">ActionScript3.0</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">FLV</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">Flash</category>
            
            
            <pubDate>Wed, 15 Apr 2009 19:42:20 +0900</pubDate>
        </item>
        
        <item>
            <title>closeVideoPlayer()メソッドを使うと、再度再生したときに音声が再生されない。</title>
            <description><![CDATA[<p>前回の記事「<a href="http://studio-ensyu.com/life-style/2009/04/flvplaybackclosevideoplayer.html" target="_blank">FLVPlaybackコンポーネントで、closeVideoPlayer()メソッドを使う。</a>」との2部構成みたいな感じです。</p> <p>まずは<a href="http://www.flash-jp.com/modules/newbb/viewtopic.php?topic_id=7477&amp;forum=20&amp;post_id=37488" target="_blank">コイツ</a>を見てくれ。<br /> 僕は、ココのアカウントを持っていないし、同様の問題に直面したときは、投稿日時からだいぶ日数が経ってたので、特にココにはコメントしなかったんだけれど、今後同様の問題に直面した人の救いになればと思ってエントリーを書いてみることにするよ。</p> <p>前回、</p> <p class="code">movie.closeVideoPlayer(1);</p> <p>にて、NetStreamを閉じましが、再度再生するために</p> <p class="code">movie.activeVideoPlayerIndex = 1; <br />             movie.visibleVideoPlayerIndex = 1;<br />             movie.source = &quot;flvファイルへのパス&quot;;<br />             movie.play();</p> <p>このように記述すると、コンポーネントの表示上はミュートになっていないのに、音声が再生されません。<br /> さらに、ボリュームのハンドルや、ミュートボタンを弄ると、音が流れ出します。</p> <p>どうやら、<strong>ビデオとサウンドは、別々のプロセス（インスタンス）で管理されている</strong>みたいで、FLVPlaybackコンポーネントを生成したときは、ビデオとサウンドが両方生成され、closeVideoPlayer()メソッドを実行すると、ビデオとサウンドが両方削除されるが、その後に同じコンポーネントに対して<br /> movie.source = &quot;flvファイルへのパス&quot;;<br /> movie.play();<br /> 上記を実行すると、<strong>ビデオ再生だけが生成され、サウンドは生成されず</strong>、音声ボタン等を操作したときに初めて生成されているようだ。<strong><span style="color: rgb(255, 0, 0);"><span style="font-size: 130%;">（全部予想な！！）</span></span></strong></p> <p>この予想が正しければ、FlvPlaybackコンポーネントにサウンドを制御するプロパティがあって、それはきっとクラス型だ！<br /> とあたりをつけて、ドキュメントを漁る。<br /> ほどなくして、<a href="http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/fl/video/FLVPlayback.html#soundTransform" target="_blank"><strong><em>soundTransform</em></strong></a>というプロパティを発見。予想通り<a href="http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/flash/media/SoundTransform.html" target="_blank"><strong><em>SoundTransform</em></strong></a>というクラスのインスタンスだ。<br /> ということは、再度、FlvPlaybackで再生するときに、soundTransformプロパティを再設定してやればいけるはず！！ってことで</p> <p class="code">var sound:SoundTransform = new SoundTransform(1 , 0);<br /> movie.soundTransform = sound;</p> <p>コンストラクタに、SoundTransform(1 , 0);<br /> で、第1引数にボリューム（1で最大音量）、第2引数にパン（0でパン無し）を与えて、生成したSoundTransformクラスのインスタンスを、FlvPlaybackコンポーネントのプロパティsoundTransformに渡します。</p> <p>これで、晴れて音声が再生されるようになります。やったね♪</p>]]></description>
            <link>http://studio-ensyu.com/life-style/2009/04/closevideoplayer.html</link>
            <guid>http://studio-ensyu.com/life-style/2009/04/closevideoplayer.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">ActionScript3.0</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">FLV</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">Flash</category>
            
            
            <pubDate>Tue, 14 Apr 2009 18:10:04 +0900</pubDate>
        </item>
        
        <item>
            <title>FLVPlaybackコンポーネントで、closeVideoPlayer()メソッドを使う。</title>
            <description><![CDATA[<p>まず、ことの発端は</p> <p><span style="font-size: 130%;"><strong>大きなFLVファイルをサーバに置いたら、ものすごい負荷で参ったｗｗｗ</strong></span><br /> てな事があって、<br /> ならば、<span style="color: rgb(255, 0, 0);"><span style="font-size: 130%;">FLVPlaybackコンポーネントが表示される画面を閉じても<strong>裏でプログレッシブダウンロードが走ってる</strong>から、画面を閉じるたびに、</span><strong><span style="font-size: 130%;">きちんとNetStreamを閉じて、なるべく負荷がかからないようにしよう。</span></strong></span></p> <p>と考えたからなわけです。<br /> そこで利用するのが「<a target="_blank" href="http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/fl/video/FLVPlayback.html#closeVideoPlayer()"><em><strong>closeVideoPlayer()</strong></em></a>」メソッドです。</p> <p>closeVideoPlayer()メソッドは、引数として渡された<em>index</em>のNetStream を閉じ、ビデオプレーヤーを削除します。</p> <p>ここでいうビデオプレーヤーとは、FLVPlaybackコンポーネント自身ではなく、なんというか、<strong>FLVPlaybackコンポーネントに指定されている、プロセスみたいなもの？</strong><br /> 僕はなんとなくこんな感じで理解してます。</p> <p>さて、<br /> ■閉じたビデオプレーヤーがアクティブまたは可視のビデオプレーヤーである場合は、アクティブまたは可視のビデオプレーヤーを FLVPlayback インスタンスでデフォルトプレーヤーに設定します (インデックス 0)。<br /> ■デフォルトプレーヤーを閉じることはできません。閉じようとすると、エラーがスローされます。</p> <p>とあるので、簡単な話、indexの値が<strong><em>0</em></strong>だと、closeVideoPlayer()メソッドを使えません。<br /> なので、<a href="http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/fl/video/FLVPlayback.html#activeVideoPlayerIndex" target="_blank"><em><strong>activeVideoPlayerIndex</strong></em></a>パラメータと<a href="http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/fl/video/FLVPlayback.html#visibleVideoPlayerIndex" target="_blank"><em><strong>visibleVideoPlayerIndex</strong></em></a>を適当な数値にします。</p> <p>仮に、movieという名前のFLVPlaybackコンポーネントが配置されているとして<br /> 例えばビデオ再生用の小窓をFlashのStageに表示させる場合に</p> <p class="code">movie.activeVideoPlayerIndex = 1; <br />             movie.visibleVideoPlayerIndex = 1;<br />             movie.source = &quot;flvファイルへのパス&quot;;<br />             movie.play();</p> <p>と、予め再生する処理で上記の様に記述することで、この小窓を閉じる（非表示にしたり、removeChild()する）再に</p> <p class="code">movie.closeVideoPlayer(1);</p> <p>上記の様に記述して、ネットコネクションを切ることが出来ます。<br /> 例えば、<a href="http://hp.vector.co.jp/authors/VA032928/" target="_blank">こんなソフト</a>でネットワークを監視してみると、明らかに負荷が軽減されているのが分かります。</p> <p><span style="font-size: 130%;"><strong>まぁ結局あまりたいした効果が出ずに、rtmpが使えるストリーミングサーバを借りたんですがねｗｗ</strong></span></p>]]></description>
            <link>http://studio-ensyu.com/life-style/2009/04/flvplaybackclosevideoplayer.html</link>
            <guid>http://studio-ensyu.com/life-style/2009/04/flvplaybackclosevideoplayer.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">ActionScript3.0</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">FLV</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">Flash</category>
            
            
            <pubDate>Tue, 14 Apr 2009 17:18:01 +0900</pubDate>
        </item>
        
        <item>
            <title>airでディレクトリ操作（アプリケーション固有のディレクトリ）</title>
            <description><![CDATA[<p>そういえば、airに関して何も書いてないなぁってことで、基本となりそうなところから初めてみようかなと・・・。<br /> てな訳で、一発目はディレクトリ操作ってことで。</p> <p>airを使うと、当然ユーザーのディスク領域にアクセスすることが出来るんで、通常のアプリのように、ファイルを読み込んで編集して上書きして～・・・ってなことができたりします。</p> <p>まぁその辺はおいおいという事で、今回は「アプリケーションがインストールされているディレクトリから、アプリケーション用のデータディレクトリにファイルをコピーして、そのファイルを読み込む」っていう処理を書いてみましょう。</p> <p><a href="http://studio-ensyu.sakura.ne.jp/files/file/Directory.zip"></a><strong><a href="../../../../../../files/file/xmltest.fla"><strong>&gt;&gt;Flaファイルをダウンロード</strong></a></strong></p> <p>そもそもこのコードを書いたきっかけが、スキン対応のデスクトップツールを作ろうってことで、ユーザーが自由にスキンをインストールできるようにしなきゃならんが、インストール直後のデフォルトスキンが必要だよね。ってことで、最初は、アプリケーションがインストールされてる、カレントディレクトリに、「skins」とかのフォルダを作って、XMLのファイルリストに個々のスキンフォルダを対応させようって考えてたんだけれども・・・</p> <p><a href="http://www.fores.jp/labs/wiki/index.php?applicationDirectory%E9%85%8D%E4%B8%8B%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95" target="_blank">applicationDirectory配下のファイルにアクセスする方法</a></p> <p>上記の記事で、<span style="font-size: 120%;"><span style="color: rgb(255, 0, 0);"><strong>AIRアプリケーションのアンインストール時には、自分で作成したファイルは削除されないのでそのまま残ってしまうという欠点がある。</strong></span> <br class="spacer" /> <span style="color: rgb(255, 0, 0);"><strong>さらに悪いことに、もう一度同じAIRアプリケーションをインストールしようとした場合、インストール先のディレクトリが残ったままだとインストールに失敗してしまうので要注意。</strong></span></span></p> <p>うおぉ、こりゃいかん・・・</p> <p>ってことで、もちょっと調べたら、「<em>applicationStorageDirectory</em>」なるものを発見。<br /> どうやら、ここは、アンインストール時に削除されるようで、ならば、スキンリストはここに作成しようと決断</p> <p>ならば、最初のデフォルトスキンも含んだ、スキンフォルダをapplicationStorageDirectoryに作成しなきゃねって事で、「アプリケーションがインストールされているディレクトリから、アプリケーション用のデータディレクトリにファイルをコピーして、そのファイルを読み込む」コードを書いたわけです。</p> <p>まず下準備として、airのインストーラーの設定で</p> <span style="display: inline;" class="mt-enclosure mt-enclosure-image"><img height="181" width="460" style="" class="mt-image-none" src="http://studio-ensyu.com/life-style/2009/02/22/directory.JPG" alt="directory.JPG" /></span> <p>こんな感じで、あらかじめ用意したdefaultSkins.swfというファイルを追加します。</p> <p>ディレクトリの操作では、filesystemパッケージのfileクラスを使用します。<br /> ではソースをば、</p> <p class="code">import flash.filesystem.*;<br />             import flash.net.FileFilter;<br />             /*<br />             アプリケーションがインストールされてるフォルダ（アプリケーションディレクトリ）の&quot;defaultSkins.swf&quot;というファイルをアプリケーションのデータ用フォルダ（アプリケーションストレージディレクトリ）にコピーして利用します。<br />             <br />             まずアプリケーションストレージディレクトリに&quot;defaultSkins.swf&quot;が存在するかどうかを調べ<br />             無ければコピー、あればコピーせずに&quot;defaultSkins.swf&quot;を読み込み画面に表示します。<br />             */<br />             <br />             //ファイル名<br />             var skinFileName:String = &quot;defaultSkins.swf&quot;;<br />             <br />             //アプリケーションディレクトリのパスです。<br />             var appDir:File = File.applicationDirectory;<br />             <br />             //アプリケーションストレージディレクトリのパスです。<br />             var appDb:File = File.applicationStorageDirectory;<br />             <br />             //resolvePath()によって、新しいディレクトリパスを作ります。<br />             //下記コードだと、「アプリケーションディレクトリ\defaultSkins.swf」となります。<br />             var defaultSkin:File = appDir.resolvePath(skinFileName);<br />             <br />             //下記コードだと「アプリケーションストレージディレクトリ\defaultSkins.swf」となります。<br />             //ここでは、実際にそのファイルがあるかどうかは問題になりません。<br />             var skinsPath:File = appDb.resolvePath(skinFileName);<br />             <br />             file_txt.appendText(&quot;\n作成日時&quot; + defaultSkin.creationDate);<br />             file_txt.appendText(&quot;\n更新日時&quot; + defaultSkin.modificationDate);<br />             <br />             file_txt.appendText(&quot;\n&quot; + skinsPath.nativePath);<br />             <br />             //「アプリケーションストレージディレクトリ\defaultSkins.swf」が存在するかどうかを調べます。<br />             //存在しなければ、copyToAsync()メソッドを利用して、ファイルをコピーします。<br />             if(skinsPath.exists){<br />             &nbsp;&nbsp;&nbsp; file_txt.appendText(&quot;\ndefaultSkinsは存在します。&quot;);<br />             &nbsp;&nbsp;&nbsp; file_txt.appendText(&quot;\n作成日時&quot; + skinsPath.creationDate);<br />             &nbsp;&nbsp;&nbsp; file_txt.appendText(&quot;\n更新日時&quot; + skinsPath.modificationDate);<br />             &nbsp;&nbsp;&nbsp; setPanel();<br />             }else{<br />             &nbsp;&nbsp;&nbsp; file_txt.appendText(&quot;\ndefaultSkinsは存在しません。\n作成します。&quot;);<br />             &nbsp;&nbsp;&nbsp; defaultSkin.copyToAsync(skinsPath , true);<br />             }<br />             <br />             defaultSkin.addEventListener(Event.COMPLETE , completedFunc);<br />             <br />             function completedFunc(event:Event):void{<br />             &nbsp;&nbsp;&nbsp; file_txt.appendText(&quot;\nコピーしました。&quot;);<br />             &nbsp;&nbsp;&nbsp; var fileList:Array = new Array();<br />             &nbsp;&nbsp;&nbsp; fileList = appDb.getDirectoryListing();<br />             &nbsp;&nbsp;&nbsp; <br />             &nbsp;&nbsp;&nbsp; var count:int = fileList.length;<br />             &nbsp;&nbsp;&nbsp; <br />             &nbsp;&nbsp;&nbsp; for(var i:int = 0 ; i &lt; count ; i++){<br />             &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; file_txt.appendText(&quot;\n&quot; + fileList[i].nativePath);<br />             &nbsp;&nbsp;&nbsp; }<br />             &nbsp;&nbsp;&nbsp; setPanel();<br />             }<br />             <br />             function setPanel():void{<br />             &nbsp;&nbsp;&nbsp; var skinAdress:URLRequest = new URLRequest(skinsPath.url);<br />             &nbsp;&nbsp;&nbsp; var loader:Loader = new Loader();<br />             &nbsp;&nbsp;&nbsp; <br />             &nbsp;&nbsp;&nbsp; loader.load(skinAdress);<br />             &nbsp;&nbsp;&nbsp; stage.addChild(loader);<br />             &nbsp;&nbsp;&nbsp; <br />             &nbsp;&nbsp;&nbsp; loader.contentLoaderInfo.addEventListener(Event.COMPLETE , loadComp);<br />             &nbsp;&nbsp;&nbsp; <br />             &nbsp;&nbsp;&nbsp; function loadComp(event:Event):void{<br />             &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var tmp:MovieClip;<br />             &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />             &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tmp = event.target.content;<br />             &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tmp.gotoAndStop(&quot;昼&quot;);<br />             &nbsp;&nbsp;&nbsp; }<br />             }</p> <p>ポイントをいくつか<br /> まず</p> <p>var appDir:File = File.applicationDirectory;<br /> var appDb:File = File.applicationStorageDirectory;</p> <p>で「アプリケーションストレージディレクトリ」と「アプリケーションディレクトリ」の参照を取得します。<br /> appDir.nativePath;<br /> と記述すると、OSネイティブなディレクトリパスを取得できます。<br /> 例えば、Vistaの64Bitだと「C:\Program Files (x86)\dir」こうなるでしょう。<br /> appDir.url;<br /> と記述すると、「app:/」こうなります。ちなみに、ストレージディレクトリは「「app-storage:/」です。</p> <p>つぎに<br /> var defaultSkin:File = appDir.resolvePath(skinFileName);<br /> resolvePathで、ディレクトリを移動しますので、defaultSkinのパスは「app:/defaultSkins.swf」となります。<br /> nativePathは「C:\Program Files (x86)\dir\defaultSkins.swf」となるでしょうね。</p> <p>ちなみにその下の<br /> var skinsPath:File = appDb.resolvePath(skinFileName);<br /> この行ですが、実際に「app-storage:/defaultSkins.swf」は、初回の起動時には存在しません。<br /> でも、上記のコードはエラーになりません</p> <p>resolvePathでは、実際にそのディレクトリやファイルが存在するかどうかは関係なありません。<br /> そのファイルが存在するかどうかどうかは、Fileクラスのプロパティで取得できます。<br /> その部分がこれです。<br /> if(skinsPath.exists){<br /> existsプロパティは、実際にそのファイル・ディレクトリが存在するかどうかを調べます。<br /> ここでは、existsプロパティがtrue（ファイルが存在する）場合、直ちに読み込み処理をします。<br /> 無ければ、<br /> defaultSkin.copyToAsync(skinsPath , true);<br /> copyToAsyncメソッドで、defaultSkin（アプリケーションディレクトリのファイル）をskinsPathに（アプリケーションストレージディレクトリの、実際は存在しないファイル名）コピーし、終了したら読み込みます。</p> <p>あとは、読み込み処理はloaderクラスを利用するんで、パスをURLRequestクラスのインスタンスにしなきゃいけなんで、Fileクラスのurlプロパティを使って、読み込みます。</p> <p>てな訳で、アプリケーションの設定ファイルとか、後々追加更新するけれど、ユーザーに任意に操作させたくないなぁってファイルは、applicationStorageDirectoryを使って、このコードみたく、初回起動時にapplicationDirectoryからコピーするようにすると、なんだかアプリケーションみたいだね。</p>]]></description>
            <link>http://studio-ensyu.com/life-style/2009/02/air.html</link>
            <guid>http://studio-ensyu.com/life-style/2009/02/air.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">ActionScript3.0</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">Flash</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">air</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">air</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">as3.0</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">Flash</category>
            
            <pubDate>Sun, 22 Feb 2009 22:11:11 +0900</pubDate>
        </item>
        
        <item>
            <title>AS3でリンケージしたシンボルを大量複製（getDefinitionByName）</title>
            <description><![CDATA[<p>すっげぇ久しぶりの更新です。<br /> いままでサボってゴメンナサイ・・・。</p> <p><a href="http://studio-ensyu.com/life-style/2008/09/as3swf.html" target="_blank">http://studio-ensyu.com/life-style/2008/09/as3swf.html</a></p> <p>上の記事で、リンケージに関してちょろと説明ましたが・・・</p> <p>例えばAS2.0で</p> <p class="code">var test_mc:MovieClip = _root.attachMovie(&quot;link&quot; + id , &quot;MC&quot; + count++ , _root.getNextHighestDepth());</p> <p>とか書きたい時ってどうすんの？<br /> って話です。</p> <p>まぁ手っ取り早く<a onclick="window.open(this.href,'','resizable=no,location=no,menubar=no,scrollbars=no,status=no,toolbar=no,fullscreen=no,dependent=no,width=550,height=400,status'); return false" href="http://studio-ensyu.sakura.ne.jp/files/flash/090122_getDefinitionByName/eventDispatcherAS3_0.html">サンプル</a>を。</p><p><a href="http://studio-ensyu.sakura.ne.jp/files/file/eventDispatcherAS3_0.fla"><strong>&gt;&gt;Flaファイルをダウンロード</strong></a></p> <p>こんな感じで、画面上に、リンケージ設定させたいくつかのシンボルを、ランダムに配置するためには、文字列からクラス名を設定してやる必要があるんですが、さてさて、AS3.0ではどう書くのか・・・？</p> <p>こう書きます。</p> <p class="code">import flash.utils.getDefinitionByName;<br />             <br />             var className:String = &quot;link&quot; + id;<br />             var ClassReference:Class = getDefinitionByName(className) as Class;</p> <p>getDefinitionByName(className) as Class;<br /> のclassNameに文字列で引数を渡すと、文字列をObjectに変換してくれるみたいです。<br /> ただし、Objectのまんまだと、Classにならないんで、as Classでキャスト（の様な事）をします。<br /> as Classを記述しないと「1118: 静的型 Object の値が、関連しない可能性が高い型 Class に暗黙で型変換されています。」というエラーを出すんで、明示的にキャストしてあげた方がいいでしょうねぇ（パブリッシュ設定でStrictモードのチェックを外すと、エラーは出ないんですけどね）。</p> <p>あとはコレを画面に配置するには</p> <p class="code">var imgObj = new ClassReference();<br />             stage.addChild (imgObj);</p> <p>としてあげればOK。</p> <p>んで、サンプルのソースは</p> <p class="code">//Tweenエフェクト用<br />             import fl.transitions.Tween;<br />             import fl.transitions.TweenEvent;<br />             import fl.transitions.easing.*;<br />             <br />             //文字列からクラスを生成するために必要。<br />             import flash.utils.getDefinitionByName;<br />             <br />             //リンケージのシンボルを、50ミリ秒ごとに生成<br />             var ID:int = setInterval(intervalFunction , 50);<br />             <br />             //生成のための関数<br />             function intervalFunction(){<br />             &nbsp;&nbsp;&nbsp; //ステージサイズから、生成位置をランダムに生成。stage.widthとかだと、ステージに何も配置されてないと0になってしまうため即値を入れてます。<br />             &nbsp;&nbsp; &nbsp;var X:Number = Math.random() * 550;<br />             &nbsp;&nbsp; &nbsp;var Y:Number = Math.random() * 400;<br />             &nbsp;&nbsp; &nbsp;<br />             &nbsp;&nbsp;&nbsp; //2つのリンケージからランダムにどちらかのシンボルを指定。<br />             &nbsp;&nbsp; &nbsp;var id = Math.round(Math.random() * 1);<br />             &nbsp;&nbsp; &nbsp;var className:String = &quot;link&quot; + id;//ランダムに「link0」と「link1」が生成される。<br />             &nbsp;&nbsp; &nbsp;var ClassReference:Class = getDefinitionByName(className) as Class;<br />             &nbsp;&nbsp; &nbsp;<br />             &nbsp;&nbsp;&nbsp; //配置する。<br />             &nbsp;&nbsp; &nbsp;var imgObj = new ClassReference();<br />             &nbsp;&nbsp; &nbsp;stage.addChild (imgObj);<br />             &nbsp;&nbsp; &nbsp;<br />             &nbsp;&nbsp; &nbsp;imgObj.x = X;<br />             &nbsp;&nbsp; &nbsp;imgObj.y = Y;<br />}</p>             <p>&nbsp;&nbsp;&nbsp; //生成したシンボルに、再生が終わった後に消す処理を登録。<br />             &nbsp;&nbsp; &nbsp;imgObj.addEventListener(&quot;testEvent&quot; , Func);<br />             }<br />             <br />             //消す処理。<br />             function Func(evt:Event){<br />             &nbsp;&nbsp; &nbsp;var target:Object = evt.target;<br />             &nbsp;&nbsp; &nbsp;var myTween:Tween = new Tween(target , &quot;alpha&quot; , Regular.easeOut , 1 , 0.2 , 0.2 , true);<br />             &nbsp;&nbsp; &nbsp;<br />             &nbsp;&nbsp; &nbsp;setTimeout(finish , 250 , target);<br />             &nbsp;&nbsp; &nbsp;function finish(){<br />             &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; stage.removeChild(DisplayObject(arguments[0]));<br />             &nbsp;&nbsp; &nbsp;}<br />             }</p> <p>こうなってます。</p> <p>ちなみに、生成されるシンボル自体は単なるシェイプトゥイーンするだけですが、最終フレームに</p> <p class="code">stop();<br />             this.dispatchEvent(new Event(&quot;testEvent&quot;));</p> <p>と、記述し、「testEvent」という名前でイベントを送出してます。<br /> すると、<br /> imgObj.addEventListener(&quot;testEvent&quot; , Func);<br /> のように、「testEvent」を受け取ることが出来るわけです。<br /> ただ、この辺は、AS2.0の流用なんで、ちょっと怪しい。 EventDispatcher()に関しては、もちょっと調べたらまたエントリー上げます。</p> <p>//------------------------------------- 2009/2/26日追記 -------------------------------------//</p> <p>どうやら、addEventListenerメソッドが受け取る第一引数はString型で、イベントタイプの定数もString型のようなので、これでいいみたい。<br /> <a target="_blank" href="http://livedocs.adobe.com/flex/2_jp/langref/flash/events/Event.html">http://livedocs.adobe.com/flex/2_jp/langref/flash/events/Event.html</a><br /> さらに言うと、Eventクラスのコンストラクタの第一引数もString型で、つまりは<br /> dispatchEvent(new Event(MouseEvent.CLICK));とか書けば、強制的にクリックイベント送出できたりします。<br /> AS2.0時代のsample_btn.onRelease();で、コードからマウスイベントを強制的に呼び出したみたいに。</p>]]></description>
            <link>http://studio-ensyu.com/life-style/2009/01/as3getdefinitionbyname.html</link>
            <guid>http://studio-ensyu.com/life-style/2009/01/as3getdefinitionbyname.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">ActionScript3.0</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">Flash</category>
            
            
            <pubDate>Thu, 22 Jan 2009 19:03:57 +0900</pubDate>
        </item>
        
    </channel>
</rss>

