2007.07.02
category
comments

CASA Frameworkを試す

CASAが良いらしい、とよく聞くので使ってみる。クラスを一通り見てみると「LoadGroup」と「XmlUtil」あたりが便利そうだ。

「LoadGroup」を使うと複数のxmlや画像を一括管理で読み込む事ができる。今回は自分のTwitterのuserとfriendsのRSSをまとめて読み込んでみる。読み込んだ後はxpathにてノードを取得する。(CASAでもノード取得できるはずなんだけど、なぜかセレクトできなかったので。)

注目すべきは「new Percent(25)」の部分。読み込む対称に対して全体の何パーセントを割り当てるか、を設定できる。ここでは1つ目のxmlを読み込んだ時点で全体の25%読込完了となる。ローディングバーとかに細かく反映できたりしてこそばゆい。

読込が完了したら、「getXML()」でxmlに変換してやりxpathにて取り出す。trace文にはTwitterの最新タイトルがそれぞれ表示されます。CASAを使うと、ちょこちょこしたスクリプトを簡便化できるので、地味だけど後からジワジワ効いてきます。「ArrayUtil」クラスとかも使う機会多いんじゃないかな。ちなみに画像をまとめて読み込む場合は「MediaLoad」クラスを使います。詳しくはドキュメントを参照されたし。

ACTIONSCRIPT:
import org.casaframework.load.LoadGroup
import org.casaframework.load.base.BytesLoadInterface;
import org.casaframework.load.data.xml.XmlLoad;
import org.casaframework.load.media.MediaLoad;
import org.casaframework.math.Percent;
import org.casaframework.util.XmlUtil;

//-----[xmlの取得先]
var userXML:XmlLoad = new XmlLoad("http://twitter.com/statuses/user_timeline/6023282.rss?"+getTimer());
var friendsXML:XmlLoad = new XmlLoad("http://twitter.com/statuses/friends_timeline/6023282.rss?"+getTimer());
var myLoadGroup = new LoadGroup();

//-----[初期化関数]
init();
function init()
{
   //-----[ロードオブジェクトを追加]
   myLoadGroup.addLoad(userXML, new Percent(25));
   myLoadGroup.addLoad(friendsXML, new Percent(75));

   //-----[オブザーバーの登録]
   myLoadGroup.addEventObserver(this, LoadGroup.EVENT_LOAD_PERCENT, "onGroupLoadPercent");
   myLoadGroup.addEventObserver(this, LoadGroup.EVENT_LOAD_ERROR, "onGroupLoadError");
   myLoadGroup.addEventObserver(this, LoadGroup.EVENT_LOAD_COMPLETE, "onGroupLoadComplete");
   myLoadGroup.start();
}

//-----[ロードグループイベントハンドラー]
function onGroupLoadPercent(sender:LoadGroup, progress:Percent):Void
{
   trace("My group is " + progress.getPercentage() + "% loaded.");
}

function onGroupLoadError(sender:LoadGroup, failedLoad:BytesLoadInterface):Void
{
   myLoadGroup.removeLoad(failedLoad);
   myLoadGroup.start();
}

function onGroupLoadComplete():Void
{
   trace("xml complete");

   var userObj:Object = XmlUtil.xmlToObject(userXML.getXml())['rss'][0]['channel'][0]['item'];
   var friendsObj:Object = XmlUtil.xmlToObject(friendsXML.getXml())['rss'][0]['channel'][0]['item'];

   trace(userObj[1].title[0].nodeValue);
   trace(friendsObj[1].title[0].nodeValue);
}

7/17追記
xpathを使わずにcasaのみでノードを取得するやり方が分かったのでコードを修正しました。

2007.06.18
category
comments

AMFPHPを試す

AMF通信をやってみる。まずはFlash Remoting用のコンポーネントをダウンロードしてインストールする。

次にamfphpをダウンロード。現時点でのバージョンはamfphp-1.2.6。解凍してamfphpフォルダごとlocalhost直下にアップする。

