<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Web　酒　肴</title>
    <link>http://blog.garden-place.jp/oborobeer/</link>
    <description>Flex, ActionScript, CMS, Ruby on Rails, Java, NetBeansなどの技術情報その他</description>
    <language>ja</language>
    <generator>Nucleus CMS v3.31SP1</generator>
    <copyright>&#169;</copyright>
    <category>Weblog</category>
    <docs>http://backend.userland.com/rss</docs>
    <image>
      <url>http://blog.garden-place.jp/nucleus/nucleus2.gif</url>
      <title>Web　酒　肴</title>
      <link>http://blog.garden-place.jp/oborobeer/</link>
    </image>
    <item>
 <title>Flex/AIRハンズオン勉強会 in 京都　報告</title>
 <link>http://blog.garden-place.jp/oborobeer/item_288.html</link>
<description><![CDATA[<p>２１日（土）に開催した勉強会の後、急に忙しくなって報告やフィードバックなど遅くなっております。
来てくれた皆さん、どうもありがとうございました。
簡単に報告をしつつ、次への改善点を整理しておきます。</p>

<h3>参加者</h3>

<p>約２０人でした。正確な数は受付表を確認すればわかります。（今会社にある）<br />
そして一番の収穫は、ほぼ全員がPC持参したこと。
もともと自分の手を動かすハンズオン形式を取っていたので、PC持参できる人が集まったと言えばそうですが、この形式は今後も続けられそうだと感じました。<br />
また、ざっと見渡したところ未経験者の方がかなり多く見受けられました。詳細はアンケート集計しなければわかりませんが、参加者の構成に合わせた企画を実施していくつもりです。</p>

<h3>通信、インフラ</h3>

<p>コンセントの数、ギリギリでした。もう１つ２つタップを用意する必要があったと反省。<br />
さらに、この日のために<a href="http://www.uqwimax.jp/service/trywimax/" title="UQ WiMAX | Try WiMAX">WiMAXの試用版</a>を用意して社内LANを経由しないインターネットアクセスを提供したのですが、通信できない人が続出。事前準備の至らなさ、WiMAXルータの性能の限界など、色々と要因はありそうに思います。これも反省点。</p>

<h3>Flex最初の一歩</h3>

<p>Flexの未経験者向けハンズオンセミナー。<br />
とりあえず時間が足りなかった。初めての講師という大役を任されたT-2の経験不足もあるけど、そもそも30分で意味のある内容を詰め込むことに無理があったか。結果としてはT-2が時間延長してでも丁寧に教えてくれたので、未経験者の人にとっては価値あるものになったんじゃないかと思う。結果はアンケート集計してのお楽しみ。</p>

<h3>Flex/AIRのお仕事事情</h3>

<p>hirossyさん、lecheさんに登壇いただく。<br />
まずは、登壇といっても前で話すスペースが無かった、移動やモニターの切り替えが頻繁に起こって不便、という準備・企画不足は反省点。
内容はFlex/AIRにある程度取り組んでいる人、もしくは他の技術でバリバリやっている人にとってはかなり興味深い話が聞けたと思います。
お二人ともありがとうございました。</p>

<p>課題としては完全な未経験者の人やFlashでデザインはやったけどFlexも触ってみよう、という人にとっては、まだよくわからない話だったかもしれません。
この辺は他の企画にも共通する問題で、ターゲットを明確にすればするほど、それに合わない人をどうするかということを考えていこうと思います。</p>

<h3>ライブコーディング</h3>

<p>先述の２コーナーで登壇した３名（hirossyさん、lecheさん、T-2）が、その場で明かされた仕様のFlex/AIRアプリケーションを即興で作る、という作らされるほうにしたら鬼のような企画。しかもhirossyさんはコーディング経過をプロジェクターで公開。まさにライブコーディング。いきなりお願いして、よく引き受けてくれたと思います。</p>

<p>結果は見事にhirossyさんが完成させたという、企画者としては胸を撫で下ろす展開！面白かったのはhirossyさんの情報検索術がそのまま見れたこと。ネット上の色んな情報ソースが頭の中で整理されていれば、一つ一つの技術の詳細な中身までは憶えておく必要がないということを見事に体現してくれました。hirossyさんは懇親会に来れなかったのですが、来てたらヒーロー扱い間違いないというほど、この時の話題がよく出ました。</p>

<h3>最後に</h3>

<p>上記に色々と出てきた反省点・改善点は次回、次々回と回を重ねながら修正していきたいと思います。
言い忘れてましたけど、今後は毎月開催していくつもりです。１２月は皆忙しいと聞いていたのですが、少人数型の企画に変更してでも開催します。よろしければぜひ＾＾</p>
]]></description>
 <category>Flash/Flex</category>
