2007.08.03
category
comments

CASAを使ってPHPとやりとりする

通常はsendAndLoadを使うけど、CASAを使うともっと手軽に出来ます。new VarsLoad()の第1引数でPHPのパスを指定し、第2引数で「GET」か「POST」の送信方法を指定する。myVarsLoad.setValue("text", "Hello World");でPHPに渡したい値を指定する。第1引数が変数名で第2引数が値になる。

PHPからの返り値を受け取るにはコンプリートハンドラーの中でthis.myVarsLoad.getValue("text")とすればよい。この場合の引数はPHPから返ってくる変数名を指定する。ちなみにPHPからの返り値を全て見たいときはtrace(this.myVarsLoad.$receive)とすればよい。さらにPHPから返ってくるオブジェクトそのものを見たいときは前回のエントリーでも書いたObjectDumper.toString()メソッドを使うと一発で理解できる。trace(ObjectDumper.toString(myVarsLoad, true, true));とすれば中身が丸見え。

CASA使うとコード量が格段に減ってすっきりするので気持ちよい。

ACTIONSCRIPT:
import org.casaframework.load.data.VarsLoad;

//-----[初期設定]
var myVarsLoad:VarsLoad;

//-----[ボタンクリックでPHPと通信]
btn.onRelease = function()
{
myVarsLoad = new VarsLoad("やりとりしたいPHPのパス", "GET");
myVarsLoad.addEventObserver(_root, VarsLoad.EVENT_LOAD_COMPLETE, "onDataLoad");
myVarsLoad.setValue("text", "Hello World");
myVarsLoad.start();
}

//-----[ロード完了]
function onDataLoad(sender:VarsLoad):Void
{
trace(this.myVarsLoad.getValue("text"));
}

2007.07.31
category
comments

ロモフィルター

ロシアのトイカメラLOMOで撮影したような効果を与えるフィルターを作ってみた。全体的にハイコントラストにして四隅が暗くなるように調整。勝手にロモフィルターと命名することに。

LomoFilter.as

ACTIONSCRIPT:
import flash.geom.Matrix;

class info.five.as2.filters.LomoFilter
{
   function LomoFilter()
   {
      trace("LomoFilterクラスの読込完了");
   }

   //------------------------------
   //   LomoFilterセット関数
   //     mc:ムービークリップ
   //     vol:ボリューム(1.0~2.0)
   //------------------------------
   function setLomoFilter(mc:MovieClip, vol:Number)
   {
      mc.createEmptyMovieClip("lomo", mc.getNextHighestDepth());
      mc.lomo.blendMode = "overlay";

      with(mc.lomo)
      {
         fillType = "radial";
         colors = [0x000000, 0x000000, 0x000000];
         alphas = [0, 50, 100];
         ratios = [0, 200, 255];
         spreadMethod = "pad";
         interpolationMethod = "RGB";
         focalPointRatio = 0;
         matrix = new Matrix();
         matrix.createGradientBox(mc._width*vol, mc._height*vol, 0, (mc._width-mc._width*vol)/2, (mc._height-mc._height*vol)/2);
         beginGradientFill(fillType, colors, alphas, ratios, matrix, spreadMethod, interpolationMethod, focalPointRatio);
         moveTo(0, 0);
         lineTo(0, mc._height);
         lineTo(mc._width, mc._height);
         lineTo(mc._width, 0);
         lineTo(0, 0);
         endFill();
      }
   }
}

flaの1フレーム目に以下のコードを書く。

ACTIONSCRIPT:
import info.five.as2.filters.LomoFilter;

var lomo:LomoFilter = new LomoFilter();
lomo.setLomoFilter(thumb1, 1.4);
lomo.setLomoFilter(thumb2, 1.4);
lomo.setLomoFilter(thumb3, 1.4);
lomo.setLomoFilter(thumb4, 1.4);

setLomoFilter()の第1引数はmcのインスタンス名。第2引数はフィルター量になってます。(1.0~2.0くらいで)もうちょっとぼけ具合とかピンホールとか色々弄りたかったけど、やりすぎない程度にしてみました。

2007.07.26
category
comments

オブジェクトの中身を調べる

Object型の変数をトレースすると[object Object]としか表示されず、いまいち中身が良く分からない。中のプロパティを確認したいときに使うのが「ObjectDumper.toString()」メソッド。トレース時にこれを使うと中身が一発で見れて便利よ、と。

ACTIONSCRIPT:
import mx.data.binding.ObjectDumper;

var obj:Object = new Object();
obj.title = "aaa";
obj.description = "sss";
obj.date = "ddd";

trace(ObjectDumper.toString(obj, true, true));//{date: "ddd", description: "sss", title: "aaa"}

2007.07.20
category
comments

ダイナミックテキストに網掛け

ダイナミックテキストにビットマップ塗りでマスクをかけて網掛け状態にしてみる。

bg04.png

上記のような斜線のpngを用意してライブラリに読み込んでおく。リンケージ名を「bg04.png」にして、「ActionScriptに書き出し」、「最初のフレームに書き出し」にチェックを入れる。あとは1フレーム目にコードをコピペ。フォントの埋め込みはしていません。

ACTIONSCRIPT:
import flash.display.*;
import flash.geom.*;

//-----[初期設定]
var textW:Number = lineText._width;
var textH:Number = lineText._height;
var theMatrix:Matrix = new Matrix();
var theColTrans:ColorTransform = new ColorTransform();
var bitmap:BitmapData = BitmapData.loadBitmap("bg04.png");

//-----[マスクの作成]
_root.createEmptyMovieClip("mask", 0);
mask._x = lineText._x;
mask._y = lineText._y;
mask.cacheAsBitmap = true;
lineText.cacheAsBitmap = true;

mask.clear();
mask.lineStyle();
mask.beginBitmapFill(bitmap, theMatrix, true, true);
mask.moveTo(0, 0);
mask.lineTo(textW, 0);
mask.lineTo(textW, textH);
mask.lineTo(0, textH);
mask.lineTo(0, 0);
mask.endFill();
mask.setMask(lineText);

※macで見るとマスクが吹っ飛んで、何も表示されないみたい。cacheAsBitmapを両方ともtrueにしてるんだけどこれが表示されない原因ぽい?winとmacで仕様が違うのか?何でじゃー!?

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.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.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 1 / 11