<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>akihiro kamijo</title>
    <link rel="alternate" type="text/html" href="http://cuaoar.jp/" />
    <link rel="self" type="application/atom+xml" href="http://cuaoar.jp/atom.xml" />
    <id>tag:cuaoar.jp,2009-12-16://1</id>
    <updated>2012-01-26T00:19:13Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Commercial 4.261</generator>

<entry>
    <title>次期 ActionScript コンパイラ Falcon の情報</title>
    <link rel="alternate" type="text/html" href="http://cuaoar.jp/2012/01/-actionscript-falcon.html" />
    <id>tag:cuaoar.jp,2012://1.610</id>

    <published>2012-01-26T00:10:48Z</published>
    <updated>2012-01-26T00:19:13Z</updated>

    <summary>アドビの言語設計リサーチグループに所属する Avik Chaudhuri のブロ...</summary>
    <author>
        <name>ackie</name>
        
    </author>
    
        <category term="ActionScript 3.0" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://cuaoar.jp/">
        <![CDATA[<p>アドビの言語設計リサーチグループに所属する Avik Chaudhuri のブログに、現在開発中の次世代 ActionScript コンパイラ Falcon の情報が公開されています。コメントも含め興味深い内容ですので、関心のある方はご一読をお勧めします。</p>
<p><a href="http://blogs.adobe.com/avikchaudhuri/2012/01/17/the-v8-myth-why-javascript-is-not-a-worthy-competitor/">The V8 Myth: Why JavaScript is not a Worthy Competitor</a></p>
<p>... 以下は、簡単な内容の紹介です。</p>
<p>ActionScript で記述されたコードは、バイトコードにコンパイルされて、AVM 上で実行されます。現在の実装では、AS コードをコンパイルする時の最適化は殆ど行われず、実行時の JIT による最適化がパフォーマンスの要となっています。</p>
<p>（AS コンパイラには、もうちょっと頑張って欲しい気がしますよね）</p>]]>
        <![CDATA[<p>AS2 から AS3 への大きな変化は、型付け機能の強化でした。そこで、これを事前コンパイル時に活用しようと考えた Avik は、Falcon に型推論の機能のプロトタイプを実装してみたそうです。 （実装したロジックは<a href="http://www.cs.umd.edu/~avik/projects/iogti/paper.pdf">こちら</a>）</p>
<p>そして、Google V8 エンジンとのパフォーマンス比較を行ったところ、以下のような結果になったようです。最初の数値が V8、次の数値が Falcon 改 + AVM の処理時間です。</p>
<p>（テストには、Tamarin の jsbench 等が使われたとのこと）</p>
<ul>
  <li><em>SOR: 23.1 : 4.6</em></li>
  <li><em>LUFact: 138.7 :  23.3</em></li>
  <li><em>HeapSort: 10.0 :  14.7</em></li>
  <li><em>FFT: 75.6 :  31.1</em></li>
  <li><em>Crypt: 25.1 :  7.4</em></li>
</ul>
<p>これを見ると、最新の V8 エンジンとは一世代前の技術で作られている AVM 上でも、同等から 5 倍程度早い結果になっています。事前コンパイル時の型推論の効果の高さが伺えます。</p>
<p>Falcon にはまだ他にも最適化の余地があること、 AVM も改良の余地があること （参考：<a href="http://cuaoar.jp/2011/10/2012-2013-flash--.html">2012 (2013?) 年 Flash 予報 - 言語編</a>） などを考えると、Falcon がオープンソースとして公開される頃の ActionScript には、なんだか期待が持てそうです。</p>
<p>Avik は、この結果について、実行時だけでなく、事前コンパイル時にも最適化が可能な ActionScript が、JavaScript に対して優位である点を指摘しています。</p>
<p>個人的な意見であることを前置きした上で、ActionScript は、&quot;明らかに JavaScript より高速&quot; でなければだんだん使われなくなるだろう。そして、それだけの高速化の可能性はあると考える、とも述べています。</p>
<p>パフォーマンスだけでなく、大規模開発への対応や、開発生産性の観点から、ActionScript のライバルは、JavaScript よりは Java、場合によってはネイティブ言語の方が近いのかもしれません。</p>
<p>（言語の設計思想からは、Google の <a href="http://www.dartlang.org/">Dart</a> が競合っぽく見えます。果たして Google は ECMAScript 標準の壁を破ることができるでしょうか）</p>
<p>ということで、AS vs JS の比較情報でした。Flash vs HTML5 ではありませんので念のため。</p>]]>
    </content>
</entry>

<entry>
    <title>Flash Player 11.2 と AIR 3.2 ベータ 4 公開</title>
    <link rel="alternate" type="text/html" href="http://cuaoar.jp/2012/01/flash-player-112-air-32-1.html" />
    <id>tag:cuaoar.jp,2012://1.609</id>

    <published>2012-01-20T04:41:11Z</published>
    <updated>2012-01-20T04:44:44Z</updated>

    <summary>Flash Player 11.2 と　AIR 3.2 のベータ版が更新されまし...</summary>
    <author>
        <name>ackie</name>
        
    </author>
    
        <category term="11" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://cuaoar.jp/">
        <![CDATA[<p>Flash Player 11.2 と　AIR 3.2 のベータ版が更新されました。</p>
<ul>
  <li><a href="http://labs.adobe.com/technologies/flashplatformruntimes/flashplayer11-2/">Flash Player 11.2 Beta@Labs</a></li>
  <li><a href="http://labs.adobe.com/technologies/flashplatformruntimes/air3-2/">Adobe AIR 3.2 Beta@Labs</a></li>
</ul>
<p>大きな変更点は、Stage3D 及び StageVideo の利用環境の拡大です。現行の Flash Player 11.1 では、2009 年以降のドライバがインストールされた環境でのみ利用できましたが、これが 2008 年まで緩和されました。より多くの環境で GPU が利用できることになります。</p>
<p>今回公開されたバージョンは、以下の通りです。どちらもデスクトップ版のみです。</p>
<ul>
  <li>Flash Player :  11.2.202.183</li>
  <li>AIR :  3.2.0.1720</li>
</ul>]]>
        <![CDATA[<p>ベータ版のダウンロードリンクはそれぞれ以下の通りです。例によってベータ版ですので、テスト用の環境での利用をお勧めします。</p>
<ul>
  <li><a href="http://labs.adobe.com/downloads/flashplayer11-2.html">Flash Player 11.2 Beta@Labs Downloads</a></li>
  <li><a href="http://labs.adobe.com/downloads/air3-2.html">Adobe AIR 3.2 Beta@Labs Downloads</a></li>
</ul>
<p>Flash Professional CS5 と CS5.5 の開発環境設定用の MXP はこちらからダウンロードできます。（<a href="http://cuaoar.jp/2011/11/-flash-professional-cs5.html">日本語版 Flash Professional CS5 &amp; CS5.5 に Flash Player 11 設定を追加する MXP</a>）</p>
<p>新しい　<a href="http://download.macromedia.com/pub/labs/flashplatformruntimes/flashplayer11-2/flashplayer11-2_p4_playerglobal_011912.swc">playerglobal.swc</a> のインストールをお忘れなく。</p>
<p>（注： Flash Player 11.2 と AIR 3.2 から、現在 Labs に公開中の Alchemy の利用サポートされません。これは、既報の通り、製品版として新しい Alchemy が登場するためです。 参考： <a href="http://cuaoar.jp/2011/09/flash-player-11-adobe-ai-1.html">Flash Player 11 と Adobe AIR 3 （と Alchemy） の発表</a> ）</p>
<h4>ThrottleEvent イベント</h4>
<p>今回は、特に大きな機能追加はありません。これまで公開された機能については、以前の記事をご覧ください。 （<a href="http://cuaoar.jp/2011/11/flash-player-112-air-32.html">Flash Player 11.2 と AIR 3.2 ベータ 2 公開</a>）</p>
<p>といいつつ、いままで紹介していなかった ThrottleEvent について、以下、簡単な説明です。</p>
<p>Throttle は、コンテンツが非表示になった等の理由により、Flash Player がフレームレートを 0 より少し大きい程度のごく小さい値に設定する動作のことです。ThrottleEvent は、Flash Player が、Throttle の実行、あるいは再生の中断／再開を通知するイベントで、Stage から発行されます。</p>
<p>Throttle が実施される前に、ThrottleEvent は ThrottleEvent.state 属性に ThrottleType.THROTTLE が設定された状態でディスパッチされます。これにより、フレームレートが変わる前に、必要な処理を行うことができます。</p>
<p>新しく設定されるフレームレートは、ThrottleEvent.targetFrameRate 属性から知ることができます。</p>
<p>Flash Player が通常の再生状態に戻るときは、ThrottleEvent.state に ThrottleType.RESUME が設定されて、ThrottleEvent がディスパッチされます。このとき targetFrameRate 属性には、復帰後のフレームレートが設定されています （通常 Stage.frameRate と同じ値）。</p>
<h4>自動更新機能について</h4>
<p>これまで公開された Windows 版の Flash Player 11.2 ベータ版には、バックグラウンドでの自動更新機能があります。自動更新のチェックをした人は、プレリリース版の更新がこっそり行われるはずです。</p>
<p> 自動更新機能の利用は、インストール時、または Flash Player の設定マネージャの高度な設定のパネルから変更できます。今すぐチェックするためのボタンもあります。</p>
<p>更新のチェックは 24 時間ごとに行われます。早い人の環境では、もう既にベータ 4 に変わっているかもしれません。セキュリティ上の理由から、自動更新機能は、10.1 以降の全ての Flash Player を更新します。 （ActiveX もプラグイン版も）</p>
<p>ブラウザが起動しっぱなしの場合は、次回起動時まで更新は確認できません。Windows 7 64 ビット版で IE を実行中に自動更新が開始されると、セキュリティ警告が表示されます。気にせず IE を再起動すると、更新されるようです。</p>
<p>Firefox が起動中に自動更新が行われた場合は、新しいバージョンが使われないようです。こちらの場合には、PC の再起動が必要です。自分でファイルを消すことでも対応はできます。削除するファイルは、NPSWF.dll です。場所は \Windows\[SysDIR]\Macromed\Flash です。64 ビット版の OS では、System32 と SysWow64 の 2 箇所から削除する必要があるかもしれません。</p>
<p>&nbsp;</p>]]>
    </content>
</entry>

<entry>
    <title>Adobe Edge プレビュー版 4 公開</title>
    <link rel="alternate" type="text/html" href="http://cuaoar.jp/2012/01/adobe-edge-4.html" />
    <id>tag:cuaoar.jp,2012://1.574</id>

    <published>2012-01-20T02:08:15Z</published>
    <updated>2012-01-20T02:14:11Z</updated>

    <summary>Edge プレビュー 4 が Adobe Labs に公開されました。昨年の秋に...</summary>
    <author>
        <name>ackie</name>
        
    </author>
    
        <category term="Edge" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://cuaoar.jp/">
        <![CDATA[<p>Edge プレビュー 4 が Adobe Labs に公開されました。昨年の秋にプレビュー 3 が公開されてから久しぶりの更新になります。 （<a href="http://labs.adobe.com/technologies/edge/">Edge@Labs</a>）</p>
<p>ダウンロードはこちらの<a href="https://www.adobe.com/cfusion/entitlement/index.cfm?e=labs_edge">リンク</a>です。ダウンロードには Adobe ID が必要です。サポートされる OS は、以下の通りです。</p>
<ul>
  <li>Windows 7, Windows Vista</li>
  <li>Mac OS X 10.6, 10.7</li>
</ul>
<p>時間をかけただけあって、今回はいくつもの新機能の追加やユーザビリティの改善が行われています。以下がその主な項目です。</p>]]>
        <![CDATA[<h4>シンボル</h4>
<p>Edge プレビュー 4 では、アセットとして再利用可能なシンボルを定義できるようになりました。Flash のムービークリップに良く似た機能です。</p>
<p>シンボルは独自のタイムラインを持ち、クリック時の動作などインタラクションの定義も可能です。一般的な動作は、コードスニペットが提供されているため、コードを容易に追加できます。</p>
<p>シンボルの追加に伴い、ライブラリパネルが新設されました。新しくシンボルを定義すると、ライブラリパネル内に表示されます。ライブラリパネル内のシンボルをクリックすると （またはステージ上のシンボルのインスタンスをクリックすると）、シンボルを編集できます。</p>
<p>定義済みのシンボルを利用するときは、ライブラリパネルから選択してステージ上に配置します。シンボルの属性は他のオブジェクトと同様に操作できます。</p>
<p>シンボルには、タイムラインの制御機能も提供されます。play や stop コマンドを使い、任意のフレームラベルから再生の開始、停止を実行できます。また、それぞれのシンボルに対して、読み込み時に自動的に再生を開始するかどうかの指定も可能です。</p>
<h4>Web フォント</h4>
<p>様々な Web フォントサービスとの連携が可能になりました。</p>
<p>定義された Web フォントは、新設されたライブラリパネル内にリスト表示されます。Web フォントの定義には、Web フォントにアクセスできない環境のためのフォールバック用フォントのリストも指定できます。</p>
<p>利用可能な Web フォントのサービスは以下の 3 種類です。</p>
<ul>
  <li>パッケージをダウンロードするタイプ （例： FontSquirre）</li>
  <li>サービスにリンクするタイプ （例： Google Web Fonts）</li>
  <li>サービスの発行するトークンを利用するタイプ （例：Typekit, fonts.com）</li>
</ul>
<h4>その他</h4>
<p>Edge プレビュー 4 では、その他にも数多くの新機能追加、操作性改善が行われました。以下は、主要な項目のリストです。</p>
<ul>
  <li><strong>要素の表示</strong><br />
    タイムライン上の任意のタイミングで、要素の表示／非表示を明示的に指定できます。これまでは、ステージ外に配置するという方法に頼る必要がありましたが、その場合、非表示の状態でも、要素は HTML の DOM 上に存在します。新しい方法では、必要なときのみリソースとして追加されます</li>
  <li><strong>要素の階層化</strong><br />
要素間に親子関係を指定できます    </li>
  <li><strong>変形ツール</strong><br />
ステージ上のオブジェクトの角や辺をドラッグして拡大縮小できます。また、変形点を任煮の場所 （dev 外の領域含む） に指定できるようになりました    </li>
  <li><strong>カラーパレット</strong><br />
ツールバーから、線と塗りの色を指定するカラーパレットを開くことができます    </li>
  <li><strong>複数オブジェクトの選択</strong>
  <br />
  属性をいっせいに変更するときなどに便利です</li>
  <li><strong>ファイルシステムとの連携強化</strong><br />
  デスクトップからツール内へのアセットのドラッグ &amp; ドロップが可能になりました</li>
  <li><strong>マウスのドラッグによるオブジェクトの複製</strong><br />
  Option または Ctr キーを押しながらマウスでオブジェクトをクリックしてドラッグするとオブジェクトの複製ができます </li>
  <li><strong>背景画像のクリップと位置指定の機能</strong><br />
  画像の任意の領域を表示できます</li>
  <li><strong>最新の WebKit の採用</strong><br />
  Mac と Windows 環境での差も無くなっています</li>
</ul>
<p>Edge は （少なくとも今のところ） Flash Professional を置き換えようというツールではありません。現在、テキストエディターで HTML5 アニメーションを作るため手間が掛かっている人に向けて開発されています。</p>
<p>Flash Professional 側の HTML5 対応については、昨年の MAX の時点で、CS6 の時点で何らかの機能を提供する方針である旨が発表されています。Flash ユーザの方は、こちらを楽しみに待ちましょう。</p>
<p>&nbsp;</p>]]>
    </content>