<comments>http://blog.garden-place.jp/oborobeer/item_288.html</comments>
 <pubDate>Sun, 29 Nov 2009 11:50:04 +0900</pubDate>
</item><item>
 <title>Flex/AIRハンズオン勉強会 in 京都　のお知らせ</title>
 <link>http://blog.garden-place.jp/oborobeer/item_286.html</link>
<description><![CDATA[<p>勉強会について、ここでいろいろと思案の過程を書いてきたけども、まずは実施することになりました。
こういうのって考えすぎてその思考に縛られると動けなくなるから、考えた事はそれとして多少の矛盾を抱えても動いちゃったほうがいいと思うわけです。</p>

<p>つーわけで、京都でこれからFlex/AIRを覚えたいって方はぜひ参加してください。
うちの会社で行います。</p>

<p><a href="http://www.fxug.net/modules/bwiki/index.php?Flex%CA%D9%B6%AF%B2%F1%C2%E892%B2%F3%40%B5%FE%C5%D4" title="B-Wiki - Flex勉強会第92回@京都 - Flex User Group">Flex勉強会第92回@京都 - Flex User Group</a></p>

<p>前半は比較的初級者向けだけど、ライブコーディングはバリバリとこなしてる人にも参加してもらいたいですね。
集まった人のレベルに合わせてできるように、いくつかの準備はしておこうと思ってますけど。</p>

<p>もちろん興味のあるところだけ参加してもらって結構ですよ。</p>
]]></description>
 <category>Flash/Flex</category>
<comments>http://blog.garden-place.jp/oborobeer/item_286.html</comments>
 <pubDate>Sat, 7 Nov 2009 13:54:18 +0900</pubDate>
</item><item>
 <title>Eclipse3.4にFlex Builderプラグインをインストール</title>
 <link>http://blog.garden-place.jp/oborobeer/item_272.html</link>
<description><![CDATA[<p>今までずっとFlex Builderを単体でつかってきたけど、サーバサイド（Java）との連携を考えるとやはりEclipseにプラグインとして入れたほうが早そうだ。
ということで最新版のEclipse（3.5）にFlex Builderプラグインを入れようとしたものの・・・</p>

<blockquote>
  <p>Eclipse 3.2.2、Eclipse 3.3 または Eclipse 3.4 上でのみサポートされています。</p>
</blockquote>

<p>とのこと。
それならってことでEclipse3.4のAll-in-oneパッケージをダウンロードしたものの、なぜかインストールに失敗する。
どうも同様の現象は多数報告されているようだ。</p>

<p><a href="http://hasumi.info/~h2/2009/02/28/eclipse-342%E3%81%ABflex-builder-plug-in%E3%82%92%E5%85%A5%E3%82%8C%E3%82%8B/" title="Tipset » Eclipse 3.4.2にFlex Builder Plug-inを入れる">Tipset » Eclipse 3.4.2にFlex Builder Plug-inを入れる</a></p>

<p>ここを参考にうまくいった手順を残しておくとする。</p>

<p>環境： WindowsXP / Flex Builder3.0.2</p>

<ol>
<li><p><a href="http://www.eclipse.org/downloads/packages/release/ganymede/sr2" title="Eclipse Packages | Eclipse Packages">Eclipse Packages | Eclipse Packages</a>から <em>Eclipse IDE for Java EE Developers</em>をダウンロードし適当な場所に解凍（eclipseというフォルダが作成される）。ちなみに日本語化は念のため最後に行う。</p></li>
<li><p><a href="http://www.adobe.com/jp/products/flex/" title="Adobe - Flex 3">Adobe - Flex 3</a>から体験版として<em>Flex Builder Plug-in</em>をダウンロード（バージョンは3.0.2）</p></li>
<li><p><em>Flex Builder Plugin</em>をインストールし、途中でEclipseの場所を聞かれるので上記のeclipseフォルダを指定。正常に完了したら次へ。（うまくいかないときは<strong>「Eclipseのconfigurationフォルダが必要です。」</strong>みたいなメッセージが表示される。）</p></li>
<li><p><em>eclipse</em>フォルダ内の<em>eclipse.exe</em>を実行し、左のプロジェクト・エクスプローラー上で「New」→「Project」としてFlex Builderの項目が存在することを確認する。確認できたらEclipse終了。</p></li>
<li><p><a href="http://sourceforge.jp/projects/nttdatagroup-oss-square/wiki/blanco_Framework%252Fnlpack.eclipse.ganymede-SR2-R200903261000" title="NTTデータグループ・オープンソーススクエア - nttdatagroup-oss-square Wiki - nttdatagroup-oss-square - SourceForge.JP">NTTデータグループ・オープンソーススクエア - nttdatagroup-oss-square Wiki - nttdatagroup-oss-square - SourceForge.JP</a> から<em>NLpackja-eclipse-jee-ganymede-SR2-blancofw.zip</em>をダウンロードし、2と同じ場所で解凍。</p></li>
<li><p>再度Eclipseを起動し日本語化されていたら完了。</p></li>
</ol>

<p>どうも色んなプラグインが最初から入っていると失敗しやすいようなので、日本語化も最後に行った。Tomcatなど必要なプラグインは別途インストールする必要があるが、とりあえずこれで成功した。</p>
]]></description>
 <category>Flash/Flex</category>
