ラベル Flash の投稿を表示しています。 すべての投稿を表示
ラベル Flash の投稿を表示しています。 すべての投稿を表示

2010年3月10日

ICカードワールド2010

東京ビッグサイトで開催中の「ICカードワールド」に行ってきました。出展分野はICカード/ICタグ・RFID/磁気カードなどの関連ソリューションです。



今回の目的は、SONYのFeliCaです。FlashやAIRからFelicaを利用するためのSDKがリリースされ、先日から「FeliCa & Adobe® AIR®/Adobe® Flash®アプリケーションコンテスト」が開催されており、その結果発表が行われました。



最優秀賞を獲得したのは、PHP開発で有名なアシアル株式会社さんでした。Felicaを共有して交換日記を行うアプリケーションを開発され、技術だけでなく、人同士のコミュニケーションがある事などのコンセプトが素晴らしいと評価されていました。

コンテスト結果発表! « SDK for AIR/Flashブログ

既にFelicaを使った試験的なサービスが出てきているので、今後は関連サービスも増えてきそうです。ICカードの分野は発展途上なので、どんどん進化して便利になっていく気がします。

あとは、Felicaリーダー(読取側)の普及かぁ。。

2010年1月6日

無料でストリーミング配信「Red5」

Flashに動画を配信する方法として以下の3通りが存在します。
  1. swfファイルに動画ファイルを埋め込む
  2. プログレッシブ・ダウンロード
  3. ストリーミング

通常、ストリーミング配信には、Adobe社のFlash Media Server(FMS)が必要になりますが、エディションによっては非常に高価(60万円程度)で導入は極めて困難です。また、Jストリームなどのストリーミングサービスを利用するのにも費用が発生します。

今回は、Flash Media Serverをオープンソースの「Red5」で代用出来るか試してみました。Red5はFlash Media Server互換のオープンソースによって作られているRTMPサーバーです。Fecebook等で採用されていて、実績もあるようです。



Red5は、主に以下のような事が実現出来ます。
  • 動画または音声のストリーミング配信
  • WebカメラやマイクなどクライアントデータのFLV保存(録画、録音)
  • ライブストリーミング
  • Shared Objectの共有
  • AMFでサーバー上のメソッド呼び出し

インストール後にサーバを起動し「localhost:5080」にアクセスするとデモページが表示され、多くのサンプルを見る事が出来ます。



Red5は無料なので、気軽にストリーミングを試す事が出来ますね。

2009年12月4日

ActionScript3.0でFirefoxのプログレスサークルの作成

Firefoxのタブに表示される読み込み中のアニメーションをActionScript3.0で作成したので公開。

↓(こういうやつ)


FirefoxProgressCircle.as
package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.TimerEvent;
    import flash.utils.Timer;

    /**
     * FirefoxProgressCircle
     */
    public class FirefoxProgressCircle extends Sprite
    {
        /**
         * 回転度数
         */
        protected var _rotate:int = 35;

        /**
         * 円の配置間隔
         */
        protected var _span:int = 45;

        /**
         * 円の半径
         */
        protected var _radius:Number = 1.9;

        /**
         * 円周サイズ
         */
        protected var _size:int = 6;

        /**
         * カラー
         */
        protected var _color:uint = 0x333333;

        /**
         * タイマー
         * 
         * @default null
         */
        protected var _timer:Timer;

        /**
         * サークル
         * 
         * @default null
         */
        protected var _circle:Sprite;

        /**
         * コンストラクタ
         */
        public function FirefoxProgressCircle()
        {
            super();

            // タイマー設定
            this._timer = new Timer(50, 0);
            this._timer.addEventListener(TimerEvent.TIMER, this._onTimer);

            // サークル描画
            this._circle = this._createCircle();

            // 子オブジェクト追加
            this.addChild(this._circle);

            // イベント登録
            this.addEventListener(Event.ADDED_TO_STAGE, this._onStage);
            this.addEventListener(Event.REMOVED,        this._onRemove);
        }

        /**
         * ステージ追加イベント
         * 
         * @param event イベント (OPTIONAL)
         */
        protected function _onStage(event:Event = null):void
        {
            // イベント登録
            this.stage.addEventListener(Event.RESIZE, this._onResize);

            // 位置調整
            this.x = this._size;
            this.y = this._size;
            this._onResize();

            // 回転開始
            this._timer.start();
        }

        /**
         * 削除イベント
         * 
         * @param event イベント (OPTIONAL)
         */
        protected function _onRemove(event:Event = null):void
        {
            // リサイズイベント削除
            if (this.stage.hasEventListener(Event.RESIZE)) {
                this.stage.removeEventListener(Event.RESIZE, this._onResize);
            }
        }

        /**
         * リサイズイベント
         * 
         * @param event イベント (OPTIONAL)
         */
        protected function _onResize(event:Event = null):void
        {
            // 位置調整
            this._circle.x = this.stage.stageWidth / 2 - this._circle.width / 2;
            this._circle.y = this.stage.stageHeight / 2 - this._circle.height / 2;
        }

        /**
         * タイマーイベント
         * 
         * @param event イベント (OPTIONAL)
         */
        protected function _onTimer(event:TimerEvent = null):void
        {
            this._circle.rotation += this._rotate;
        }

        /**
         * サークル生成
         * 
         * @return Spriteオブジェクト
         */
        protected function _createCircle():Sprite
        {
            var circle:Sprite = new Sprite();
            var rotation:int  = 0;
            var cnt:int       = 0;

            // 0~360度を一周するループ処理
            while (rotation < 360) {
                // 一定の間隔で増やし続ける
                rotation += this._span;

                // 角度からラジアンに変換
                var radius:Number = rotation * Math.PI / 180;
                // サイン値を取得
                var sin:Number = Math.sin(radius);
                // コサイン値を取得
                var cos:Number = Math.cos(radius);

                // アルファ
                var alpha:Number = (100 - (cnt * 15)) / 100;

                // サークル描画
                this._drawCircle(circle, sin * this._size, cos * this._size, this._radius, alpha);

                // カウンター
                cnt++;
            }

            return circle;
        }

        /**
         * サークル描画
         *
         * @param obj   対象Sprite
         * @param x     x座標
         * @param y     y座標
         * @param r     ラジアン
         * @param alpha アルファ
         */
        protected function _drawCircle(obj:Sprite, x:Number, y:Number, r:Number, alpha:Number):void
        {
            var s:int = 8;
            var a:Number = Math.tan(Math.PI / s);
            var b:Number = Math.sin(Math.PI / (s / 2));

            obj.graphics.beginFill(this._color, alpha);
            obj.graphics.moveTo(x + r, y);

            obj.graphics.curveTo(r + x, a * r + y, b * r + x, b * r + y);
            obj.graphics.curveTo(a * r + x, r + y, x, r + y);
            obj.graphics.curveTo(-a * r + x, r + y, -b * r + x, b * r + y);
            obj.graphics.curveTo(-r + x, a * r + y, -r + x, y);
            obj.graphics.curveTo(-r + x, -a * r + y, -b * r + x, -b * r + y);
            obj.graphics.curveTo(-a * r + x, -r + y, x, -r + y);
            obj.graphics.curveTo(a * r + x, -r + y, b * r + x, -b * r + y);
            obj.graphics.curveTo(r + x, -a * r + y, r + x, y);

            obj.graphics.endFill();
        }
    }
}