</entry>

<entry>
    <title>Starling のタッチイベントと Touch クラス</title>
    <link rel="alternate" type="text/html" href="http://cuaoar.jp/2012/01/starling-touch.html" />
    <id>tag:cuaoar.jp,2012://1.608</id>

    <published>2012-01-06T02:01:36Z</published>
    <updated>2012-01-06T04:28:44Z</updated>

    <summary>Starling では、指による操作も、マウスによる操作も、どちらも同じイベント...</summary>
    <author>
        <name>ackie</name>
        
    </author>
    
        <category term="Starling" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://cuaoar.jp/">
        <![CDATA[<p>Starling では、指による操作も、マウスによる操作も、どちらも同じイベント （<a href="http://doc.starling-framework.org/core/starling/events/TouchEvent.html">TouchEvent</a>） として扱います。</p>
<p>Flash Player のマウスイベントとは異なり、イベントの種類は TouchEvent.TOUCH の 1 つだけです。そのため、触れた、移動した等の操作の状態は、イベントに含まれる <a href="http://cuaoar.jp/#touch">Touch</a> オブジェクトの属性から判断することになっています。</p>
<p>Starling の全ての表示オブジェクト （Sprite, Stage, Quad, ...） は、TouchEvent を扱えます。ただ、<a href="http://cuaoar.jp/2012/01/starling-button.html">Button</a> クラスは、内部的にタッチイベントを triggered イベントに変換しているため、独自のリスナを追加するのは、注意した方がよいかもです。</p>
<p>また、表示オブジェクト自身や親オブジェクトの touchable 属性が false の場合は、TouchEvent を受け取ることはできません。</p>]]>
        <![CDATA[<p>ともあれ、Starling でタッチ操作を扱うには、とりあえず、表示オブジェクトに TouchEvent.TOUCH イベントのリスナを追加することになります。下は、そのサンプルです。</p>
<pre>import starling.events.<strong>TouchEvent</strong>;
 
myImage.addEventListener(TouchEvent.TOUCH, onTouch);
 
private function onTouch(e:<strong>TouchEvent</strong>):void
{
  trace(e.target);
}</pre>
<p>Starling のイベントは、表示リストを上にバブリングするため、下の階層のオブジェクトからのイベントも取得できます。 （注：仕様上、階層の上から下への伝播はしないはずですが、今の実装では Stage からのイベントが届くこともあるようです）</p>
<p>サンプル内で使用している target 属性や currentTarget 属性の使い方は、Flash Player 標準のイベントと同じです。その他、TouchEvent には、以下のような属性があります。全て読み取り専用です。</p>
<pre>ctrlKey: イベント発生時にCtrlキーが押されていたかを示す
shiftKey: イベント発生時にShiftキーが押されていたかを示す
timestamp: アプリケーションが起動してからの時間（単位は秒）
touches: 利用可能なTouchオブジェクトのベクター</pre>
<p>最後の touches は、イベントに関連する 1 つ以上の Touch オブジェクトのベクターです。Touch オブジェクトは、イベント発生の元となった指やマウスによる操作の情報を保持しています。</p>
<h4><a name="touch" id="touch"></a>Touch オブジェクトの取得</h4>
<p>TouchEvent には、<a href="Touch">Touch</a> オブジェクトを取得するためのメソッドが用意されています。</p>
<p>マルチタッチを使わない場合は、getTouch() というメソッドで Touch オブジェクトを取得できます。 （マルチタッチの場合は後述）</p>
<pre>import starling.events.Touch;
 
private function onTouch(e:<strong>TouchEvent</strong>):void
{
  var touch:<strong>Touch</strong> = e.<strong>getTouch</strong>(stage);
  if (touch)
    trace(e.target, touch.target);
}</pre>
<p>getTouch() メソッドの第 1 引数は、取得する Touch オブジェクトを絞り込むための条件です。</p>
<p>操作のターゲットとなった表示オブジェクトが、引数に指定したオブジェクトと一致する、もしくは引数の階層下に含まれる場合に、getTouch() は値を返します。実際の操作のターゲットは、Touch オブジェクト取得後に target 属性から参照できます。（操作のターゲットとイベントのターゲットは必ずしも一致しない点に注意）</p>
<p>Touch オブジェクトには、target 以外にも、操作を識別するための属性がいくつか存在します。</p>
<pre>
target: タッチ操作の対象となった表示オブジェクト
id: タッチを識別するための数字
timestamp: タッチ操作が行われた時間（アプリ開始からの秒数）</pre>
<h4>TouchPhase</h4>
<p>前述の通り、Touch オブジェクトには操作の状態を示す属性があります。属性名は phase です。</p>
<pre>
phase: 現在のタッチ操作の状況</pre>
<p>phase 属性に設定可能な値は <a href="http://doc.starling-framework.org/core/starling/events/TouchPhase.html">TouchPhases</a> クラスに定義されています。</p>
<p>良く使われる値は以下の 3 つです。</p>
<ul>
  <li>BEGAN: 指が画面に触れた、または、マウスボタンが押された</li>
  <li>MOVED: 指が画面上を移動した、または、マウスのボタンが押されたまま移動した</li>
  <li>ENDED: 指が画面から離れた、または、マウスボタンから離れた</li>
</ul>
<p>BEGAN が 1 つ、MOVED が 0 以上繰り返され、ENDED が 1 つというのが、基本的な流れです。</p>
<p>その他に、以下の状態もあります。</p>
<ul>
  <li>STATIONARY: 指もしくはマウスが前回のフレームから移動しなかった</li>
</ul>
<p>通常、この状態ではイベントが発行されないはずですが、マルチタッチ操作を扱う場合には、STATIONARY が含まれることがあります。</p>
<p>最後に、マウス利用のときだけに起こる状態です。</p>
<ul>
  <li>HOVER: マウスのボタンが押されない状態で、表示オブジェクト上にポインターがある</li>
</ul>
<p>指では （いまのところ） 触れずにポインターを移動させることができないため、OVER はあっても HOVER は無いということになります。</p>
<h4>ポインターの位置の取得</h4>
<p>Touch オブジェクトは、ステージ上の、現在の位置と、前回の位置を、属性として持っています。以下の 4 つです。型はいずれも Number です。</p>
<pre>globalX: ステージの座標を基準とした現在の指先（ポインター）の x 座標
globalY: ステージの座標を基準とした現在の指先（ポインター）の y 座標
previousGlobalX: ステージの座標を基準とした前回の指先（ポインター）の x 座標
previousGlobalY: ステージの座標を基準とした前回の指先（ポインター）の y 座標</pre>
<p>しかし、たいていの場合は、別の座標系での位置を計算することになるでしょう。というわけで、Touch クラスには、上の属性値を、特定のオブジェクトを基準とした座標値に変換するメソッドが提供されています。</p>
<pre>public function getLocation(space:DisplayObject):Point
public function getPreviousLocation(space:DisplayObject):Point</pre>
<p>これら 2 つのメソッドは、引数のオブジェクトの座標を基準にした、現在の位置、または前回の位置を返します。</p>
<p>下は、Touch オブジェクトの位置情報を利用するサンプルです。</p>
<pre>var touch:Touch = event.getTouch(this, <strong>TouchPhase.MOVED</strong>);
　
if (touch)
{
  // 親オブジェクトを基準に移動距離を計算する
  var currentPos:Point = touch.<strong>getLocation</strong>(parent);
  var previousPos:Point = touch.<strong>getPreviousLocation</strong>(parent);
  var delta:Point = currentPos.subtract(previousPos);
 
  // オブジェクトの位置を変更
  x += delta.x;
  y += delta.y;
}</pre>
<p>getTouch() メソッドの第 2 引数には、取得したい状態を指定できます。上のサンプルでは、指の移動の情報を扱うために TouchPhase.MOVED を指定しています。</p>
<h4>ダブルクリックの扱い方</h4>
<p>Touch オブジェクトは、ダブルクリック等を検知できるように、tapCount 属性に、瞬間的にタップされた回数を保持しています。</p>
<p>この属性を使って、ダブルクリックに対応するコードを記述してみたのが、下の例です。</p>
<pre>touch = event.getTouch(this, TouchPhase.ENDED);
 
if (touch && touch.tapCount == 2)
  parent.addChild(this);</pre>
<p>操作状態が ENDED の Touch オブジェクトが存在して、タップの回数が 2 回だった場合を検出しています。</p>
<h4>マルチタッチ</h4>
<p>Starling はマルチタッチにも対応します。マルチタッチを扱う場合は、Starling オブジェクトに以下の設定をします。</p>
<pre>mStarling.simulateMultitouch = true;</pre>
<p>この状態で、実際にマルチタッチが行われると、タッチ毎に Touch オブジェクトが作られます。そして TouchEvent に渡されます。</p>
<p>TouchEvent から複数の Touch オブジェクトを取得するには getTouches() メソッドを使います。下はそのサンプルです。</p>
<pre>var touches:Vector.&lt;Touch&gt; = touchEvent.getTouches(this);</pre>
<p>戻り値は Touch のベクターです。getTouch() と同様、第 2  引数に、取得したい状態を指定できます。</p>
<p>ちなみに、Ctrl キーを使うと、デスクトップ環境でも、マルチタッチをシミュレートできるようになっています。もちろん、実際のアプリでマルチタッチが使えるのは、指で操作したときだけです。</p>
<p>&nbsp;</p>]]>
    </content>
</entry>