<comments>http://blog.garden-place.jp/oborobeer/item_272.html</comments>
 <pubDate>Thu, 8 Oct 2009 13:42:02 +0900</pubDate>
</item><item>
 <title>Flex Builder 改め Flash Builder になるそう</title>
 <link>http://blog.garden-place.jp/oborobeer/item_264.html</link>
<description><![CDATA[<p>FlashとFlexの区別がなかなかつかなかった僕ですが、その原因の一つはまさにこれだった。</p>

<p><a href="http://blog.digitalbackcountry.com/2009/05/flex-builder-gumbo-is-being-renamed-flash-builder/" title="Flex Builder “Gumbo” is Being Renamed Flash Builder | Ryan Stewart - Rich Internet Application Mountaineer">Flex Builder “Gumbo” is Being Renamed Flash Builder | Ryan Stewart - Rich Internet Application Mountaineer</a></p>

<p>Flex Builderという名前をFlash Builderに改める予定とのこと。</p>

<p>僕がなぜFlexとFlashの区別がつけられなかったかというと、それはFlashの文化を知らずにFlex Builderを触ったから。
Flex BuilderはFlex SDKを使ったアプリケーションを手軽に構築できるが、<b>Flex SDKを使わないFlashアプリケーションも作成できる。</b>でもFlex Builderと言うからには、これを使って作ったアプリケーションは全てFlexじゃないの？なんて思ってた。</p>

<p>そこが違った。</p>

<p>Flex Builderを使ってもFlex SDKを使わなければそれは単なるFlashアプリケーションなのだ。
じゃあ自分の作ったアプリケーションがどれほどFlex SDKに依存しているのかは、それまでFlashの経験がない自分には区別が難しい。
さすがにMXMLとか使ってたら、ああこれはFlexだと思うが、AcstionScriptのみで作成したアプリケーションが内部的にFlex SDKで提供されているクラスを参照している場合なんかもあるのだろう。</p>

<p>ここから先は知識を増やして憶えていくしかないのだろうけど、今回の名前変更で最初の誤解をする人が減るのはいいことだと思う。</p>
]]></description>
 <category>Flash/Flex</category>
<comments>http://blog.garden-place.jp/oborobeer/item_264.html</comments>
 <pubDate>Wed, 20 May 2009 12:02:10 +0900</pubDate>
</item><item>
 <title>[勉強会]第9回 変なプログラマーの作り方 参加してきた</title>
 <link>http://blog.garden-place.jp/oborobeer/item_254.html</link>
<description><![CDATA[<p>テーマは開発環境ということで、Flex Builderの紹介とお勧めをしてきました。
プレゼン資料は以下。</p>

<iframe src="http://show.zoho.com/embed?USER=obanetty_gmail&DOC=Flex%2FAIR%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83Flex%20Builder%E3%81%AE%E7%B4%B9%E4%BB%8B&IFRAME=yes" height="335" width="450" name="Flex/AIRの開発環境Flex Builderの紹介" scrolling=no frameBorder="0" style="border:1px solid #AABBCC"></iframe>

<p>ということでよろしくお願いしますｗ</p>

<p><a href="http://www.amazon.co.jp/gp/product/B00150IB64?ie=UTF8&tag=obanetty-22&linkCode=as2&camp=247&creative=1211&creativeASIN=B00150IB64">Adobe Flex Builder Standard 3.0 日本語版 Windows/Macintosh版</a><img src="http://www.assoc-amazon.jp/e/ir?t=obanetty-22&l=as2&o=9&a=B00150IB64" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
]]></description>
 <category>Flash/Flex</category>