今回の場合はhttp://localhost/amfphp/browser/index.htmlにアクセスしてデフォルト画面が表示されていればインストール成功となる。この画面がサービスブラウザとなりコードの修正や引数のやりとりを確認する事ができる。ここからはサービス用のphpファイルとflaファイルを作成。

■HelloWorld.php(クラス名とファイル名を統一すること)

PHP:
<?php
class HelloWorld
{
    //-----[AMFPHPのテーブル設定]
    function HelloWorld()
    {
        $this->methodTable = array
        (
            "say" => array
            (
                "access" => "remote",
                "description" => "文字列を返します"
            )
        );
    }
   
    //-----[flashから呼ばれる関数]
    function say($sArgments)
    {
        return 'You said: ' . $sArgments;
    }
}
?>

フラッシュからの引数は$sArgmentsに格納される。このphpをhttp://localhost/amfphp/servicesにアップする。
※この状態でサービスブラウザにアクセスするとHelloWorldがサービスとして登録される。

■HelloWorld.fla(ルートの1フレーム目)

ACTIONSCRIPT:
import mx.remoting.*;
import mx.rpc.*;
import mx.remoting.debug.NetDebug;

var gatewayUrl:String = "http://localhost/amfphp/gateway.php";

NetDebug.initialize();
var _service:Service = new Service(gatewayUrl, null, 'HelloWorld', null , null);
var pc:PendingCall = _service.say("Hello!");
pc.responder = new RelayResponder(this, "handleResult", "handleError");

function handleResult(re:ResultEvent)
{
trace(re.result);
}

function handleError(fe:FaultEvent)
{
trace("エラー");
}

トレースすると"You said: Hello!"が出力される。xmlを経由しなくてもphpとflashでオブジェクトのやりとりが出来るので便利。DBからセレクトしたデータをflashに直接渡したり、phpに配列を渡したりとかなりお手軽にできそう。ここまでくるとMovableTypeとかでxmlを出力してflashに読み込ませるCMS的パターンは壊滅なんじゃないかと。従来のXMLを読み込んでパースかけるやり方よりも高速に送受信ができるらしい。なるほど。

2007.06.15
category
comments

外部画像を読み込んでスムージング

画像の読み込みをリスナーで捕まえるにはcontentLoaderInfoを使う。スムージングをかけるには読み込み完了時にビットマップ化して、スムージングプロパティをtrueにする。回転させるとスムージングがかかってるのが良く分かる。

ACTIONSCRIPT:
var imgLoader:Loader = new Loader();
imgLoader.load(new URLRequest("画像のurl"));
imgLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
imgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);

//-----[読み込み中イベントの処理]
function onProgress(e:Event):void
{
    trace("progress = " + Math.round((e.bytesLoaded * 100) / (e.bytesTotal)));
}

//-----[読み込み完了イベントの処理]
function onComplete(e:Event):void
{
    //-----[スムージング処理]
    var loadedImage:Bitmap = Bitmap(imgLoader.content);
    loadedImage.smoothing = true;
    addChild(loadedImage);
    loadedImage.rotation = 15;
}

2007.06.10
category
comments

ムービークリップのカーソルアイコンについて

AS3ではMouseEventをリスナーに登録しても標準では指アイコンに変化しない。アイコンを変える時は明示的に設定してやる必要あり。

ACTIONSCRIPT:
mc.buttonMode = true;
mc.useHandCursor = true;

buttonModeをtrueにしておかないとuseHandCursorが効かないのだ。ちょっとハマったのでメモ。

2007.06.05
category
comments

Tweenerについて

Tweenerを使ってみる。

ACTIONSCRIPT:
import caurina.transitions.Tweener;
Tweener.addTween(mc, {alpha:0, time:1, transition:"easeOutExpo", delay:0, onComplete:hoge, onCompleteParams:["hello"]});
 
hoge = function(s:String)
{
    trace(s);    //hello
}

こうする事で1秒でアルファを0にイージングして、完了後にコンプリートハンドラーよりhoge()がコールバックされて"hello"がトレースされる。基本Fuseと使い方は一緒だな。