<entry>
    <title>Starling の Button クラスの使い方</title>
    <link rel="alternate" type="text/html" href="http://cuaoar.jp/2012/01/starling-button.html" />
    <id>tag:cuaoar.jp,2012://1.607</id>

    <published>2012-01-05T03:39:12Z</published>
    <updated>2012-01-04T12:01:23Z</updated>

    <summary>Starling には、ボタンを簡単に実装できるよう Button クラスが用意...</summary>
    <author>
        <name>ackie</name>
        
    </author>
    
        <category term="Starling" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://cuaoar.jp/">
        <![CDATA[<p>Starling には、ボタンを簡単に実装できるよう <a href="http://doc.starling-framework.org/core/starling/display/Button.html">Button</a> クラスが用意されています。</p>
<p>Button クラスは <a href="http://doc.starling-framework.org/core/starling/display/DisplayObjectContainer.html" title="starling.display.DisplayObjectContainer">DisplayObjectContainer</a> クラスのサブクラスです。なので、任意の表示オブジェクトを子に持つことができますが、基本的には、スキン画像とタイトルを表示するだけのクラスです。あと、ボタンのクリックを通知する機能があります。</p>
<p>下が、Button のコンストラクタです。最初の引数は、ボタンのスキンとなるテクスチャです。オプションとして、第 2 引数にタイトルを、第 3 引数に押されたときのテクスチャを指定できます。</p>
<pre>Button(upState:Texture, text:String = &quot;&quot;, downState:Texture = null)</pre>
<p>Flash Professional で作成するボタンと違って、&quot;オーバー&quot; のスキンは指定できません。おそらく、これは、タッチデバイスでの利用を前提としているためだと思われます。</p>]]>
        <![CDATA[<p>ボタンがクリックされると （もしくはタップされると） triggered というイベントが発生します。クリック時に実行したい処理は、triggered イベントのリスナ関数に記述します。</p>
<p>下はそのサンプルです。テクスチャの埋め込み関連の箇所は、毎度のことなので省略してます。</p>
<pre>import starling.display.<strong>Button</strong>;
import starling.events.<strong>Event</strong>;
 
private var myButton:<strong>Button</strong>;
 
private function onAddedToStage(e:Event):void<br />{
  var myBitmap:Bitmap = new MyBitmap();
  var myTexture:Texture = Texture.fromBitmap(myBitmap);
 
  // テクスチャを指定してボタンのオブジェクトを生成
  myButton = new <strong>Button</strong>(myTexture);
  // triggered イベントのリスナを追加
  myButton.addEventListener(Event.<strong>TRIGGERED</strong>, onTriggered);
}
 
private function onTriggered(e:Event):void
{
  // イベントを発行したオブジェクトを取得
  trace(e.target);
}</pre>
<p>Staring のイベントは Flash Player のイベントのようにバブリング （表示リストの階層間で伝播、ただし子から親への方向のみサポート） するため、複数のボタンを使うときなどは、triggered イベントを親オブジェクトでまとめて処理することも可能です。</p>
<h4>スキン用テクスチャの指定</h4>
<p>Starling のボタンは、タッチされると （または、ボタン上でマウスが押された状態になると）、ボタンの表示サイズが少し小さくなります。指を離すと元の大きさに戻ります。これは、ボタンに標準のテクスチャ 1 つだけ指定されているときの動作です。</p>
<p>ボタンに、押された状態用のテクスチャも指定すると、テクスチャが小さくなる代わりに、テクスチャが入れ替わるようになります。</p>
<p>これら 2 つのテクスチャは、コンストラクタに指定することもできますが、後から属性に設定することも可能です。下が関連する属性の一覧です。</p>
<pre>
upState: ボタンがタッチされていない状態で表示されるテクスチャ
downState: ボタンがタッチされている状態で表示されるテクスチャ
scaleWhenDown: タッチされている状態のテクスチャの表示比率</pre>
<p>upState と downState が、各状態で表示するテクスチャを設定する属性です。 （upState は、コンストラクタでの指定が必須） パフォーマンスの観点からは、どちらのテクスチャも、同じテクスチャアトラス内にあるのが望ましいと考えられます。</p>
<p>最後の scaleWhenDown は、0 から 1 の間の数値を指定します。この値は、downState = null の場合のみ有効になります。</p>
<p>上でも書きましたが、単純な飾りの追加が必要であれば、2 つのテクスチャ以外にも任意の表示オブジェクトを追加できます。もし、振る舞いも変更したい場合は、自作のボタンクラスを作ったほうが早いかもしれません。</p>
<h4>テキストの表示</h4>
<p>Starling のボタンには、テクスチャとして指定した画像の上にテキストを表示できます。</p>
<p>テキストは、コンストラクタで指定するか、インスタンス生成後、text 属性に設定します。textBounds 属性を使って、テキストの表示位置を指定することもできます。</p>
<pre>
text: ボタン上に表示されるテキスト
textBounds: テキストの表示領域をRectangleで指定</pre>
<p> テキストの表示に使用するフォントの見た目を設定する属性もあります。ほぼ <a href="http://cuaoar.jp/2011/12/starling-textfiled.html">TextField</a> のときと同じです。</p>
<pre>
fontName: テキスト表示に使用するフォント名
fontSize: テキスト表示に使用するフォントの大きさ
fontColor: フォントの色
fontBold: フォントを太字にするかを指定</pre>
<p> 埋め込みフォントやビットマップフォントも利用できます。</p>
<h4>ボタンの無効化</h4>
<p>ボタンを使用できない状態にするには enabled 属性の値を false にします。</p>
<pre>enabled: ボタンが使用できるかどうかを指定
alphaWhenDisabled: ボタンが無効のときのアルファ値</pre>
<p>デフォルトでは、ボタンを無効にすると、ボタンの表示が半透明になります。その際に使われるアルファ値は、alphaWhenDisabled に設定された値です。</p>
<p>&nbsp;</p>]]>
    </content>
</entry>

<entry>
    <title>Starling の TextFiled を使ったテキスト表示</title>
    <link rel="alternate" type="text/html" href="http://cuaoar.jp/2011/12/starling-textfiled.html" />
    <id>tag:cuaoar.jp,2011://1.606</id>

    <published>2011-12-28T02:44:26Z</published>
    <updated>2011-12-27T14:01:42Z</updated>

    <summary>Starling では、文字を表示するために TextField というクラスが...</summary>
    <author>
        <name>ackie</name>
        
    </author>
    
        <category term="Starling" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://cuaoar.jp/">
        <![CDATA[<p>Starling では、文字を表示するために <a href="http://doc.starling-framework.org/core/starling/text/TextField.html">TextField</a> というクラスが提供されています。フォントの種類、大きさ、色、位置などを指定して、テキストを画面に表示できます。</p>
<p>とはいえ、GPU で直接フォントを扱えるわけではありません。実際には、裏で Flash Player の TextFiled を使って CPU 描画したものを、ビットマップ化して GPU にアップロード、という動作をします。</p>
<p>つまり、Starling の TextField が提供するのは、与えられたテキストとフォントから、動的にテクスチャを生成する機能です。</p>
<p>そのため、カーソルで、表示されたテキスト内の文字を選択する、といった操作はできません。 （ただのビットマップなので）</p>
<p>また、特に動的に生成する理由のないテキストは、TextField を使うより、事前にテクスチャとして準備しておいた方が、実行時の効率は良さそうです。</p>]]>
        <![CDATA[<h4>TextField のインスタンス生成</h4>
<p>さて、下が TextField のコンストラクタの定義です。表示領域の幅と高さ、表示するテキストの 3 つの引数が必須です。</p>
<pre>TextField(width:int, height:int, text:String, 
  fontName:String = "Verdana", fontSize:Number = 12,
  color:uint = 0x0, bold:Boolean = false)</pre>
<p>どの値も、後から変更できますが、効率面からは、幅と高さはあまり変えない方が良いかもです。</p>
<p>下は、Hello World を表示するサンプルです。フォントの大きさと色をインスタンス生成後に指定しています。</p>
<pre>
import starling.text.<strong>TextField</strong>;
 
private var myTextField:<strong>TextField</strong>;
 
private function onAddedToStage(e:Event):void
{
  // TextFieldのインスタンスを生成
  myTextField = new <strong>TextField</strong>(160, 80, "Hello World");
 
  // TextFieldインスタンスに属性を指定
  myTextField.fontSize = 16;
  myTextField.color = 0x993333;
  myTextField.border = true;
 
  addChild(myTextField);
}</pre>
<p>border 属性の値を true にしておくと、TextField の領域が目で確認できるため、開発時には便利です。</p>
<p>Starling の TextField には、指定された幅と高さから、テキストがはみ出ないよう、フォントの大きさ自動的に調整する便利な機能があります。</p>
<pre>
myTextField.autoScale = true;</pre>
<p>TextField オブジェクトの autoScale 属性を true に設定すると、テキスト全体の表示が、フォントの大きさの指定よりも優先されます。</p>
<h4>Starling の便利クラス</h4>
<p>Starling には、色を指定するための <a href="http://doc.starling-framework.org/core/starling/utils/Color.html">Color</a> という便利クラスがあります。TextField の color 属性の指定に使えます。</p>
<pre>
import starling.utils.<strong>Color</strong>;
 
myTextField.color = <strong>Color.AQUA</strong>;</pre>
<p>また、テキスト配置の値を持つクラスもあります。縦方向の配置は <a href="http://doc.starling-framework.org/core/starling/utils/HAlign.html">HAlign</a>、横方向の配置は <a href="http://doc.starling-framework.org/core/starling/utils/VAlign.html">VAligin</a> です。</p>
<pre>
import starling.utils.<strong>HAlign</strong>;
import starling.utils.<strong>VAlign</strong>;
 
// TextFieldの左上に寄せて文字を配置
myTextField.hAlign = HAlign.<strong>LEFT</strong>;
myTextField.vAlign = VAlign.<strong>TOP</strong>;</pre>
<p>HAlign に定義されている値は、LEFT、CENTER、RIGHT の 3 種類、VAlign に定義されている値は、TOP、CENTER、BOTTOM の 3 種類です。</p>
<h4>フォントの埋め込み</h4>
<p>Starling の TextField では、埋め込んだ TrueType フォントの利用が可能です。</p>
<p>フォントを埋め込むと、表示結果が実行環境に依存しなくなるため、お勧めということになっています。日本語の場合は、いろいろと難しい面もありそうですが。</p>
<p>ともあれ、以下が、フォント埋め込みのサンプルです。Ubuntu という名前のフォントを埋め込んでいます。</p>
<pre>
[Embed(source=&quot;Ubuntu-R.ttf&quot;, <strong>embedAsCFF=&quot;false&quot;</strong>, fontFamily=&quot;<strong>Ubuntu</strong>&quot;)]
private static const UbuntuRegular:Class;
 
private function onAddedToStage(e:Event):void
{
  myTextField = new TextField(160, 80, &quot;Hello World&quot;, &quot;<strong>Ubuntu</strong>&quot;, 16);
  myTextField.color = 0x993333;
  addChild(myTextField);
}</pre>
<p>Embed の指定の際に、embedAsCFF の記述は必須です。</p>
<h4>ビットマップフォントの使用</h4>
<p>Starling の TextField ではビットマップフォントも使えます。</p>
<p>ビットマップフォントは、グリフをビットマップとして書き出したものです。個々の文字のファイル内の位置情報等は別途 XML 形式で記述します。</p>
<p>XML ファイル内は、以下のような形式になっています。基本情報、文字コードとテクスチャの関連、それからオプションとしてカーニング情報が記述されます。</p>
<pre>&lt;font&gt;
  &lt;info face=&quot;Desyrel&quot; size=&quot;35&quot; /&gt;
  &lt;common lineHeight=&quot;40&quot; /&gt;
  &lt;pages&gt;
    &lt;page id=&quot;0&quot; file=&quot;desyrel.png&quot; /&gt;
  &lt;/pages&gt;
  &lt;chars&gt;
    &lt;char id=&quot;48&quot; x=&quot;23&quot; y=&quot;1&quot; width=&quot;24&quot; height=&quot;23&quot; xoffset=&quot;3&quot; yoffset=&quot;13&quot; xadvance=&quot;23&quot; /&gt;
    &lt;char id=&quot;49&quot; x=&quot;48&quot; y=&quot;1&quot; width=&quot;12&quot; height=&quot;23&quot; xoffset=&quot;3&quot; yoffset=&quot;12&quot; xadvance=&quot;12&quot; /&gt;
  &lt;/chars&gt;
  &lt;kernings&gt; 
    &lt;kerning first=&quot;83&quot; second=&quot;83&quot; amount=&quot;-4&quot;/&gt;
  &lt;/kernings&gt;
&lt;/font&gt;</pre>
<p>これらビットマップフォントの情報は <a href="http://doc.starling-framework.org/core/starling/text/BitmapFont.html">BitmapFont</a> クラスに読み込みます。以下はその手順です。</p>
<p>まず、それぞれのファイルを埋め込みます。ここはテクスチャアトラスとまったく同じ手順です。</p>
<pre>
[Embed(source = &quot;desyrel.png&quot;)]
private static const DesyrelTexture:Class;
 
[Embed(source=&quot;desyrel.fnt&quot;, mimeType=&quot;application/octet-stream&quot;)]
private static const DesyrelXml:Class;</pre>
<p>次に、BitmapFont オブジェクトを生成します。</p>
<pre>
import starling.text.BitmapFont;
import starling.textures.Texture;
 
private function onAddedToStage(e:Event):void
{
  // ビットマップフォントの読み込み
  var texture:Texture = Texture.fromBitmap(new DesyrelTexture());
  // 文字情報の読み込み
  var xml:XML = XML(new DesyrelXml());
 
  // BitmapFontのインスタンス生成
  var myBitmapFont:BitmapFont = <strong>new BitmapFont</strong>(texture, xml);
 
  ...この先は下に続く
}</pre>
<p>生成した BitmapFont オブジェクトは使用する前に、registerBitmapFont() メソッドで TextField クラスに登録します。 （registerBitmapFont() は静的メソッドです）</p>
<p>その後、TextField の fontName 属性にビットマップフォントのフォント名を設定すると表示されます。フォント名は、BitmapFont オブジェクトの name 属性から取得できます。</p>
<pre>
import starling.text.TextField;
 
private function onAddedToStage(e:Event):void
{
  ...上からの続き
 
  // TextFieldクラスにビットマップフォントを登録
  TextField.<strong>registerBitmapFont</strong>(myBitmapFont);
 
  // TextFieldのインスタンスを生成
  myTextField = new TextField(300, 150, &quot;Hello World&quot;);
  // ビットマップフォントのフォント名を設定
  myTextField.<strong>fontName </strong>= myBitmapFont.<strong>name</strong>;
 
  addChild(myTextField);
}</pre>
<p>不要になったビットマップフォントは unregisterBitmapFont() メソッドで登録を削除できます。引数に削除したいフォント名を指定します。</p>
<p>その際、削除した BitmapFont に対して dispose() も呼ばれます。これを避けたい場合は、2 つ目の引数に false を指定します。</p>
<pre>TextField.unregisterBitmapFont(myBitmapFont.name, <strong>false</strong>);</pre>
<p>ビットマップフォントのテクスチャは、独立したファイルではなく、一般の<a href="http://cuaoar.jp/2011/12/movieclip-starling.html#textureatlas">テクスチャアトラス</a>と一緒のファイルに追加する形でも利用できます。これによりテクスチャの切り替えを減らせる場合もありそうです。</p>
<h4>ビットマップフォントの表示設定</h4>
<p>ビットマップフォントを、制作時の大きさで表示したい時は、TextField オブジェクトの fontSize 属性に BitmapFont.NATIVE_SIZE を指定します。</p>
<pre>
// ビットマップフォントの元の大きさで表示する
myTextField.fontSize = BitmapFont.<strong>NATIVE_SIZE</strong>;</pre>
<p>また、ビットマップフォントを制作時の見た目で表示したい時は、TextField オブジェクトの fontSize 属性に Color.WHITE を指定します。</p>
<pre>
// ビットマップフォントのテクスチャそのままを表示する
myTextField.color = Color.<strong>WHITE</strong>;
</pre>
<p>color 属性のデフォルト値は黒のため、何も指定しないと、黒色のテキストが描画されます。</p>

<p>最後に、ビットマップフォントの制作には以下のツールが推奨されています。</p>
<ul>
  <li> Windows: Bitmap Font Generator （Angel Code：無償）</li>
  <li> Mac OS: Glyph Designer （71squared：有償）</li>
</ul>
<p>&nbsp;</p>]]>
    </content>