<comments>http://blog.garden-place.jp/oborobeer/item_254.html</comments>
 <pubDate>Sun, 26 Apr 2009 11:57:38 +0900</pubDate>
</item><item>
 <title>[Flex]カスタムエフェクトの作成 #6 - MaskEffectの継承2</title>
 <link>http://blog.garden-place.jp/oborobeer/item_252.html</link>
<description><![CDATA[<p>先日の<em>「お花見勉強会 in 大阪」</em>で軽く紹介しました。
桜の画像がどうにもキモくてお気に入りです。</p>

<p><object type="application/x-shockwave-flash" width="400" height="400" data="http://blog.garden-place.jp/media//2/20090423-EffectPractice.swf"><param name="movie" value="http://blog.garden-place.jp/media//2/20090423-EffectPractice.swf" /><param name="loop" value="true" /><param name="menu" value="true" /><param name="quality" value="high" /></object></p>

<p>やってることは前回までのエントリーに加えて桜を斜め上から順番に表示しているだけ。
内部的にはかなりムチャやってて、実用的にしようと思ったらあと3倍くらいの時間がかかるでしょう。</p>

<p>ちゃんと本当に使えるライブラリに仕上げて<a href="http://www.fxug.net/modules/bwiki/index.php?Flex3%CA%D9%B6%AF%B2%F1%C2%E870%B2%F3%A1%F7%B5%FE%C5%D4%BB%B2%B2%C3%BC%F5%C9%D5">5月30日の京都でのFlex勉強会</a>で報告するつもりです。</p>
]]></description>
 <category>Flash/Flex</category>
<comments>http://blog.garden-place.jp/oborobeer/item_252.html</comments>
 <pubDate>Thu, 23 Apr 2009 12:50:31 +0900</pubDate>
</item><item>
 <title>[Flex]カスタムエフェクトの作成 #5 - MaskEffectの継承1</title>
 <link>http://blog.garden-place.jp/oborobeer/item_247.html</link>