その他のイベントパラメータはこちら。
・onStart
・onStartParams
・onUpdate
・onUpdateParams
・onComplete
・onCompleteParams
・onOverwrite
・onOverwriteParams

2007.05.17
category
comments

ドメイン間ポリシーファイルについて

異なるドメイン間でXMLとかをやり取りする場合、「crossdomain.xml」を設置する必要がある。Flash側にはcrossdomain.xmlが置かれているドメインを設定することでクロスアクセスが可能になる。アクセス許可の範囲はポリシーファイルの置かれたディレクトリ以下に限られる。毎回忘れるのでメモ。

ACTIONSCRIPT:
System.security.loadPolicyFile("crossdomain.xmlのパス");

XML:
<xml version="1.0">;
    <!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
    <cross>
        <allow domain="Flash側のドメイン"></allow>
    </cross>
</xml>

2007.05.02
category
comments

AS3.0 パッケージの分類をまとめてみる

flash.accessibility   アクセシビリティに配慮した機能を実装するクラス
flash.display     描画処理を行うクラス
flash.errors      エラー情報を保持するクラス
flash.events     イベント情報を保持するクラス
flash.external     Flash Playerのコンテナと通信するクラス
flash.filters      フィルタ処理を行うクラス
flash.geom      幾何学情報を保持するクラス
flash.media      音楽やムービーなどを再生するクラス
flash.net       通信を行うクラス
flash.printing     印刷を行うクラス
flash.system     システム情報にアクセスするクラス
flash.text      文字列の描画処理を行うクラス
flash.ui       マウスやキー入力関連のクラス
flash.utils      ある特定の目的のためのクラス
flash.xml      XMLの解析を行うためのクラス

2007.05.02
category
comments

javascriptでマウスホイール検知

いまさらだけどflashでマウスホイール検知をやってみる。マックでも動くようにとexternalInterfaceでjavascriptと連携。要はアップ方向かダウン方向にホイールが回ってるかをif文で判別してflashに返してやればよいわけ。自作スクロールクラスに組み込むと良さげ。

http://adomas.org/javascript-mouse-wheel/

2007.05.01
category
comments

SharedObjectのデフォルト保存場所

ローカルにデータを保存するときに使うSharedObject。第2引数を指定しない場合はここに保存される。

win
C:\Documents and Settings\"ユーザー名"\Application Data\Macromedia\Flash Player\#SharedObjects

mac
ユーザ\”ユーザー名”\ライブラリ\Preferences\Macromedia\Flash Player\#SharedObjects

2007.04.12
category
comments

flashとjavascriptとphpでやりとりするには

flashとjavascriptのやり取りは「ExternalInterface」を使う。

JAVASCRIPT:
function getJavascript()
{
   var obj = new Object();
   obj.infoTitle = document.URL;
   obj.infoUrl = document.title;
}

ACTIONSCRIPT:
import flash.external.*;

if(ExternalInterface.available)
{
   infoObj = ExternalInterface.call("getJavascript");
   title.text = infoObj.infoTitle;
   url.text = infoObj.infoUrl;
}
else
{
   title.text = "ExternalInterfaceを利用することが出来ません";
}

javascriptからのデータがinfo.objの中に格納される。

続いて、flashとphpのやり取りは「sendAndLoad」を使う。

PHP:
<?php
   $message= $_POST["message"];
   echo "responce=".$message."をflashに返します";
?>

ACTIONSCRIPT:
//-----[送受信オブジェクトのインスタンス化]
var loadLV:LoadVars = new LoadVars();
var sendLV:LoadVars = new LoadVars();

//-----[渡したい変数名と値を定義]
sendLV.message = "hoge";

//-----[コールバック関数を定義]
loadLV.onLoad = function(success)
{
   if (success == true)
   {
      trace(loadLV.responce);
   }
   else
   {
      trace("通信エラー");   //hogeをflashに返します"
   }
}

//-----[sendAndLoadメソッドを使ってデータの送受信を行う]
sendLV.sendAndLoad("phpファイルのパス", loadLV, "POST");

page 8 / 9«123456789»