</entry>

<entry>
    <title>MovieClip クラスを利用した Starling のアニメーション</title>
    <link rel="alternate" type="text/html" href="http://cuaoar.jp/2011/12/movieclip-starling.html" />
    <id>tag:cuaoar.jp,2011://1.602</id>

    <published>2011-12-27T03:13:07Z</published>
    <updated>2011-12-27T04:16:57Z</updated>

    <summary> Flash でアニメーションと言えばやはり MovieClip ですが、Sta...</summary>
    <author>
        <name>ackie</name>
        
    </author>
    
        <category term="Starling" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://cuaoar.jp/">
        <![CDATA[<p> Flash でアニメーションと言えばやはり MovieClip ですが、Starling にも <a href="http://doc.starling-framework.org/core/starling/display/MovieClip.html">MovieClip</a> というクラスがあります。もちろんアニメーション用のクラスです。</p>
<p><a href="http://cuaoar.jp/2011/12/starling-flash-1.html">前回</a>少し触れましたが、Starling で画面に表示できるのは、ビットマップ画像か色を指定した矩形です。そのため、名前は同じ MovieClip でも、Starling の MovieClip は、フレーム毎に割り当てられたビットマップを表示するクラスとなっています。</p>
<p>また、Starling の MovieClip には子オブジェクトを管理したり、フレームにスクリプトを持つ機能がありません。この点も Flash Player の MovieClip とは大きく異なります。</p>
<p>（Starling では、表示リストの管理は Sprite の担当です。一方、MovieClip は Image クラスにタイムライン機能を足した Image のサブクラスです。MovieClip が Sprite のサブクラスである Flash Player とは異なり、両者の役割はほとんど被りません。）</p>]]>
        <![CDATA[<h4>スプライトシートとテクスチャアトラス</h4>
<p>MovieClip の各フレームを表示する際、GPU では、表示するフレームに割り当てられたテクスチャが、シェーダから利用できるよう準備が行われます。その際、テクスチャが、フレーム毎に物理的に異なるビットマップファイルだったりすると、フレームを進めるたびにテクスチャの切り替えが発生します。</p>
<p>テクスチャの切り替え処理には当然時間がかかります。また、テクスチャの GPU へのアップロードが必要になると、さらにオーバーヘッドは増します。</p>
<p>一般的に、この問題を回避するため、各フレームのテクスチャを 1 つのファイルにまとめた物を用意します。これをスプライトシートと呼びます。</p>
<p>下の図は、Starling のサンプルに含まれるスプライトシートの 1 部を切り出したものです。</p>
<p><img src="http://cuaoar.jp/images/spritesheetsample.jpg" width="349" height="157" /></p>
<p>複数フレーム分のテクスチャが 1 つのファイルになっていると、GPU にとっては使う場所を変えるだけで、テクスチャ自体を切り替えることなく、描画処理が行えます。そのため高速にフレームを更新できます。</p>
<p>また、Stage3D が扱うテクスチャの幅は 2 の階乗というルールのため、それ以外の幅のテクスチャでは、Starling 内部で余分な事前処理が発生します。しかし、スプライトシートの場合は、表示されるテクスチャが、より大きなテクスチャ （スプライトシート） の 1 部となるため、個々のテクスチャの幅に頭を悩ませる必要がなくなります。</p>
<p>この最適化をさらに 1 歩進めたのが、テクスチャアトラスです。テクスチャアトラスは複数のスプライトシートを 1 つのファイルにまとめたものです。同時に複数のアニメーションを再生する場合は特に有効です。</p>
<p>テクスチャアトラスを作るには、次期バージョンの Flash Professional CS6 でサポートされるらしい、ベクターアニメーションのスプライトシートへの書き出し機能を待つか、<a href="http://www.texturepacker.com" target="">Texture Packer</a> 等のツールを利用することになります。</p>
<h4><a name="textureatlas" id="textureatlas"></a>テクスチャアトラスの読み込み</h4>
<p>テクスチャアトラスを使うと、フレームごとに、それぞれ、テクスチャアトラス内のどの領域を表示するか？ という情報が必要になってきます。</p>
<p>そのため、以下のような形式で各フレームのテクスチャ情報を指定することになっています。ツールを使ってテクスチャアトラスを生成する場合は、このような XML ファイルも同時に生成されると思います。</p>
<pre>&lt;TextureAtlas imagePath='atlas.png'&gt;
  &lt;SubTexture name='walk_0' x='0' y='0' height='150.5' width='87.0'/&gt;
  &lt;SubTexture name='walk_1' x='88' y='0' height='150.5' width='87.0'/&gt;
  &lt;SubTexture name='walk_2' x='176' y='0' height='150.5' width='87.0'/&gt;
  &lt;SubTexture name='walk_3' x='264' y='0' height='150.5' width='87.0'/&gt;
&lt;/TextureAtlas&gt;</pre>
<p>TextureAtlas タグの imagePath 属性は、テクスチャアトラスのファイル名です。この場合は、atlas.png です。</p>
<p>SubTexutre タグの name 属性は、アニメーションの識別名の後に、フレームの番号を追加したものです。残りの x, y, height, width で、テクスチャとして使う領域を指定します。<br />
（実際に <a href="http://doc.starling-framework.org/core/starling/textures/SubTexture.html">SubTexture</a> というテクスチャの一部を扱うためのクラスがあります）</p>
<p>さて、テクスチャアトラスの準備ができたら、以下のようにプログラムに埋め込みます。</p>
<pre>
[Embed(source = &quot;atlas.png&quot;)]
private static const MyBitmap:Class;
 
[Embed(source=&quot;atlas.xml&quot;, mimeType=&quot;application/octet-stream&quot;)]
private static const MyXml:Class;</pre>
<p>これらの情報は <a href="http://doc.starling-framework.org/core/starling/textures/TextureAtlas.html">TextureAtlas</a> というクラスでまとめて管理します。テクスチャアトラス （PNG ファイル） は、一旦 Texture クラスに読み込んでから、XML ファイルと一緒に、TextureAtras のコンストラクタに渡します。</p>
<p>TextureAtlas のオブジェクトからは、識別名を指定して、Texture の （実際には SubTexture の） ベクターを取得できます。その際に使用するメソッドは getTextures() です。</p>
<pre>
import starling.textures.<strong>TextureAtlas</strong>;
 
private function onAddedToStage(e:Event):void
{
  // テクスチャアトラスの読み込み
  var myTexture:Texture = Texture.fromBitmap(new MyBitmap());
  // テクスチャアトラス内の領域情報の読み込み
  var myXml:XML = XML(new MyXml());
 
  // TextureAtlasのインスタンス生成
  var myTextureAtlas:<strong>TextureAtlas</strong> = new TextureAtlas(myTexture, myXml);
  // &quot;walk_&quot;を識別名として持つTextureのベクター生成
  var frames:Vector.&lt;Texture&gt; = myTextureAtlas.<strong>getTextures</strong>(&quot;walk_&quot;);
  
  ...この先は下に続く
}</pre>
<p>ベクター内の最初のテクスチャの大きさが、アニメーションの表示領域を決定します。</p>
<h4>アニメーションの再生</h4>
<p>ここまでくれば、あとは MovieClip のインスタンスを生成するだけです。MovieClip コンストラクタの引数には、上で取得したテクスチャのベクターを指定します</p>
<pre>
import starling.display.MovieClip;
 
private var myMovieClip:MovieClip;
 
private function onAddedToStage(e:Event):void
{
  ...上からの続き
 
  // MovieClipオブジェクトの生成
  myMovieClip = new MovieClip(frames);
 
  // アニメーション再生開始
  Starling.juggler.add(myMovieClip);
  addChild(myMovieClip);
}</pre>
<p>お気づきのように、MovieClip の再生にも Tween と同様 <a href="http://cuaoar.jp/2011/12/tween-starling.html#juggler">Juggler</a> を使います。MovieClip も IAnimatable のサブクラスです。</p>
<p>Juggler に MovieClip を追加すると再生が開始されます。再生を制御するため、以下の 3 つのメソッドが用意されています。</p>
<pre>myMovieClip.play();
myMovieClip.pause();
myMovieClip.stop();</pre>
<p>pause() の後に play() を呼んだ場合は続きから再生されますが、stop() の後に play() を呼ぶと最初から再生されます。</p>
<p>標準では、アニメーションは繰り返し再生されます。この設定は loop 属性の設定により変えることができます。再生中かどうかは  isPlaying 属性で調べられます。</p>
<p>アニメーションが最後まで再生されると movieComplete イベントが発生します。再生が完了したら次の処理に移りたいという場合に使えそうです。</p>
<pre>
myMovieClip.addEventListener(Event.MOVIE_COMPLETED, onMovieComplete);</pre>
<p>アニメーションが繰り返し再生されるときは、再生が完了するたびに movieComplete イベントが発生します。</p>
<p>MovieClip の親の Sprite が Stage から削除されたら、MovieClip は再生を中止しなければなりません。そこで、以下のような記述を追加しておきます。</p>
<pre>addEventListener(Event.REMOVED_FROM_STAGE, onRemovedFromStage);
 
private function onRemovedFromStage(event:Event):void
{
  Starling.juggler.remove(myMovieClip);
}</pre>
<p>Juggler の remove() メソッドは MovieClip だけでなく Tween も削除できます。</p>
<h4>ちょっと変わった MovieClip の使い方</h4>
<p>MovieClip のコンストラクタの第 2 引数に、任意のフレームレートを指定することができます。こんな感じです。</p>
<pre>
// 40 fpsを指定
myMovieClip = new MovieClip(frames, 40);</pre>
<p>MovieClip ごとに、異なるフレームレートの指定が可能です。</p>
<p>再生中のフレームレートは fps 属性から取得できます。また、fps 属性に値を設定することにより、フレームレートを変更することもできます。</p>
<p>それから、任意のフレームに対して、個別の再生時間を指定することもできます。下は、5 フレーム目を 2 秒間再生するよう設定している例です。</p>
<pre>myMovieClip.setFrameDuration(5, 2);</pre>
<p>後からフレームの追加や削除もできます。addFrameAt()、removeFrameAt() メソッドを使います。全部で 5 フレームのアニメーションの 10 フレーム目に追加する、といったような指定はできません。</p>
<pre>
myMovieClip.addFrameAt(5, frames[10])
myMovieClip.removeFrameAt(5)</pre>
<p>フレームのテクスチャを入れ替えることもできます。使うメソッドは setFrameTexture() です。</p>
<pre>myMovieClip.setFrameTexture(5, frames[10]);</pre>
<p>フレームに音を関連付けることもできます。setFrameSound() メソッドを使います。</p>
<pre>[Embed(source=&quot;step.mp3&quot;)]
private static const StepSound:Class;
 
myMovieClip.setFrameSound(5, new StepSound() as Sound);</pre>
<p>これで、5 フレーム目が表示されるタイミングで、指定した音が再生されます。</p>
<p>フレームに直接スクリプトを関連付けることはできません。代わりに Juggler.delayCall() メソッドが使用できます。</p>
<p>以上で、Starling のアニメーションの基本は終わりです。見ての通り、Starling は表現の柔軟さでは CPU 描画にかないません。高速な描画を安定して行いたい場合の選択肢という位置づけあたりが適当そうです。</p>
<p>&nbsp;</p>]]>
    </content>