<description><![CDATA[<p>Adobeのドキュメントで <em>MaskEffect</em> の仕様を調べる。</p>

<p><a href="http://livedocs.adobe.com/flex/3_jp/langref/mx/effects/MaskEffect.html" title="MaskEffect - ActionScript 3.0 言語およびコンポーネントリファレンス">MaskEffect - ActionScript 3.0 言語およびコンポーネントリファレンス</a></p>

<p>どうやらターゲットコンポーネントに対して、文字通りマスクとなる矩形を表示して部分的に隠し、そのマスクを時間の経過とともに移動したり拡大/縮小したりして様々なエフェクトを実現する、というものだった。</p>

<blockquote>
  <p>後日、いろいろ格闘して↑は少し違うことに気づいた。「矩形で隠す」のではなく、「矩形以外を隠す」なのだ。
  つまり、のぞき穴からのぞき込んでいる状態だ。</p>
</blockquote>

<p>実装するのは大きくわけると以下の３つになるようだ。</p>

<ol>
<li>マスクとして使用される <em>Sape</em> オブジェクトを作成するメソッド</li>
<li>マスクの拡大/縮小率の <em>From</em>, <em>To</em> の指定</li>
<li>マスクの移動元/移動先の指定</li>
</ol>

<p>読んでみたがよく分からない。
こういうときは似たサンプルを探す。</p>

<p>ってことでほぼ同じ処理（というかもっと高級な処理）を実現している <em>mx.effects.WipeDown</em> クラスのソースコードを見て作った。</p>

<hr />

<p><em>MaskSample1Effect</em></p>

<pre><code>package
{
    import mx.effects.IEffectInstance;
    import mx.effects.MaskEffect;

    public class MaskSample1Effect extends MaskEffect
    {

        public function MaskSample1Effect(target:Object=null)
        {
            super(target);
            instanceClass = MaskSample1EffectInstance;
        }

        override protected function initInstance(inst:IEffectInstance):void{
            super.initInstance(inst);

            MaskSample1EffectInstance(inst).createMaskFunction = MaskSample1EffectInstance(inst).createMask;
        }
    }
}
</code></pre>

<p><em>MaskSample1EffectInstance</em></p>

<pre><code>package
{

    import flash.display.DisplayObject;
    import flash.display.Graphics;
    import flash.display.Shape;
    import flash.geom.Rectangle;

    import mx.core.FlexShape;
    import mx.effects.effectClasses.MaskEffectInstance;

    public class MaskSample1EffectInstance extends MaskEffectInstance
    {
        private var sx:Number;
        private var sy:Number;

        public function MaskSample1EffectInstance(target:Object)
        {
            super(target);
        }

        override protected function initMaskEffect():void{

            super.initMaskEffect();

            xFrom = this.sx;
            yFrom = this.sy;
            xTo = -this.sx;
            yTo = -this.sy;
        }

        public function createMask(targ:Object, bounds:Rectangle):Shape{
            var newMask:Shape = new FlexShape();
            var angle:Number = Math.atan2(bounds.height, bounds.width);
            var cos:Number = Math.cos(angle);
            var sin:Number = Math.sin(angle);
            var targetWidth:Number = bounds.width / cos;
            var targetHeight:Number = cos * bounds.height + sin * bounds.width;

            var g:Graphics = newMask.graphics;
            g.beginFill(0xFFFF00);
            g.drawRect(0, 0, targetWidth, targetHeight);
            g.endFill();
            newMask.rotation = angle * 180 / Math.PI;

            sx = sin * sin * bounds.width;
            sy = - sin * cos * bounds.width;

            return newMask;
        }

        override public function finishEffect():void{
            super.finishEffect();

            DisplayObject(target).visible = false;
        }
    }
}
</code></pre>

<p>ほとんど <em>WipeDown</em> クラスからコード持ってきて、余計な部分や今の理解に必要のない部分を消去した。
そして、矩形を斜めにして右上から消えていくようにした。</p>

<p><em>MaskSample1Effect</em> クラスは何もしていない。作っただけ。</p>

<p><em>MaskSample1EffectInstance</em> クラスでは以下の２つのことをしている。</p>

<ol>
<li><em>initMaskEffect</em> メソッドでマスクの移動元と移動先の <em>(x, y)</em> 座標をセットする。</li>
<li><em>finishEffect</em> メソッドでエフェクト終了後にオブジェクトを見えなくする。</li>
</ol>

<p>ポイントは以下の部分だけ。</p>

<pre><code>xFrom = (マスク移動元のx座標)
yFrom = (マスク移動元のy座標)
xTo = (マスク移動先のx座標)
yTo = (マスク移動先のy座標)
</code></pre>

<p>マスクの移動元と、移動先の <em>(x, y)</em> 座標を指定するだけで勝手に動いてくれる。
その他はマスクを斜めに向けたり、斜めのマスクが全体をスッポリと覆えるように大きさを調整したりしただけ。</p>

<p>できた。</p>

<p><object type="application/x-shockwave-flash" width="400" height="400" data="http://blog.garden-place.jp/media//2/20090415-EffectPractice2.swf"><param name="movie" value="http://blog.garden-place.jp/media//2/20090415-EffectPractice2.swf" /><param name="loop" value="true" /><param name="menu" value="true" /><param name="quality" value="high" /></object></p>

<p>文字の消え方がおかしいことを除けば今はこれくらいでいい。
厳密には消える対象のオブジェクトが回転とか拡大・縮小されてもちゃんと動作するようにしなければならない。
（<em>WipeDown</em> はそうなってた。）
けど、今はそこまでやる段階ではないからいいっしょ。</p>
]]></description>
 <category>Flash/Flex</category>
<comments>http://blog.garden-place.jp/oborobeer/item_247.html</comments>
 <pubDate>Wed, 15 Apr 2009 00:25:02 +0900</pubDate>
</item><item>
 <title>[Flex]カスタムエフェクトの作成 #4 - さらに複雑なアニメーションへ</title>
 <link>http://blog.garden-place.jp/oborobeer/item_245.html</link>