使い方(例:ドキュメントクラスで使用する場合)
// 生成
var circle:FirefoxProgressCircle = new FirefoxProgressCircle();
this.addChild(circle);

// ローディングが終了して不要になったら、ステージから削除すればOK
this.removeChild(circle);

2009年12月3日

ActionScript 3.0 の 条件付きコンパイル

ActionScript 3.0 でデバッグ時と、リリース時のコードを分けるには、if 文などを使用して分岐しても良いが、swfにデバッグコードが含まれてしまうため、条件付きコンパイルを使用すると良い。

この方法を使用すると、同名のプロパティやメソッドなどを環境により変更する事ができる。


Flashでの定数定義
「プロファイル」-「スクリプト - 設定」-「定数の構成タブ」で定数を追加する




Flexでの定数定義
mxmlcのコンパイラオプションで指定
mxmlc -define+=CONFIG::DEBUG,true -define+=CONFIG::RELEASE,false ..

flex-config.xmlで指定
<compiler>
    <define>
        <name>CONFIG::DEBUG</name>
        <value>true</value>
    </define>
    <define>
        <name>CONFIG::RELEASE</name>
        <value>false</value>
    </define>
</compiler>

Flex Ant タスクで指定
<mxmlc>
    <define name="CONFIG::DEBUG" value="true"/>
    <define name="CONFIG::RELEASE" value="false"/>
</mxmlc>


コードブロック単位の分岐
public function functionName():void {
    // デバッグ時のみ実行
    CONFIG::DEBUG {
        trace('debug');
    }
    // リリース時のみ実行
    CONFIG::RELEASE {
        trace('release');
    }
}


プロパティ、定数の分岐(同じ名前もOK)
// デバッグ時のみ実行
CONFIG::DEBUG
public var propertyName:String = 'debug';
// リリース時のみ実行
CONFIG::RELEASE
public var propertyName:String = 'release';


関数、メソッド単位の分岐(同じ名前もOK)
// デバッグ時のみ実行
CONFIG::DEBUG
public function methodName():void {
    trace('debug');
}
// リリース時のみ実行
CONFIG::RELEASE
public function methodName():void {
    trace('release');
}

Flash - ActionScript の条件付きコンパイル
Flex - 条件付きコンパイルの使用

2009年12月1日

ActionScript 3.0 の fl パッケージ

普段 Flex を使用してRIAを開発していると、軽量化のため Flash で Action Script 3.0 をコーディングする場合がある。Flex は基本的に mxml や Flex Framework を使用するため、mx パッケージをメインに使用する。

Tween などのアニメーションを Flash のドキュメントクラス等で記述する場合、fl パッケージを使用すると軽量で便利だ。Flex Framework には存在しないパッケージだが、fl.transitions.Tween クラスが利用できる。

Tweener などのライブラリも使用できるが、単純なエフェクトであれば fl.transitions パッケージ内にいろいろなクラスがあるので役に立ちそう。

サンプルコード
import fl.transitions.Tween;
import fl.transitions.easing.Regular;

var myTween:Tween = new Tween(myObject, "x", Regular.easeOut,
                              0, 300, 3, true);

Flash - ActionScript 3.0 コンポーネントリファレンスガイド