</entry>

<entry>
    <title>Flex のセキュリティ問題とオープンソースプロジェクトの最近の状況</title>
    <link rel="alternate" type="text/html" href="http://cuaoar.jp/2011/12/flex-5.html" />
    <id>tag:cuaoar.jp,2011://1.605</id>

    <published>2011-12-23T01:21:09Z</published>
    <updated>2011-12-23T01:29:34Z</updated>

    <summary>今月の Flex 関連の情報のまとめです。 まず、Flex 3 から Flex ...</summary>
    <author>
        <name>ackie</name>
        
    </author>
    
        <category term="Flex" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://cuaoar.jp/">
        <![CDATA[<p>今月の Flex 関連の情報のまとめです。</p>
<p>まず、Flex 3 から Flex 4.5 まで全てのバージョンに影響するセキュリティ問題の件です。<br />（最新の Flex 4.6 は対応済みです。Flash Builder 4.6 に含まれる Flex 3.6A SDK も対応済みです）</p>
<p>XSS 関連の問題なので、AIR アプリは対象外です。また、Flex 4.x SDK で、RSL を使って Flex フレームワークをリンクしている場合も、ごく一部の例外を除き影響を受けません。</p>
<p>直ぐにこの問題に対応できるよう、AIR ベースのパッチツールが提供されています。 （<a href="http://kb2.adobe.com/jp/cps/915/cpsid_91544/attachments/APSB11_25_Patch_Tool.air">APSB11_25_Patch_Tool.air</a>: Win と Mac 上で実行可能）</p>
<p>パッチツールを起動してから、SWF ファイルを指定すると、問題のあるバイトコードを置き換えてくれます。また、SWF に脆弱性が含まれているかを確認する目的でも利用できます。</p>]]>
        <![CDATA[<p>ただし、Flex SDK に含まれるコンパイラ以外のツールを使用して生成された SWF には、この方法は有効ではありません。</p>
<p>脆弱性の存在が確認された場合は、SDK の置き換えが推奨されています。Flex 3.0 から Flex 4.5.1 まで、全てのバージョンに対応版が提供されます。 （<a href="http://www.adobe.com/go/flexsdk3securitybuild_jp">3.0A</a>, <a href="http://www.adobe.com/go/flexsdk3securitybuild_jp">3.0.1A</a>, <a href="http://www.adobe.com/go/flexsdk3securitybuild_jp">3.1A</a>, <a href="http://www.adobe.com/go/flexsdk3securitybuild_jp">3.2A</a>, <a href="http://www.adobe.com/go/flexsdk3securitybuild_jp">3.3A</a>, <a href="http://www.adobe.com/go/flexsdk3securitybuild_jp">3.4A</a>, <a href="http://www.adobe.com/go/flexsdk3securitybuild_jp">3.4.1A</a>, <a href="http://www.adobe.com/go/flexsdk3securitybuild_jp">3.5B</a>, <a href="http://www.adobe.com/go/flexsdk3securitybuild_jp">3.6A</a>, <a href="http://www.adobe.com/go/flexsdk4securitybuild_jp">4.0A</a>, <a href="http://www.adobe.com/go/flexsdk4securitybuild_jp">4.1A</a>, <a href="http://www.adobe.com/go/flexsdk45securitybuild_jp">4.5A</a>, <a href="http://www.adobe.com/go/flexsdk45securitybuild_jp">4.5.1A</a>）</p>
<p>Flex 3.x SDK には、Charts、AdvancedDataGrid 等が含まれない点にはご注意ください。これらは、インストール済みの SDK から新しい SDK にコピーが必要です。</p>
<p>また、Flash Builder （Flex Builder） ユーザには、SDK を変える前に、既存のワークスペースのバックアップが推奨されています。</p>
<p>この修正により、別ドメインからモジュールを読み込む際に、trustContent や SecurityDomain を指定していないアプリケーションは、修正が必要になる場合があります。</p>
<p>その他詳しくは、こちらのサポート文書をご覧ください。 （<a href="http://kb2.adobe.com/jp/cps/915/cpsid_91544.html">Flexのセキュリティ問題（APSB11-25）</a>）</p>
<h4>Flex のオープンソース化の状況</h4>
<p>Apache に Flex SDK を提供する件については、アドビの法務部門の確認が完了し、年内に Apache 提案書を提出できる見通し、BlazeDS はまだ法務の確認中のため、新年に提案書を提出見込みとなっています。</p>
<p>また、オープンソースプロジェクトへのコミッターの募集が行われ、2 日間で 12 名の枠に対して 65 名の応募があったそうです。もしかして、オープンソース化後のほうが開発者が多いという事態になるかもです。</p>
<p>来年早々から、全世界の Flex ユーザグループを訪問して回る予定とのこと。日本にも来てくれることを期待しましょう。</p>
<p>&nbsp;</p>]]>
    </content>
</entry>

<entry>
    <title>Android 4.0 対応の Flash Player 11.1 公開</title>
    <link rel="alternate" type="text/html" href="http://cuaoar.jp/2011/12/android-40-flash-player.html" />
    <id>tag:cuaoar.jp,2011://1.604</id>

    <published>2011-12-23T00:28:48Z</published>
    <updated>2011-12-23T01:36:53Z</updated>

    <summary>先週末に Android 4.0 をサポートする Flash Player 11...</summary>
    <author>
        <name>ackie</name>
        
    </author>
    
        <category term="Device" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://cuaoar.jp/">
        <![CDATA[<p>先週末に Android 4.0 をサポートする Flash Player 11.1 と AIR 3.1 が公開されました。</p>
<p>それぞれのバージョンは、</p>
<ul>
  <li>Flash Player: 11.1.112.60 </li>
  <li>Adobe AIR: 3.1.0.556</li>
  <li>AIR SDK (Android): 3.1.0.488</li>
</ul>
<p>です。</p>
<p>更新は <a href="https://market.android.com/details?id=com.adobe.flashplayer">Android Market</a> から入手できます。</p>
<p>既報の通り、デバイス向けの Flash Player に関しては、これが最後のメジャーバージョンになります。つまり、Flash Player 11.2 for Android は登場しません。</p>
<p>脆弱性や主要なバグへの対応は引き続き行われるので、Stage3D が使えないことを除けば、しばらく違いを感じることは （Android 5.0 が出るまで？） 無いかもしれません。個人的には、Android の次の更新までに最新のデバイスを買っておきたい気がしてます。</p>
<p>AIR は、デバイス向けにも引き続き新しいバージョンが提供されます。</p>
<p>&nbsp;</p>]]>
        
    </content>
</entry>

<entry>
    <title>Starling でビットマップを表示する方法</title>
    <link rel="alternate" type="text/html" href="http://cuaoar.jp/2011/12/starling-flash-1.html" />
    <id>tag:cuaoar.jp,2011://1.601</id>

    <published>2011-12-22T03:11:46Z</published>
    <updated>2011-12-27T12:43:55Z</updated>

    <summary>今回は、ビットマップ （テクスチャ） の表示方法です。Starling では、ビ...</summary>
    <author>
        <name>ackie</name>
        
    </author>
    
        <category term="Starling" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://cuaoar.jp/">
        <![CDATA[<p>今回は、ビットマップ （テクスチャ） の表示方法です。Starling では、ビットマップか、<a href="http://cuaoar.jp/2011/12/tween-starling.html">前回</a>までのように矩形を使って画面を構成します。</p>
<p>記事の後半では、動的にピットマップを更新する方法もご紹介します。</p>
<p>（注：以下の文章では、&quot;テクスチャ ＝ ビットマップ&quot; と思ってお読みください）</p>
<h4>Image と Texture クラス</h4>
<p>Starling フレームワークでは、ビットマップを表示するのに <a href="http://doc.starling-framework.org/core/starling/display/Image.html">Image</a> を使います。Image は Quad のサブクラスです。Quad にビットマップを扱う機能を追加したものが Image という位置づけです。</p>
<p>Flash Player の表示オブジェクトでは Bitmap に BitmapData があるように、Starling では Image に <a href="http://doc.starling-framework.org/core/starling/textures/Texture.html">Texture</a> があります。Image が表示オブジェクトとして使われて、データの実体は Texture が持つ、という関係です。</p>]]>
        <![CDATA[<p>Texture に読み込めるイメージフォーマットは、PNG, JPEG, JPEG-XR, ATF の 4 種類です。それぞれのフォーマットごとに、専用の読み込み関数が用意されています。</p>
<p>例えば、Bitmap オブジェクトから Texture オブジェクトを作る場合は、以下のようになります。</p>
<pre>var myTexture:Texture = Texture.fromBitmap(myBitmap);</pre>
<p>あとは、生成した Texture から Image オブジェクトを生成し、表示リストに追加するだけで、画面にビットマップが表示されます。</p>
<p>下は、myBitmap.png というファイルを表示するサンプルです。埋め込んだビットマップを扱う箇所を除けば、矩形を表示するサンプルのコードとほぼ同じです。</p>
<pre>import flash.display.Bitmap;
 
import starling.display.<strong>Image</strong>;
import starling.textures.<strong>Texture</strong>;
import starling.display.Sprite;
import starling.events.Event;
 
public class MyStarlingSprite extends Sprite
{
  // PNGファイルを埋め込む
  [Embed(source = "myBitmap.png")]
  private static const MyBitmap:Class;
 
  private var myImage:<strong>Image</strong>;
 
  public function MyStarlingSprite()
  {
    addEventListener(Event.ADDED_TO_STAGE, onAdded);
  }
  private function onAddedToStage(e:Event):void
  {
    var myBitmap:Bitmap = new MyBitmap();
 
    // BitmapからTextureオブジェクトを生成
    var myTexture:<strong>Texture</strong> = Texture.<strong>fromBitmap</strong>(myBitmap);
    // Imageオブジェクトを生成
    myImage = new <strong>Image</strong>(myTexture);
 
    // 表示リストに追加
    addChild(myImage);
  }
}</pre>
<p>Starling の Texture は縦と横のピクセル数が 2 の階乗 (1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048) を前提としているようです。それ以外の大きさのビットマップから Texture を生成すると、Starling は自動的に、最も近い大きさに合わせて Texture を作り直します。</p>
<h4>ベクタ画像をテクスチャとして表示する</h4>
<p>Flash Player の表示オブジェクトは、ベクターのデータをビットマップ化する機能を持っています。これを利用すると、AS3 や Flash Professional の機能を使って描いたベクタ画像から、Image オブジェクトを生成できます。</p>
<p>処理効率を考えると、わざわざ実行時にビットマップを生成するよりは、事前にビットマップ化しておいた方が良いはずです。従って、この方法は、動的にテクスチャを生成する必要がある場合向け、と言えそうです。</p>
<p>具体的な例を紹介します。下は、Sprite の graphic 属性に描いた円を、テクスチャに変換して Image を使って表示する例です。</p>
<pre>
private function onAddedToStage(e:Event):void
{
　　var radius:uint = 100;
 
  // Flash PlayerのSpriteを生成
　　var shape:<strong>flash.display.Sprite</strong> = new flash.display.Sprite();
　
  // ランダムに色を決めてgraphics属性に円を描く
　　var color:uint = Math.random() * 0xFFFFFF;
　　shape.graphics.beginFill(color);
　　shape.graphics.drawCircle(radius, radius, radius);
　　shape.graphics.endFill();
　
  // SpriteをBitmapDataに変換
　　var buffer:BitmapData =
    new BitmapData(radius * 2, radius * 2, true, color);
　　buffer.draw(shape);
　
  // BitmapDataからTextureを作成
　　var myTexture:Texture = Texture.fromBitmapData(buffer);
　 // TextureからImageを作成
　　myImage = new Image(myTexture);
 
  // 表示リストに追加
　　addChild(myImage);
}</pre>
<p>この場合、コード内では Flash Player の表示オブジェクトを使うことになるので、Starling の表示オブジェクトと混同しないように、注意が必要です。</p>
<h4>動的なテクスチャの更新</h4>
<p>上の方法を使えば、動的に生成したビットマップを表示できます。しかし、一旦表示したビットマップを更新するには、ベクター画像の作成からやり直しです。</p>
<p>つまり CPU 描画と GPU 描画の両方が行われるわけで、あまり効率が良い手段では無さそうです。 （常に避けるべき、という意味では無いです）</p>
<p>こんな時は、<a href="http://doc.starling-framework.org/core/starling/textures/RenderTexture.html">RenderTexture</a> クラスが役に立つかもしれません。RenderTexture は Texture のサブクラスで、&quot;Starling の表示オブジェクト&quot; を既存の Image オブジェクトに描き込む機能を提供します。描画は GPU の機能だけで行われるため効率的です。</p>
<p>RenderTexture は &quot;Flash Player の表示オブジェクト&quot; を扱えるわけではないので、既に用意されている Image オブジェクトをビットマップに合成するという使い方が基本になります。とすると、特に、事前に表示するグラフィックが分かっている場合に有効そうです。</p>
<p>RenderTexture のコンストラクタには、描画領域の大きさだけ指定します。この時点では、RenderTexture はまだ真っ白 （というか透明） です。</p>
<p>次に RenderTextire のインスタンスを使って Image のインスタンスを生成する、という手順は Texture のときと同じです。下はそのサンプルです。</p>
<pre>import starling.textures.<strong>RenderTexture</strong>;
 
private var myRenderTexture:<strong>RenderTexture</strong>;
 
private function onAddedToStage(e:Event):void
{
  // RenderTextureオブジェクトを生成
  myRenderTexture = new <strong>RenderTexture</strong>(320, 480);
  // RenderTextureからImageを作成
  var canvas:Image = new Image(<strong>myRenderTexture</strong>);
 
  // 表示リストに追加
  addChild(canvas);
}</pre>
<p>これで描画領域の指定が完了しました。</p>
<p>あとは、RenderTexture を更新すれば、画面の表示も自動的に更新されます。</p>
<p>RenderTexuture に Starling の表示オブジェクトを描くには、draw() メソッドを使います。描画する表示オブジェクトには、位置、スケール、角度、アルファを指定できます。下の例では、RenderTexture 内の x 座標と y 座標を指定しています。</p>
<pre>
myImage.x = 10;
myImage.y = 20;
myRenderTexture.<strong>draw</strong>(myImage);</pre>
<p>たくさんの表示オブジェクトを描画したい場合のために、drawBundled() というメソッドも用意されています。これは、複数の表示オブジェクトの描画を一括して行うことで、処理効率の向上を狙ったものです。GPU を効率的に使う上で、GPU に対する描画要求の回数を減らすのは重要です。</p>
<p>drawBundled() の引数には関数を指定します。その関数内で呼んだ draw() はまとめて処理されます。</p>
<p>下は、画像を少しずつ回転させながら書く例です。</p>
<pre>
myRenderTexture.drawBundled(function():void
{
  var count:int = 30;
  var diff:Number = 2 * Math.PI / count;
 
  for (var i:int=0; i&lt;count; ++i)
  {
    myImage.rotation = diff * i;
    myRenderTexture.draw(myImage);
  }
});</pre>
<p>実行すると下のようになります。画像は Starling のサンプルに含まれるものを使ってみました。</p>
<p><img alt="renderingtexturesample.jpg" src="http://cuaoar.jp/images/renderingtexturesample.jpg" width="336" height="288" /></p>
<p>RenderTexture に描画された内容を全て消去したい場合は、clear() メソッドを使います。</p>
<h4>リソースの開放</h4>
<p>不要になったテクスチャがあるときは、<a href="http://cuaoar.jp/2011/12/enterframe-starling.html#dispose">dispose()</a> でリソースを開放します。特に、RenderTexture は一時的な利用が多いと思われるので、お忘れなく。</p>
<pre>
public override function dispose():void
{
  mｙRenderTexture.dispose();
  super.dispose();
}</pre>
<p><a href="http://cuaoar.jp/2011/12/movieclip-starling.html">次回</a>は、パラパラ漫画によるアニメーションの実現方法をご紹介する予定です。</p>
<p>&nbsp;</p>]]>
    </content>