<description><![CDATA[<p>前回までのは単なるサンプルに少し手を加えただけのもの。
あんなのでは桜を表現したエフェクトなどできるはずもない。
ここからはより実践的に調査を続けよう。</p>

<p>まず、要求定義。</p>

<p><em>最終目標</em></p>

<ul>
<li>桜の花びらが舞いながらオブジェクトがフワーッと消えていくようなエフェクト</li>
</ul>

<p>うん、めっちゃ難しそう＼(＾o＾)／</p>

<p>もう少しハードルを下げる。</p>

<p><em>第２目標</em></p>

<ul>
<li>オブジェクトが端から徐々に消えていく。消えていくときの境界線に桜の花びらが表示される</li>
</ul>

<p>このくらいか。
この要件を満たすために必要な要素を、自分の実現可能なパーツに分解しよう。
これは何もソフトウェア開発に限らず、あらゆる問題解決に有効なアプローチだ。</p>

<ol>
<li>オブジェクトを端から徐々に消す</li>
<li>桜の花びらを一か所に表示する</li>
<li>画像を線上に均等に並べて表示する（2と組み合わせれば桜を線状に並べて表示できる）</li>
</ol>

<p>細かいところをあげたらもう少し色々ありそうだけど、このくらいでよし。</p>

<p>さて、2はたぶん問題無い。
画像に<em>(x, y)</em>座標を指定して <em>addChild</em> してやればいいのだろう。</p>

<p>3は数学的アプローチ。
直線状の座標を均等に分割する点を計算してやれば2と組み合わせればできるだろう。
中学で習った1次関数の応用、もしくは高校で習うベクトルの問題に落としこめるので、たぶんできる。</p>

<p>問題は1だ。
これは今の自分ではできない。
これについて調査すればすべての問題が解決できるはず。</p>

<p>実はこれについては似たようなものを見たことがある。
いや、というか見たことがあるから、これならできると思って要求定義をこのようにしたと言ってもいい。
<em>mx.effects.WipeDown</em> というエフェクトクラスがあるのだ。
これはオブジェクトを上から下へスーッと描画する。</p>

<p>消していくのと描画するのとでは、動作としては逆だが部分的に表示し、部分的に隠すという意味ではどちらも同じだ。
このWipeDownについて調査することから始めた。</p>

<p>調査となれば、まずはAdobeのドキュメント。
Adobeは相当Flex/Flashに期待をかけているのか非常にドキュメントが充実している。日本語への直訳がわかりにくい、という欠点はあるけど、結果的にAdobeのドキュメントを調べることで問題解決することが経験的にも多い。</p>

<p><a href="http://livedocs.adobe.com/flex/3_jp/langref/mx/effects/WipeDown.html" title="WipeDown - ActionScript 3.0 言語およびコンポーネントリファレンス">WipeDown - ActionScript 3.0 言語およびコンポーネントリファレンス</a></p>

<p>さて、ここで <em>mx.effects.WipeDown</em> のリファレンスを見て気づいたこと。それは</p>

<ol>
<li><em>mx.effects.MaskEffect</em> を継承している</li>
<li><em>mx.effects.WipeDown</em> が独自に設定しているプロパティ、メソッドは無く全て <em>MaskEffect</em> からの継承</li>
</ol>

<p>どうやら <em>MaskEffect</em> がオブジェクトの一部を <em>Mask</em> （隠す）するのに必要なインターフェースを提供しているようだ。
じゃあこいつを使えば一発解決かも？</p>

<p>ということで次にすべきことは <em>MaskEffect</em> を継承したエフェクトを作成すること。</p>

<p>進め、どんどん。</p>
]]></description>
 <category>Flash/Flex</category>
<comments>http://blog.garden-place.jp/oborobeer/item_245.html</comments>
 <pubDate>Sat, 4 Apr 2009 17:35:08 +0900</pubDate>
</item><item>
 <title>[Flex]カスタムエフェクトの作成 #3 - TweenEffectによる複数パラメータの変化</title>
 <link>http://blog.garden-place.jp/oborobeer/item_242.html</link>