</entry>

<entry>
    <title>Tween クラスを利用した Starling のアニメーション</title>
    <link rel="alternate" type="text/html" href="http://cuaoar.jp/2011/12/tween-starling.html" />
    <id>tag:cuaoar.jp,2011://1.600</id>

    <published>2011-12-21T02:35:12Z</published>
    <updated>2011-12-21T21:19:22Z</updated>

    <summary>前回は、EnterFrame イベントを使って、アニメーションを実現する方法をご...</summary>
    <author>
        <name>ackie</name>
        
    </author>
    
        <category term="Starling" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://cuaoar.jp/">
        <![CDATA[<p><a href="http://cuaoar.jp/2011/12/enterframe-starling.html">前回</a>は、EnterFrame イベントを使って、アニメーションを実現する方法をご紹介しました。今回は、Tween クラスを使った方法です。</p>
<p>Tween を使った場合の特徴の 1 つは、アニメーションの期間を秒数で指定することです。Tween は指定された時間をかけて、表示オブジェクトの属性値、例えば x 座標を最終的な値へと、だんだんと変化させます。</p>
<p>コードで書くと以下のような感じです。まず Tween のコンストラクタで、対象となるオブジェクトと時間を指定して、次に、animate() メソッドを使って、変化させる属性の名前と最終値を設定します。複数の属性を変化させる場合は animate() を何回も呼ぶことになります。</p>
<pre>
// myObjectを2秒かけて、横に50px、縦に80px移動させるアニメーションの指定
var myTween:Tween = new <strong>Tween</strong>(myObject, 2.0);
myTween.<strong>animate</strong>(&quot;x&quot;, myObject.x + 50);
myTween.<strong>animate</strong>(&quot;y&quot;, myObject.y + 80);</pre>]]>
        <![CDATA[<p>前回のサンプルから、Tween を使って onAddedToStage() を書き直したのが以下のコードです。矩形を 4 秒かけて (0, 0) から (220, 380) の座標に移動させる、というものです。</p>
<pre>
import starling.animation.<strong>Tween</strong>;
import starling.core.Starling;
import starling.display.Quad;
import starling.events.Event;
 
private function onAddedToStage(e:Event):void
{
  myQuad = new Quad(100, 100);
  myQuad.color = 0x00FF00;
 
  // Tweenオブジェクトの生成
  var myTween:<strong>Tween</strong> = new Tween(myQuad, 4.0);
  // 変化させる属性の指定
  myTween.<strong>moveTo</strong>(220, 380);
 
  // JugglerにTweenオブジェクトを追加する
  Starling.<strong>juggler</strong>.add(myTween);
}</pre>
<p>このサンプルでは、animate() の代わりに moveTo() メソッドが使われています。moveTo() は x 座標と y 座標の両方の移動を指定したい時に便利なメソッドです。</p>
<p>その他にも、似たような便利メソッドとして、比率を変える scaleTo() や アルファを変える fadeTo() が提供されています。なぜか角度を変えるメソッドは無いので、回転させるときは animate() 一択になります。</p>
<pre>
import starling.utils.deg2rad;
 
var myTween:Tween = new Tween(object, 2.0);
myTween。scaleTo（2）;
myTween.fadeTo(0);
myTween.animate(&quot;rotation&quot;, deg2rad(45));
Starling.juggler.add(myTween);</pre>
<p>上のサンプルで使用している deg2rad() は、角度をラジアンに変換する関数です。Starling のフレームワークに付いてきます。</p>
<h4><a name="juggler" id="juggler"></a>Juggler クラス</h4>
<p>さて、上のサンプルを良く見ると、Tween のインスタンスに必要な設定を行ったら、それを Starling の juggler という属性に追加しています。これが、アニメーション開始の合図になります。</p>
<p>Juggler はオブジェクトの &quot;時間を進める&quot; クラスです。ただし、IAnimatable というインターフェースを継承したオブジェクトだけが対象です。Tween は IAnimatable を継承しています。</p>
<p>Juggler はオブジェクトを渡されると、そのオブジェクトの時間を進め続けます。そして、オブジェクトに対して指定された期間が過ぎると、オブジェクトへの参照を自動的に開放します。</p>
<p>ところで、Juggler には delayCall() というメソッドがあります。これは、任意の関数を、指定した時間が経過したら呼び出すように Jaggler に指示するためのものです。呼び出す関数に引数を渡すこともできます。</p>
<p>下は、1 秒後に myFunc() という関数を呼び出して、引数に &quot;Hello&quot; を渡す例です。</p>
<pre>
Starling.juggler.delayCall(myFunc, 1.0, &quot;Hello&quot;);
 
private function myFunc(message:String):void
{
  trace(message);
}</pre>
<p>アニメーションの期間と、関数実行のタイミングを、同じ Juggler に管理させることで、両者を完全に同期させることが簡単にできます。便利です。</p>
<p>Juggler のオブジェクトは Starling クラスが提供するため、通常はこれを使ってアニメーションを開始すれば事足ります。ただ、アニメーションを個別に制御したい場合などは、自分で Juggler オブジェクトを生成したほうが便利なこともあるでしょう。</p>
<p>Juggler オブジェクトを自分で管理する場合は、EnterFrame イベントごとに、advanceTime() メソッドを呼ぶようにします。また、<a href="http://cuaoar.jp/2011/12/enterframe-starling.html#dispose">dispose()</a> でのリソース開放処理も必要になるかもしれません。</p>
<h4>イージングの種類の指定</h4>
<p>Tween には、イージング関数を指定できます。イージング関数の種類は、コンストラクタの 3 つ目の引数として指定します。デフォルト値は linear、すなわちイージング無し、です。</p>
<p>コンストラクタで設定したイージング関数を後から変えることはできません。Tween オブジェクトの transition 属性から、値の参照だけは可能です。</p>
<pre>
import starling.animation.<strong>Transitions</strong>;
 
var myTween:Tween = new Tween(myQuad, 4, <strong>Transitions.EASE_OUT_BOUNCE</strong>);</pre>
<p>上の例では、イージング関数に easeOutBounce を指定しています。ここに指定可能な値は <a href="http://doc.starling-framework.org/core/starling/animation/Transitions.html">Transitions</a> クラスに定義されています。</p>
<p>下は、Starling 作者のサイトに掲載されている、各イージング関数の動作イメージです。ご参考まで。</p>
<p><img alt="http://www.sparrow-framework.org/wp-content/uploads/2010/06/transitions.png" src="http://www.sparrow-framework.org/wp-content/uploads/2010/06/transitions.png" /></p>
<p>細かな調整はできません。この点は、Edge や Flex と同じです。</p>
<h4>Tween 進行状態の通知</h4>
<p>Tween には、アニメーションの開始、進行中、終了を知らせる関数を設定できます。AS2 のイベントハンドラっぽい感じの使い方です。</p>
<p>具体的な関数名は、それぞれ onStart(), onUpdate(), onComplete() です。onStart() と  onComplete() は 1 回ずつ、onUpdate() は更新の行われたフレームの数だけ呼ばれます。</p>
<p>下は、3 つの関数を設定した例です。</p>
<pre>
private function onAddedToStage(e:Event):void
{
  myQuad = new Quad(100, 100);
  myQuad.color = 0x00FF00;
 
  var myTween:Tween = new Tween(myQuad, 4, Transitions.EASE_OUT_BOUNCE);
  myTween.moveTo(220, 380);
  Starling.juggler.add(myTween);
 
  myTween.<strong>onStart</strong> = onStart;
  myTween.<strong>onUpdate</strong> = onProgress;
  myTween.<strong>onComplete</strong> = onComplete;
 
  addChild(myQuad);
}
 
private function onStart():void
{
  trace ("トゥイーンが開始されました");
}
private function onProgress():void
{
  trace ("トゥイーンが実行中です");
}
private function onComplete():void
{
  trace ("トゥイーンが終了しました")
}</pre>
<p>アニメーションの前処理や後処理を行いたいときには役立ちそうです。</p>
<p><a href="http://cuaoar.jp/2011/12/starling-flash-1.html">次回</a>は、Starling でのテクスチャの使い方をご紹介する予定です。いちおう、アニメーションの実現に使えなくもないかも？しれません。だとすると、今回紹介する Starling のアニメーションの実現方法は全部で 4 つということになりますが。。。</p>
<p>&nbsp;</p>]]>
    </content>
</entry>

<entry>
    <title>EnterFrame イベントを利用した Starling のアニメーション</title>
    <link rel="alternate" type="text/html" href="http://cuaoar.jp/2011/12/enterframe-starling.html" />
    <id>tag:cuaoar.jp,2011://1.599</id>

    <published>2011-12-20T03:03:25Z</published>
    <updated>2011-12-21T02:45:49Z</updated>

    <summary>今回は、前回の記事で紹介したコードをベースに、矩形を移動させてみます。利用するの...</summary>
    <author>
        <name>ackie</name>
        
    </author>
    
        <category term="Starling" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://cuaoar.jp/">
        <![CDATA[<p>今回は、<a href="http://cuaoar.jp/2011/12/starling-flash.html">前回の記事</a>で紹介したコードをベースに、矩形を移動させてみます。利用するのは、EnterFrame イベントです。</p>
<p>Starling の表示オブジェクトは、Flash Player の表示オブジェクトと同じ様に、EnterFrame イベントをサポートしています。そのため、EnterFrame のイベントリスナを追加すれば、新しいフレームの表示ごとにリスナ関数が実行されます。</p>
<p>Starling でのイベントのしくみや、リスナの登録方法も、Flash Player の表示リストとほぼ同様です。ということで、今回紹介する方法は、既存の Flash コンテンツを再利用しやすい方法と言えそうです。</p>
<p>さて、今回のサンプルでは矩形を回転させたいと思います。そうすると、前回のサンプルのまま単色ベタ塗りの矩形が回転しても様子が分かりにくいでしょうから、前準備として、矩形の塗りをグラデーションに変えたいと思います。</p>
<p>都合のよいことに Quad クラスは、Stage3D らしく、頂点ごとに色を指定する機能を持っています。メソッドの名前は setVertexColor() です。</p>
<p>setVertexColor() の最初の引数は頂点の番号です。番号は、0 から順に、左上、右上、左下、右下の頂点を指します。2 つ目の引数は色の指定です。</p>]]>
        <![CDATA[<pre>// myQuad.color = 0xABCDEF; の代わりに以下を記述
myQuad.setVertexColor(0, 0x000000);
myQuad.setVertexColor(1, 0xFF0000);
myQuad.setVertexColor(2, 0x00FF00);
myQuad.setVertexColor(3, 0x0000FF);</pre>
<p>以上の指定をすれば、あとは、自動的に各頂点間のピクセルの色が補完されるため、矩形の色がグラデーションになります。</p>
<h4>EnterFrame イベントリスナの利用</h4>
<p>さて、本題に戻って、EnterFrame イベントリスナの追加方法です。</p>
<p>使用する <a href="http://doc.starling-framework.org/core/starling/events/Event.html">Event</a> クラスが Starling フレームワークに含まれるクラスである点には注意が必要ですが、今までに AS3 でイベント処理のコードを実装したことがあれば、特に違和感無く使えると思います。 （リスナ関数の削除のタイミングが少し異なります：後述）</p>
<p>下は、EnterFrame イベントを使って、フレームごとに矩形を回転させるサンプルコードです。<a href="http://cuaoar.jp/2011/12/starling-flash.html">前回</a>のサンプル内の onAddedToStage() を修正したものです。</p>
<pre>private function onAddedToStage(e:Event):void
{
  // Quadのインスタンスを生成
  myQuad = new Quad(200, 200);
  // 各頂点の色を指定
  myQuad.setVertexColor(0, 0x000000);
  myQuad.setVertexColor(1, 0xFF0000);
  myQuad.setVertexColor(2, 0x00FF00);
  myQuad.setVertexColor(3, 0x0000FF);
 
  // Quadのインスタンスを中央に表示
  myQuad.x = stage.stageWidth - myQuad.width >> 1;
  myQuad.y = stage.stageHeight - myQuad.height >> 1;
	
  // SpriteにQuadのインスタンスを追加
  addChild(myQuad);
 
  // EnterFrameイベントリスナの追加
  myQuad.addEventListener(<strong>Event.ENTER_FRAME</strong>, onEnterFrame);
}
 
private function onEnterFrame(e:Event):void
{
  // Quadのインスタンスを回転させる
  (e.currentTarget as Quad).rotation += .01;
}</pre>
<p>フレームごとに rotation の値を大きくしているため、上のコードを実行すると、矩形が時計回りに回転します。その際、回転の基準は、矩形の左上角になっていると思います。</p>
<p>Starling の表示オブジェクトには、基準点を指定するための属性 pivotX と pivotY が用意されています。これらを利用すると、矩形内の任意の点を基準に回転させることができます。</p>
<p>pivotX と pivotY の初期値はどちらも 0 です。つまり、表示オブジェクトのデフォルトの基準点は左上の角です。</p>
<p>ここでは、基準点を矩形の中心に変更してみます。下は、そのサンプルです。</p>
<pre>
// 基準点をQuadインスタンスの中心に設定
myQuad.<strong>pivotX </strong>= myQuad.width &gt;&gt; 1;
myQuad.<strong>pivotY </strong>= myQuad.height &gt;&gt; 1;</pre>
<p>このように基準点を変更すると、表示位置の基準も変わりますから、その分表示位置がずれます。今回の例であれば、矩形の幅と高さの半分である 100 ピクセルずつ左と上に移動します。</p>
<p>そこで、位置の指定のコードを、基準点がずれた分、修正します。下が新しいコードです。</p>
<pre>
// Quadのインスタンスを中央に表示
myQuad.x = (stage.stageWidth - myQuad.width &gt;&gt; 1) + myQuad.pivotX;
myQuad.y = (stage.stageHeight - myQuad.height &gt;&gt; 1) + myQuad.pivotY;</pre>
<p>良く考えると、myQuad.pivotX = myQuad.width &gt;&gt; 1 なので、これは下のように書き換えられそうです。</p>
<pre>
// Quadのインスタンスを中央に表示
myQuad.x = stage.stageWidth &gt;&gt; 1;
myQuad.y = stage.stageHeight &gt;&gt; 1;</pre>
<p>以上で、画面の中央に位置する矩形が、図形の中心を基準点として回転するようになったでしょうか？</p>
<h4><a name="dispose" id="dispose"></a>リソースの開放</h4>
<p>Starling の表示オブジェクトには dispose() というメソッドがあります。これは、表示オブジェクトが破棄されるタイミングで呼ばれる、表示オブジェクト内で使用したリソースを開放するためのメソッドです。</p>
<p>Starling で表示オブジェクトのサブクラスを定義するときは、この dispose() の記述を忘れないようにします。さもないと、メモリリークの原因になってしまうかもしれません。</p>
<p>下は、今回のサンプルコード用の dispose() の例です。</p>
<pre>
public override function dispose():void
{
  removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
  myQuad.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
  super.dispose();
}</pre>
<p>サンプルを見ての通り、ここでの主な作業は、イベントリスナの削除です。Starling のイベントリスナには弱い参照が使えないので、このタイミングで確実に削除するようにします。</p>
<p>メソッドの最後の行で、super.dispose() を呼び出していますが、これにより、このオブジェクトに addChild() で追加された子オブジェクト全てに対して dispose() が呼ばれます。そのため、myQuad.dispose() は明示的に記述する必要がありません。</p>
<p>その他の、表示リストに追加されていない表示オブジェクトがあれば、dispose() の記述は必須になります。</p>
<p>また、表示リストに追加できないオブジェクトで、リソースの開放が必要なオブジェクトがあれば、ここに必要な処理を記述します。</p>
<p>例えば、仮に、もし、他のオブジェクトと共有しない専用のテクスチャ （ここでは myTexure とします） を参照していたならば、このオブジェクトが消滅すると myTexure テクスチャも不要になります。そのため、myTexure.dispose() を記述して、myTexure が保持するビットマップ用のメモリが開放されるようにします。</p>
<p><a href="http://cuaoar.jp/2011/12/tween-starling.html">次回</a>は、矩形を動かす方法その 2 をご紹介する予定です。</p>
<p>&nbsp;</p>]]>
    </content>
</entry>