<description><![CDATA[<p>前回はターゲットオブジェクトに対して<em>rotation</em>プロパティだけを変化させてアニメーションを実行した。
では、複数のパラメータを同時に変化させるにはどうしたらいいのだろう？ということで調べてみた。</p>

<p>答えは簡単。</p>

<p>インスタンスクラスで <em>createTween</em> メソッドを実行するときに<em>開始値</em>, <em>終了値</em>を指定するところに配列を指定してやればいい。</p>

<pre><code>createTween(this, [開始値1, 開始値2, ...], [終了値1, 終了値2, ...]);
</code></pre>

<p>前回のサンプルで<em>rotation</em> と同時に <em>scaleX</em> ,  <em>scaleY</em> も変化するアニメーションに修正してみた。</p>

<p><em>TestEffect.as</em></p>

<pre><code>package
{
    import mx.effects.Effect;
    import mx.effects.IEffectInstance;

    public class TestEffect extends Effect
    {
        public function TestEffect(target:Object=null)
        {
            super(target);
            instanceClass= TestEffectInstance;
        }

        override public function getAffectedProperties():Array{
            return ["rotation"];
        }

        override protected function initInstance(inst:IEffectInstance):void{
            super.initInstance(inst);
            TestEffectInstance(inst).angleFrom = 0;
            TestEffectInstance(inst).angleTo = 360;
            TestEffectInstance(inst).scaleFrom = 2;
            TestEffectInstance(inst).scaleTo = 1;
        }
    }
}
</code></pre>

<p><em>TestEffectInstance.as</em></p>

<pre><code>package
{
    import mx.effects.effectClasses.TweenEffectInstance;

    public class TestEffectInstance extends TweenEffectInstance
    {
        public var angleFrom:Number;
        public var angleTo:Number;
        public var scaleFrom:Number;
        public var scaleTo:Number;

        public function TestEffectInstance(target:Object)
        {
            super(target);
        }

        override public function play():void {
            super.play();
            createTween(this, [angleFrom, scaleFrom], [angleTo, scaleTo], duration);
        }

        override public function onTweenUpdate(val:Object):void {
            target.rotation = val[0];
            target.scaleX = target.scaleY = val[1];
        }
    }
}
</code></pre>

<p><em>TestEffectInstance</em> に <em>scaleX</em> ,  <em>scaleY</em> の変化を設定するプロパティ <em>scaleFrom</em> と <em>scaleTo</em> を追加。
そして <em>createTween</em> 実行時に以下のように二つの値のFromとToを配列にして実行。</p>

<pre><code>createTween(this, [angleFrom, scaleFrom], [angleTo, scaleTo], duration);
</code></pre>

<p><em>onTweenUpdate</em> メソッドでは引数<em>val</em>に配列が入るため、<em>val[0]</em>, <em>val[1]</em>として使用する。
<em>createTween</em> を呼び出したときの配列と同じ順序で値が格納されているようだ。</p>

<p>ということで前回と全く同じMXMLで以下のようにアニメーションが変更された。</p>

<p><object type="application/x-shockwave-flash" width="400" height="400" data="http://blog.garden-place.jp/media//2/20090404-EffectPractice2.swf"><param name="movie" value="http://blog.garden-place.jp/media//2/20090404-EffectPractice2.swf" /><param name="loop" value="true" /><param name="menu" value="true" /><param name="quality" value="high" /></object></p>
]]></description>
 <category>Flash/Flex</category>
<comments>http://blog.garden-place.jp/oborobeer/item_242.html</comments>
 <pubDate>Sat, 4 Apr 2009 16:38:55 +0900</pubDate>
</item><item>
 <title>[Flex]カスタムエフェクトの作成 #2</title>
 <link>http://blog.garden-place.jp/oborobeer/item_239.html</link>
<description><![CDATA[<p>以下のAdobeのサンプルを参考にしながら自分でも作成してみた。</p>

<p><a href="http://livedocs.adobe.com/flex/3_jp/html/createeffects_3.html#792960" title="トゥイーンエフェクトについて">トゥイーンエフェクトについて</a></p>

<h3>ファクトリクラス</h3>

<p><em>TestEffect.as</em></p>

<pre><code>package
{
    import mx.effects.IEffectInstance;
    import mx.effects.TweenEffect;

    public class TestEffect extends TweenEffect
    {
        public function TestEffect(target:Object=null)
        {
            super(target);
            instanceClass= TestEffectInstance;
        }

        override public function getAffectedProperties():Array{
            return ["rotation"];
        }

        override protected function initInstance(inst:IEffectInstance):void{
            super.initInstance(inst);
            TestEffectInstance(inst).angleFrom = 0;
            TestEffectInstance(inst).angleTo = 360;
        }
    }
}
</code></pre>

<p>ファクトリクラスを作成するときに最低限必要な4つのルール</p>

<ol>
<li><p>コンストラクタの実装</p>

<p>コンストラクタ内では必ずsuper()メソッドを実行すること。
引数に受け取ったターゲットオブジェクトも渡す。</p></li>
<li><p>instanceClassの設定</p>

<p>通常はコンストラクタ内で実行する。インスタンスクラスとしてどのクラスを使うかの指定。
Classタイプのオブジェクトを指定するとのこと。（例のようにクラス名をそのまま代入するイメージ）</p></li>
<li><p>initInstanceメソッドのオーバーライド</p>

<p>必ず最初にsuper.initInstance()メソッドを実行する。
引数として受け取ったインスタンスクラスをそのまま渡す。</p>

<p>また、その他、事前に準備したい自分のエフェクト固有の値などはここでセットする。
例ではインスタンスクラスに回転の開始角度と終了角度を代入している。</p></li>
<li><p>getAffectedPropertiesメソッドのオーバーライド</p>

<p>エフェクトのターゲットとなるオブジェクトに対して、どのパラメータを変更するかを指定する。
しかし、実際にはこのメソッドはなくても動いた。
どういうときに使われるかは不明だが、念のため指定しておいたほうがいいのだろう。
（何かの拍子にエラーが発生したりするのかもしれないため。）
今回はrotationプロパティを変更するため"rotation"という文字列を配列形式で返している。</p></li>
</ol>

<h3>インスタンスクラス</h3>

<p><em>TestEffectInstance.as</em></p>

<pre><code>package
{
    import mx.effects.Tween;
    import mx.effects.effectClasses.TweenEffectInstance;

    public class TestEffectInstance extends TweenEffectInstance
    {
        public var angleFrom:Number;
        public var angleTo:Number;

        public function TestEffectInstance(target:Object)
        {
            super(target);
        }

        override public function play():void {
            super.play();
            createTween(this, angleFrom, angleTo, duration);
        }

        override public function onTweenUpdate(val:Object):void {
            target.rotation = val;
        }

        override public function onTweenEnd(val:Object):void {
            super.onTweenEnd(val);
        }
    }
}
</code></pre>

<p>ファクトリクラスを作成するときに最低限必要な2+1つのルール</p>

<ol>
<li><p>コンストラクタの実装</p>

<p>受け取ったターゲットオブジェクトを引数にsuper()メソッドを実行するだけでいいみたい。</p></li>
<li><p>playメソッドのオーバーライド</p>

<p>エフェクト開始時に呼び出されるメソッド。今回はTweenEffectInstanceを継承しているため、createTweenメソッドを実行する必要がある。createTweenメソッドの引数は通常以下のようになる。</p>

<pre><code>createTween(this, 開始値, 終了値 [, アニメーションの継続時間(ミリ秒), アニメーション実行の最小回数(/秒) ] )
</code></pre>

<p>慣れないうちは <em>createTween(this, 開始値, 終了値)</em> でいいと思う。</p></li>
<li><p>TweenEffectInstance.onTweenUpdateメソッドのオーバーライド</p>

<p>こちらはTweenEffectを継承したエフェクトを作成しているときのみの制約。
アニメーション更新のタイミングごとに呼び出されるので、ターゲットオブジェクトのプロパティを更新する。
今回の例では<em>rotation</em>を更新すればよい。
これで回転処理のアニメーションが実行される。</p></li>
</ol>

<p>また、TweenEffectInstanceにはonTweenEnd()メソッドのようにアニメーション終了後に呼び出されるメソッドもあり、後処理などが必要な場合は適時オーバーライドすればよい。</p>

<hr />

<p>ここまでできれば後は以下のようにMXMLファイル内で上記で作ったTestEffectを指定してやればよい。</p>

<pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="400" height="400"&gt;
    &lt;mx:Button x="150" y="150" label="回転します" width="100" height="100" mouseDownEffect="{TestEffect}"/&gt;
&lt;/mx:Application&gt;
</code></pre>

<p>できた。
思ってたよりも簡単だ。</p>

<p><embed src="/media/2/20090404-EffectPractice.swf" quality="high" type="application/x-shockwave-flash" width="400" height="400"align="middle"  pluginspage="http://www.adobe.com/go/getflashplayer_jp" /></p>
]]></description>
 <category>Flash/Flex</category>
<comments>http://blog.garden-place.jp/oborobeer/item_239.html</comments>
 <pubDate>Sat, 4 Apr 2009 16:03:08 +0900</pubDate>
</item>
  </channel>
</rss>