<entry>
    <title>Starling を使った Flash コンテンツ表示の基本</title>
    <link rel="alternate" type="text/html" href="http://cuaoar.jp/2011/12/starling-flash.html" />
    <id>tag:cuaoar.jp,2011://1.598</id>

    <published>2011-12-19T02:21:13Z</published>
    <updated>2011-12-20T03:04:13Z</updated>

    <summary>Starling は Stage3D を利用した高速な 2D 描画の実現を目指し...</summary>
    <author>
        <name>ackie</name>
        
    </author>
    
        <category term="Starling" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://cuaoar.jp/">
        <![CDATA[<p>Starling は Stage3D を利用した高速な 2D 描画の実現を目指したフレームワークです。以前の記事 （<a href="http://cuaoar.jp/2011/09/starling-actionscript-3-1.html">Starling （ActionScript 3 の 2D フレームワーク） のご紹介のつづき</a>） で概要と簡単な使い方を紹介しました。</p>
<p>Starlig  では、アニメーションに 3 種類の方法が使えます。今回から、何回かに分けて、それぞれの書き方を紹介します。従来の表示リストのアニメーションと比較してみて下さい。</p>
<h4>開発環境の準備</h4>
<p>Starling の開発環境は、Flash Player 11 と AIR 3 への対応が前提です。現時点では、唯一サポートされた環境である Flash Builer 4.6 の利用をお勧めします。</p>
<p>Flash Professional CS5 もしくは CS5.5 を使う場合は、以下の記事で紹介した機能拡張が便利です。</p>
<ul>
  <li><a href="http://cuaoar.jp/2011/11/-flash-professional-cs5.html">日本語版 Flash Professional CS5 &amp; CS5.5 に Flash Player 11 設定を追加する MXP</a></li>
</ul>]]>
        <![CDATA[<p>それから、Starling フレームワークは github から入手できます。</p>
<ul>
  <li><a href="https://github.com/PrimaryFeather/Starling-Framework/zipball/master">PrimaryFeather/Starling-Framework/zipball</a></li>
</ul>
<p>上記リンクからダウンロードした ZIP に含まれている SWC ファイルをパスに追加すると、Starling アプリを開発できるようになります。</p>
<p>また、描画モードに direct を指定しないと、パブリッシュに成功しても画面には表示されません。</p>
<p>ですので、SWF であれば、wmode=direct を、AIR であれば、&lt;renderMode&gt;direct&lt;/renderMode&gt; の指定を忘れないようにしましょう。</p>
<h4>Starling インスタンスの生成</h4>
<p>Starling で描画をするには、まず Starling のインスタンスを生成し、次に start() メソッドを呼びます。</p>
<p>この箇所は、どのような Starling コンテンツでも、ほぼそのまま再利用できます。下が、その　（たぶん） 最も単純な例ですので、コピペして使ってみてください。Flash Professional の場合は、Fla ファイルのドキュメントクラスにするのが楽だと思います。</p>
<pre>import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
 
<strong>import starling.core.Starling;</strong>
　
[SWF(width=&quot;320&quot;,height=&quot;480&quot;,frameRate=&quot;60&quot;,backgroundColor=&quot;#000000&quot;)]
 
public class StartStarling extends Sprite
{
  private var myStarling:<strong>Starling</strong>;
　
  public function StartStarling()
  {
    stage.scaleMode = StageScaleMode.NO_SCALE;
    stage.align = StageAlign.TOP_LEFT;
　
    // Starlingのインスタンスを生成
    myStarling = <strong>new Starling</strong>(MyStarlingSprite, stage);
    // 描画処理を開始
    myStarling.<strong>start()</strong>;
  }
}</pre>
<p>Starling のコンストラクタの第 1 引数は、Starling の Sprite です。この Sprite の内容が実際の画面描画に使われます。描画情報は、Flash Player の Sprite と同様に、子オブジェクトのリスト構造として保持されます。第 2 引数は、表示オブジェクトを描画する stage です。</p>
<p>Starling のコンストラクタは 5 つの引数を持ちますが、3 つ目以降はデフォルト値を持つため、通常、指定は不要です。</p>
<p>明示的にソフトウェアでの 3D 描画を指定したい場合には、5 つの引数を記述することになります。最後の引数が描画モードの指定です。</p>
<pre>// 5つ目めの引数で描画モードを指定
myStarling =
　 new Starling(Game, stage, null, null, Context3DRenderMode.<strong>SOFTWARE</strong>);</pre>
<p>これで、どの環境でも GPU の描画機能はオフになります。</p>
<p>もし、実行中に、ソフトウェア描画にフォールバックしているかを知りたければ、Starling インスタンスの context.driverInfo 属性から確認できます。</p>
<p>以下は、context3DCreate イベントを使って、Stage3D の初期化後に、ソフトウェア描画であれば、フレームレートを半分に設定するという例です。</p>
<pre>stage.stage3Ds[0].addEventListener(Event.CONTEXT3D_CREATE, onContext3DCreate);
 
private function onContext3DCreate(event:Event):void
{
  if(Starling.<strong>context</strong>.<strong>driverInfo</strong>.toLowerCase().indexOf(&quot;software&quot;)!=-1)
  {
    Starling.current.nativeStage.frameRate = 30;
  }
}</pre>
<p>Starling 実行時のエラーチェックを行いたいときは、start() を呼ぶ前に、以下の設定を追加します。</p>
<pre>myStarling.<strong>enableErrorChecking</strong> = true;</pre>
<p>ただし、エラーチェックを行うとパフォーマンスへの影響が大きいので、デバッグ時以外は設定しない方が良さそうです。</p>
<p>その他、Starling クラスの機能は、別の機会に紹介する予定です。とりあえず、オンラインのドキュメントはこちらです。 （<a href="http://doc.starling-framework.org/core/starling/core/Starling.html">Starling@Starling Framework Reference</a>）</p>
<h4>カスタム Sprite の作成</h4>
<p>（注：これ以降、Sprite などのクラス名は全て、特に説明が無い限り Starling フレームワークのクラスを指します。慣れるまで間違えやすいので、注意してください）</p>
<p>さて、次は、Starling のコンストラクタの第 1 引数に指定するための Sprite のカスタムクラスを作成します。</p>
<p>作成手順は、表示用のオブジェクトを作成して Sprite に addChild() メソッドで追加する、という、従来の表示リストと同様の手順です。</p>
<p>Stage3D の描画の単位は 3 角形でしたが、Starling では、3 角形を 2 つ合わせた矩形が基本になります。</p>
<p>そこで、矩形に対応する Quad クラスのインスタンスを表示する例からはじめます。下は、そのサンプルです。</p>
<p>このサンプルと、記事の最初のサンプルがあれば、とりあえず画面に矩形を表示するところまではできるはず、です。</p>
<pre>import <strong>starling</strong>.display.Quad;
import <strong>starling</strong>.display.Sprite;
 
public class MyStarlingSprite extends <strong>Sprite</strong>
{
  private var myQuad:<strong>Quad</strong>;
 
  public function MyStarlingSprite()
  {
    // Quadのインスタンスを生成
    myQuad = new Quad(200, 200);
    // とりあえず塗りの色を指定
    myQuad.color = 0xABCDEF;
 
    // SpriteにQuadのインスタンスを追加
    <strong>addChild</strong>(myQuad);
  }
}</pre>
<p>上のコードを実行すると、矩形が画面左上に描画されます。矩形を画面中央に表示するには、以下のように Quad の座標を設定します。</p>
<pre>myQuad.x = stage.stageWidth - myQuad.width &gt;&gt; 1;
myQuad.y = stage.stageHeight - myQuad.height &gt;&gt; 1;</pre>
<p>ただ、上のコードは、stage 属性へのアクセスを含みます。そのため、カスタム Sprite の初期化が終わる前に実行されるとエラーになってしまいます。</p>
<p>そこで、addedToStage イベントを利用することにします。この addedToStage イベントは Starling のイベントですが、Flash Player の addedToStage イベントと同じように Stage が利用可能になったことを通知してくれます。</p>
<pre>
import <strong>starling</strong>.events.Event;
 
public class MyStarlingSprite extends <strong>Sprite</strong>
{
  private var myQuad:<strong>Quad</strong>;
 
  public function MyStarlingSprite()
  {
    // addedToStageイベントに対するリスナを追加
    addEventListener(<strong>Event.ADDED_TO_STAGE</strong>, onAddedToStage);
  }
  private function onAddedToStage(e:<strong>Event</strong>):void
  {
    // Quadのインスタンスを生成
    myQuad = new Quad(200, 200);
    myQuad.color = 0xABCDEF;
    myQuad.x = stage.stageWidth - myQuad.width &gt;&gt; 1;
    myQuad.y = stage.stageHeight - myQuad.height &gt;&gt; 1;
 
    // SpriteにQuadのインスタンスを追加
    <strong>addChild</strong>(myQuad);
  }
}</pre>
<p>ということで、無事 Starling を使った表示はできたでしょうか？</p>
<p><a href="http://cuaoar.jp/2011/12/enterframe-starling.html">次回</a>は、矩形を動かす方法その 1 をご紹介する予定です。</p>
<p>&nbsp;</p>]]>
    </content>
</entry>

<entry>
    <title>Adobe Edge プレビュー 3.1 公開</title>
    <link rel="alternate" type="text/html" href="http://cuaoar.jp/2011/12/adobe-edge-31.html" />
    <id>tag:cuaoar.jp,2011://1.597</id>

    <published>2011-12-15T00:08:01Z</published>
    <updated>2012-01-04T12:34:35Z</updated>

    <summary>Edge プレビュー版の 3.1 が Adobe Labs に公開されました。 ...</summary>
    <author>
        <name>ackie</name>
        
    </author>
    
        <category term="General" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://cuaoar.jp/">
        <![CDATA[<p>Edge プレビュー版の 3.1 が Adobe Labs に公開されました。 （<a href="http://labs.adobe.com/technologies/edge/">Adobe Edge Preview@Labs</a>）</p>
<p>これまで公開されていた Edge プレビュー 3 が、今月いっぱいで使用期限が切れるため、来年 1 月に予定されているプレビュー 4 の公開まで使用できるように、期限を延長したバージョンだそうです。その他の新機能は特にありません。</p>
<p>現在 Edge を使用中で、使用を継続したい人は、今月中にプレビュー 3.1 に移行する必要があります。その際、既存のバージョンはアンインストールしてから、プレビュー 3.1 をインストールします。</p>
<p>Mac のアンインストーラは、アプリケーションフォルダ内の Adobe Edge Preview フォルダ内にあります。Windows では、コントロールパネルからアンインストールします。</p>
<p>プレビュー 4 の新機能も一部情報が公開されました。それによると、</p>]]>
        <![CDATA[<ul>
  <li>シンボル：<br />
  アニメーションやインタラクション機能を持った再利用可能なオブジェクトを作成できる</li>
  <li>コードパネル：<br />
  常駐可能なコードパネルにより、コンポジション内のコード特定と修正が容易に</li>
  <li>要素の表示：<br />
  必要なときのみ要素を表示させることが可能に</li>
</ul>
<p>といった機能が追加されるようです。</p>
<p>特に、シンボルは期待の高かった機能ではないでしょうか？無事 1 月に公開されるとよいですね。</p>
<p>&nbsp;</p>]]>
    </content>
</entry>

<entry>
    <title>Pixel Bender 3D とテクスチャマッピング</title>
    <link rel="alternate" type="text/html" href="http://cuaoar.jp/2011/12/pixel-bender-3d-2.html" />
    <id>tag:cuaoar.jp,2011://1.595</id>

    <published>2011-12-08T03:36:45Z</published>
    <updated>2011-12-07T15:18:03Z</updated>

    <summary>基本的な Pixel Bender 3D カーネルの書き方に続いて、Pixel ...</summary>
    <author>
        <name>ackie</name>
        
    </author>
    
        <category term="Stage3D" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://cuaoar.jp/">
        <![CDATA[<p><a href="http://cuaoar.jp/2011/12/pixel-bender-3d-1.html">基本的な Pixel Bender 3D カーネルの書き方</a>に続いて、Pixel Bender 3D でテクスチャマッピングを行う方法をご紹介します。</p>
<p>テクスチャマッピングは見た目に関する処理なので、関係するのはマテリアルカーネルだけです。</p>
<p>早速、マテリアルカーネルの定義です。まずは、変数の宣言からです。今回新しく登場しているのは input image です。</p>
<pre>{
  input vertex float4 UVCoord;
  interpolated float4 interpolatedUVCoord;
  <strong>input image4</strong> inputImage;
  output float4 finalColor;           
}</pre>
<p>input image の変数宣言の記述は、ちょっと input vertex とは異なります。&quot;<strong>input  image</strong> 型 変数名&quot; ではなくて、&quot;<strong>input</strong> 型 変数名&quot; です。その際、型として、image1, image2, image3, image4 のどれかを指定するという制限がつきます。</p>]]>
        <![CDATA[<p>本来 UV 座標は float が 2 つで表せますが、今回は float x 4 のベクターとして宣言しています。なので、頂点バッファ内の UV 座標データは、[U, V, 0, 0] の様に、2 つのダミーの数値を含む 4 つの float の組み合わせとして扱われます。</p>
<p>各変数の意味は、上から順番に、</p>
<ol>
  <li>頂点バッファから float x 4 つ分を、頂点の UV 座標として UVCoord という名前で使う</li>
  <li>頂点マテリアルプログラムと断片マテリアルプログラム間の受け渡しに interpolatedUVCoord という変数を使う</li>
  <li>断片マテリアルプログラムからテクスチャを参照するのに inputImage という変数を使う</li>
  <li>最終的な断片の色は finalColor という名前の変数に代入する</li>
</ol>
<p>となります。</p>
<p>さて、関数の宣言は以下のような感じになります。マテリアルカーネルでは、2 種類の関数を宣言するのでしたね。</p>
<pre>{
  void evaluateVertex()
  {
    interpolatedUVCoord = UVCoord;
  }
 
  void evaluateFragment()
  {
    <strong>float2 loc</strong> = interpolatedUVCoord<strong>.xy</strong>;
    finalColor = <strong>sample</strong>(inputImage, <strong>loc</strong>);
  }           
}</pre>
<p>上の evaluateVertex()、すなわち、頂点マテリアルプログラムは、UV 座標をそのまま次の処理に渡しています。こちらは単純です。</p>
<p>一方、下の evaluateFragment() には、少し新しい記述が登場します。</p>
<p>最初の行は、まず、左辺で loc という変数を宣言しています。型は float2 つまり、float x 2 のベクターです。</p>
<p>右辺を見ると、補間された UV 座標を持つ interpolatedUVCoord の後に .xy が付いています。このように float4 型の変数の後に .xy を付けると、「float4 型を、最初の 2 つの要素を持つ float2 型に変換」 という指示になります。</p>
<p>つまり、最初の行は、ダミーの数値を取り除き、float4 → float2 の型変換を行うことが目的です。 </p>
<p>2 行目では、sample() という関数を呼び出しています。sample() は、テクスチャから UV 座標に対応するデータのサンプリングを行う関数です。最初の引数にテクスチャ、2 つ目の引数に UV 座標をとります。</p>
<p>この evaluateFragment() の 2 行目は、AGAL ではこんな感じでした。</p>
<pre>tex ft1, ft0, fs0
mov oc, ft1</pre>
<p>こうして見ると、&quot;一時レジスタは全部で 8 つ&quot; の制限には、割と簡単に達してしまいそうです。</p>
<h4>おまけ</h4>
<p>ついでに、2 つの画像を合成する evaluateFragment() のサンプルも紹介します。</p>
<p>下は、inputImage0 と inputImage1 という 2 つのテクスチャの値を半分ずつ使って画像合成を行う場合です。</p>
<pre>input image4 <strong>inputImage0</strong>;
input image4 <strong>inputImage1</strong>;
 
void evaluateFragment()
{
  float2 loc = interpolatedUVCoord<strong>.</strong>xy;
  finalColor = (<strong>0.5</strong> * sample(inputImage0, loc)) +
    (<strong>0.5</strong> * sample(inputImage1, loc));
}</pre>
<p>このコードでは合成の比率が 0.5 と固定されています。この比率を AS 側から指定できるように変更すると、イメージのクロスフェード表示も実現できそうです。</p>
<p>ということで、もう 1 つ変数を追加したのが、下のサンプルです。</p>
<pre>void evaluateFragment()
{
  parameter float <strong>weight</strong>;
 
  float <strong>a</strong> = <strong>clamp</strong>(<strong>weight</strong>, 0.0, 1.0);
  float <strong>b</strong> = 1.0 - a;
  float2 loc = interpolatedUVCoord<strong>.</strong>xy;
  finalColor = (<strong>a</strong> * sample(inputImage0, loc)) +
    (<strong>b</strong> * sample(inputImage1, loc));
}</pre>
<p></p>
<p>AS 側で weight の値の指定をだんだん変えながら、このカーネルから生成されるシェーダを繰り返し呼び出すと、2 つのテクスチャの重なり方が徐々に変化させられます。</p>
<p>上で使われている clamp() は、値の最小値と最大値を指定するための関数です。最小値以下の数値は最小値に、最大値以上の数値は最大値に、それ以外の数値はそのままの値となります。上の例では、a の値が 0 から 1 の間にあることを保証するために使われています。</p>
<h4>おまけ - その 2</h4>
<p>久しぶりに話を ActionScript に戻します。</p>
<p>ActionScript プログラム内で Context3D にテクスチャなどの定数を設定する際に使えるよう、Pixel Bender 3D には、ProgramConstantsHelper というクラスが提供されています。その場合、定数の保管先の指定には、レジスタ番号ではなく、カーネル内の変数名を使います。</p>
<p> 下は、ProgramConstantsHelper を使って、マテリアルカーネルの inputImage という名前の変数にテクスチャを設定するサンプルです。 （テクスチャのインスタンス生成については、<a href="http://cuaoar.jp/2011/11/stage3d-1.html">Stage3D とテクスチャマッピング</a>）</p>
<p>ProgramConstantsHelper のインスタンス生成には 2 種類の RegisterMap を指定します。 （RegisterMap については <a href="http://cuaoar.jp/2011/11/pixel-bender-3d-3.html#constant">Pixel Bender 3D プレビュー 3 公開</a>）</p>
<pre>
// ProgramConstantsHelperのインスタンスを生成
var programConstantsHelper = new <strong>ProgramConstantsHelper</strong>(context3D,
  <strong>vertexRegisterMap</strong>, <strong>fragmentRegisterMap</strong>);
 
// テクスチャmyTextureをinputImageに設定
programConstantsHelper.<strong>setTextureByName</strong>(&quot;inputImage&quot;, myTexture);<br />// 定数（この場合はテクスチャ）をGPUにアップロード
programConstantsHelper.update();</pre>
<p>Stage3D 標準の API による、レジスタ番号を使った定数の設定手順 （<a href="http://cuaoar.jp/2011/11/stage3d-agal.html#constant">Stage3D のシェーダのアップロードと AGAL の基本情報</a>） よりは分かりやすいコードになっていると思います。</p>
<p>ちなみに、最初の 「おまけ」 で紹介した weight のように、float 型の定数に値を設定するには、setNumberParameterByName() が使えます。</p>
<pre>programConstantsHelper.<strong>setNumberParameterByName</strong>(
  Context3DProgramType.FRAGMENT, &quot;weight&quot;, 0.1);</pre>
<p>&nbsp;</p>]]>
    </content>
</entry>

</feed>

