‘Flash’ カテゴリーのアーカイブ

外部ファイル読込み時の例外処理

2010 年 6 月 17 日 木曜日

久しぶりに例外処理を入れたりするわけですが、すっかり忘れていたのでメモ。

まず、例外処理は同期型、非同期方があり、
前者は「即エラー判定できるもの」で、
後者は「ファイル読み込み等、すぐにエラー判定ができないもの(常に見はっておきたいもの)」です。

以下記述例。

ACTIONSCRIPT:
  1. //同期型
  2.  
  3. try{
  4.     評価したい処理
  5. }catch(){
  6.     エラー時処理1
  7. }catch(){
  8.     エラー時処理2(複数記述可能)
  9. }finally{
  10.     エラーが発生するしないにかかわらず処理
  11. }
  12.  
  13.  
  14. //非同期処理はイベントリスナーで記述する。
  15. URLLoader..addEventListener(IOErrorEvent.IO_ERROR, onURLLoaderError);
  16. Loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onLoaderError);

以上。手抜きメモでした。

AS3 ローカル環境で実行されているかどうかを確認する

2010 年 3 月 18 日 木曜日

外部ファイルを読込む処理で、ローカルで実行する場合は絶対パス、サーバへアップした時には相対パスでデータを読み込みたい。とうい感じで処理を分けたくなる事がよくあるので、自動で判断できるような雛形を書いてみました。ドキュメントクラスです。

ACTIONSCRIPT:
  1. package
  2. {
  3.     import flash.display.Sprite;
  4.     import flash.text.TextField;
  5.    
  6.     public class DocumentRoot extends Sprite
  7.     {
  8.         public function DocumentRoot()
  9.         {
  10.             //この部分で取得
  11.             var isLocal:Boolean = (String(loaderInfo.loaderURL).split("/")[0] == "http:") ? false : true;
  12.  
  13.             //表示確認
  14.             var t:TextField = new TextField();
  15.             addChild(t);
  16.             t.text = String(isLocal);
  17.         }
  18.     }
  19. }

AS2でもチェックできる事は知ってはいましたが、isLocal = true みたいに手書きでもそんなに手間をかけず対応できてた為、ついつい後回しにしていました。他にもっと良い方法があるのかなぁ、、まぁいいや。例によって自分用メモということで。

AS3で複数の名前空間を処理しつつ、デフォルトの名前空間を指定して参照時の記述を省略する

2010 年 3 月 13 日 土曜日

XMLを介したI/F仕様を決める際、名前空間を指定することがほとんどないのですが、既存サービス等で、指定済みのフィードに出くわすと、普段当たり前にできていたエレメントの参照ができず、一瞬面食らってしまいます。以後、同じような状況で頭がフリーズしてしまわないように、要所だけメモ。

名前空間を指定する

まず、xmlns:~で指定されている部分を使ってNamespace型のインスタンスを作成します。(xmlnsがhttp://foo.com/fooの場合)

var ns:Namespace = new Namespace("http://foo.com/foo");

参照するxmlインスタンス(例として xmldata )が存在していれば、以下のような記述でも可能です。

var ns:Namespace = new Namespace(xmldata.namespace());

これにより、

xmldata.ns::foo

xmldata.foo.ns::element

xmldata.foo.@ns::attribute

的なアクセスが可能になります。

デフォルト指定で記述を楽にする

更に、このnsをデフォルト指定したければ、この一行を追加。

default xml namespace = ns;

これにより、上記のアクセスが以下のような形でアクセス可能になります、。

xmldata.foo

xmldata.foo.element

xmldata.foo.@attribute

複数の名前空間にも対応

先程と同じ要領で、新たにNamespaceインスタンスを作成

var ns2:Namespace = new Namespace(xmldata.namespace("ns2"));

※右辺の"ns2"は xmlns:ns2 = "http://foo.~" となっていた場合の例で、左辺の var ns2 は将来的に参照の時に使用する修飾子です。混乱するかと思ったのですが、実際のコーディングの際、揃えておく方が普通かと思い、そのように記述しています。

FlashRemotingをFlashCS3以降のAS2で使えるようにする

2010 年 1 月 24 日 日曜日

以前から、Flash8(AS2)にFlashRemotingコンポーネントをインストールしてamfphpでサーバへアクセス、という案件に携わっていて、今もたまに保守作業が発生したりするのですが、そのコンポーネントがFlash8を最後に提供されていない為、その作業だけの為に泣く泣くFlash8をインストールしておりましたが、mxコンポーネントをCS4側へ移行するだけでCS4でも使えてしまった、という当たり前すぎるオチで解決したので、備忘も兼ねてポストします。

そのまんまですが、やったことは、Flash8で使用しているmxクラス群をFlashCS4で使用しているmxクラス群に差分コピーしただけで、具体的には

[Flash8ディレクトリ]\ja\First Run\Classes\mx\

の以下のディレクトリとファイル

remoting\
rpc\
data\DataRange.as
data\PageableData.as
data\PageableList.as
data\types\RecordSet.as

をFlashCS4で使用するディレクトリ

[User]\AppData\Local\Adobe\Flash CS4\ja\Configuration\Classes\mx\

へコピー、です。

PC環境の再構築時に備え(差分ファイルを抜き出す為だけに、Flash8+FlashRemotingをインストールしなくても済むように)差分ファイルをアップしておく事にしました。一応自分用ですが、必要な方はどうぞ。(ダブるファイルは無いはずですが、一応事前に確認下さい)

CS3以降用 flashRemoting 関連mxクラス

関連技術の仕組みをしっかり把握していれば、すぐに思いつく解決方法なんだろうなぁと、そういう発想に展開できなかった自分にヘコみましたが、これでFlash8とお別れできるという喜びの方が遥かに勝るので、もう絶対忘れないぜ!とばかりにポストです。

Papervision3D 2.0 クリックイベントを追加する

2009 年 12 月 22 日 火曜日

バージョン2.0を少し前から触り始めています。去年(一昨年?)触った時と比べて実装が楽になっている印象です、、が、当時の事をほとんど忘れてしまっているので、実際はどうなんでしょう、、。

今回は、

・3D空間上の物体をクリックしてイベントを取得
・物体へオンマウスした際にマウスカーソルを変える

という基本的な部分について躓いたので、自分用コメントを付けて貼っておきます

ACTIONSCRIPT:
  1. package {
  2.    
  3.     import flash.events.Event;
  4.    
  5.     import org.papervision3d.view.BasicView;
  6.     import org.papervision3d.objects.primitives.Plane;
  7.     import org.papervision3d.materials.ColorMaterial;
  8.     import org.papervision3d.events.InteractiveScene3DEvent;
  9.  
  10.     public class PV3DClickTest extends BasicView {
  11.        
  12.         private var planeObj:Plane;
  13.        
  14.         public function PV3DClickTest() {
  15.            
  16.             viewport.interactive = true; // クリックイベントを取得する際に必要
  17.             viewport.buttonMode = true; // ボタンモードON
  18.            
  19.             var material:ColorMaterial = new ColorMaterial(0);
  20.             material.interactive = true; // クリックイベントを取得する際に必要
  21.             material.doubleSided = true; // 裏返しになっても表示させる
  22.            
  23.             planeObj = new Plane( material, 300, 300, 1, 1 );
  24.             planeObj.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, onClick, false, 0, true);
  25.            
  26.             scene.addChild(planeObj);
  27.            
  28.             // render
  29.             startRendering();
  30.             addEventListener(Event.ENTER_FRAME, loop, false, 0, true);
  31.         }
  32.        
  33.         private function loop(e:Event):void {
  34.             planeObj.rotationY += 1;
  35.         }
  36.        
  37.         public function onClick(e:InteractiveScene3DEvent):void {
  38.             trace(e.toString());
  39.         }
  40.     }
  41. }

マテリアル毎にinteractiveプロパティでクリッカブルに設定できるが、それと同時にviewportにもinteractiveプロパティも設定しておかなくてはならない、というところが今回躓いた部分。あと、buttonModeプロパティはviewportで設定するようなので、ついでにサンプル内に記述しておきました。

FlashDevelopでwonderfl

2009 年 9 月 30 日 水曜日

最近始めたwonderflだが、まだ見るだけで、投稿には至っていない。

多くのASer同様、FlashDevelopに慣れてしまい、既に保管機能無しではコーディング出来ない体になってしまった為、

wonderflデビューは「エディタがねぇ」と、正直抵抗があった。

が、flabaka様のこんな記事を発見。

、、おお!メチャメチャ便利じゃないですか!

ありがたく使わせて頂きます。

Yahoo pipes を as3 で利用する

2009 年 9 月 27 日 日曜日

Yahoo pipes を使う機会があり、1つ作ってみましたが、flash as3で読み取れなかったので、調べてみました。

解決方法はとても単純で、作ったパイプのドメイン

http://pipes.yahoo.com/

http://pipes.yahooapis.com/

に変えるだけでした。

この記事はけっこういろいろ出てきましたが、自分で書いておくと忘れにくいので、備忘も兼ねてポスト。

しかしpipes便利。これって使いこなせばかなりのマッシュアッパーになれそうな気がする、、

Facebook APIライブラリ

2009 年 9 月 19 日 土曜日

facebookをflashから操作してみよう、ということでAPI周りを調べてみました。

もともとクローズドなサービスだけに、twitter的な手軽さではぜんぜんいけなさそう。

とりあえずこの辺から始めてみよかな、、

Google Code -  facebook-actionscript-api

Adobe Flash Platform & Facebook Platform| Adobe Developer Connection

twitter的オープンコンテンツ用クライアントだけではなく、これはこれでニーズあるかもしれない。

そういう、facebook x flash なサービスって結構あったりするのかな?

wonderflの投稿ソースをローカルでコンパイルすると1120エラー

2009 年 9 月 2 日 水曜日

最近はwonderflにも頻繁に出入りするようになってきた。

アカウントまでは作ったがまだ初投稿には至っていない。そろそろ何か出してみようかー、、、と現在ネタ考え中です。

さて、そのwonderflですが、投稿ソースをドキュメントクラスとしてコンパイルすると、1120エラーが出ておこられてしまう事が何度かありました。

importまわり等問題なさそうなのに、、、調べてみると、wonderfl内でこんな投稿を発見。参考にさせてもらい、めでたく解決しました。

解決はしたものの、自分が根っこから理解できていないので、まだモヤモヤですが、、

wonderflやtwitterのカテゴリ作ろうか考え中。。。

追記:これはどうやらCS4のバグらしい。(niumサンつぶやき経由でflair4 blog様サイトで確認)

BitmapData.perlinNoiseでフォースマップ

2009 年 9 月 1 日 火曜日

宝の山に見えて仕方がないwonderfl。投稿されるコードの長さが程よいので、ちょっと時間が空いたときに、気になったスキルを学ぶ事ができ、かなり手頃感がある。いつまでも貰ってばかりではなく、コードをアップしたいななんて思いつつ今日に至るわけですが、、orz

パーティクルで多くのオブジェクトを動かす場合、移動に関する計算を各々でする必要が出てきますが、その数に比例して相当な負荷がかかってきます。それを軽減するひとつのテクニックとしてフォースマップというものを勉強したのでメモ。

ドローソフトでビットマップデータをドット単位で操作するためのアルファチャネルというものがありますが、これは「設定値の集合体」のような存在で、私の場合、複雑な透過設定をしたい場合などによく使っています。

フォースマップもこのような解釈で、1つのパーティクルはその座標からフォースマップのドットを参照し、自身の振る舞いを決定します。たかが1ドットでも、カラー情報から複数ビットの情報を得られるので、多様な振る舞いが十分期待できます。また、情報抽出等もビット演算で高速化できるので、最初に話した「移動に関する計算」の負荷軽減が実現できます。

で、そのフォースマップの作り方ですが、BitmapData.perlinNoiseという便利なものがあるので、これで一発さくっと作ってしまえば、流れるような動きもできてしまいます。

あ、あとVectorクラスも高速化につながってますね。

勉強になりました。

Singletonの使い方

2009 年 8 月 10 日 月曜日

仕事のちょっとした合間にProgressionの学習を進めてみようと過去何度か挑戦したが、いつも同じようなところで分からなくなってきて、きちんと落とし込む前にタイムリミット。次の仕事の為に頭の中が書き換えられてしまいフリダシに戻る、、を繰り返していた。

今回こそ!と、しばらくぶりにサイトを漁ってみると、でるわでるわ、、情報量がかなり増えていた。

躓いていたところは、Progressionにおける参照の仕組みの部分。でももう悩む必要はなさそうだ。

まず見つけたのはKAYACサンの記事。あと、Progressionフォーラムの投稿にも参考になるものがあった。(そうか、、最初からここ見ておけば良かった)

ということで、今、かなりテンションあがってきている訳ですが、書きたかったのは、

Singletonってこういう時使えるなぁ

ということ。これからちょっとラクになるかも。アリガタヤ。。

FM沖縄 オフィシャルキャラクター リズム&メロディー

2009 年 8 月 7 日 金曜日

3年くらい前にFM沖縄オフィシャルのTOPページのデザインとFlashまわりを担当させて頂いたのですが、

先日、開局25周年記念ということで、オフィシャルキャラクターが起用され、認知度アップを目的にTOPページFlash内でキャラクターを表示させるよう依頼を頂き、制作。先日更新されました。

キャラクターデザインはアリカワコウヘイさん。

24才に突然絵に目覚め、今や県内外で活躍されている、、あぁなんてカッコイイんだ。。

いつかお会いしてみたいなぁ、、

ユーザーの動きを視覚化するSEOツール ToFU with eigwa

2009 年 8 月 3 日 月曜日

去った7/31にサンネットからSEOツール「ToFU with eigwa」がリリースされました

これは、オフィシャルサイトの説明をお借りすると、
「検索エンジンから訪れたユーザーの動き(導線)を視覚的にわかりやすくしたツール」
です。

私は今回開発メンバーとしてインタラクションや実装を担当させて頂きました。

このツールを導入する事で

  • 最近1ヶ月の間に検索エンジンから訪れたユーザの動きを視覚化したい
  • どのページ(URL)にユーザーが多く訪れているか
  • どのページ(URL)からユーザーが多く離脱しているか
  • 予め設定していたコンバージョンページに何名のユーザーが通過したか

等のセッション情報が簡単に視覚化できるようになります。

その動きがとてもユニークなので、是非直接触って頂きたいのですが

残念ながら現在のところ試用ができません。。スミマセン。。

その代わりといっちゃなんですが、eigwaの紹介ページでスクリーンセーバーっぽいデモが見れますので、

ご興味のある方はどうぞー!

ToFU with eigwa

AS3 自分自身をremoveChildする

2009 年 7 月 10 日 金曜日

今まで特に理由も追及せず、キャストもいろんな形でやっちゃってたので、ここでとりあえず統一しておこう。

Object(parent).removeChild(this);

DataGrid セル内テキストを右寄せ(Flash AS3)

2009 年 5 月 30 日 土曜日

もっとよい方法があるかもしれないけど、、でも書いておかないとまたハマってしまいそうなのでメモ。

1.まず右寄せ設定用のCellRenderer継承クラスを作成

ACTIONSCRIPT:
  1. package
  2. {
  3.     import fl.controls.listClasses.CellRenderer;
  4.     import flash.text.TextFormat;
  5.    
  6.     public class RigthCell extends CellRenderer
  7.     {
  8.         private var tf:TextFormat;
  9.         public function RigthCell()
  10.         {
  11.             super();
  12.             tf = new TextFormat();
  13.             tf.align = "right";
  14.             setStyle("textFormat", tf);
  15.         }
  16.         override protected function drawLayout():void {
  17.             textField.width = this.width;
  18.             super.drawLayout();
  19.         }
  20.     }
  21. }

2.DataGridの継承クラスを作成しDataGridColumn.cellRendererに1.のCellRenderer継承クラスを設定する

ACTIONSCRIPT:
  1. package
  2. {
  3.     import fl.controls.DataGrid;
  4.     import fl.controls.dataGridClasses.DataGridColumn;
  5.    
  6.     public class SampleGrid extends DataGrid
  7.     {
  8.        
  9.         public function SampleGrid ()
  10.         {
  11.             init();
  12.         }
  13.         private function init():void {
  14.            
  15.             var col1:DataGridColumn = new DataGridColumn("column1");
  16.             addColumn(col1);
  17.            
  18.             var col2:DataGridColumn = new DataGridColumn("column2");
  19. //ここでCellRenderer継承クラスを設定
  20.             col2.cellRenderer = RigthCell;
  21.             addColumn(col2);
  22.  
  23.         }
  24.     }
  25. }

んーーー、こんなに、ややこしかったっけーー??

Flash JavaScript(JSFL)

2009 年 5 月 20 日 水曜日

swf書き出しを一括でやれると(案件によっては)楽だなぁ、、という事で

Adobe Flash CS4 Professional の拡張機能

勉強することにしました。

ちょっと触ってみたけど、いい感じ。

ファイル書き出しも思った通りにできた。楽ー!

JSFL使いの皆さんはスクリプトの管理とかどうやってんだろ?

TextFieldを透過させつつ回転させる方法(その2)

2009 年 4 月 26 日 日曜日

先日、「ダイナミックテキストを回転させると消えてしまう、、」という書き出しでエントリーしたんだけど、
やはり、というかどうして見つけられなかったのか、当時やりたかったことを普通に実現できる方法がありました。
前回の投稿も何かの役に立ってくれると期待を込め、今回、新たにエントリーです。

ACTIONSCRIPT:
  1. package src
  2. {
  3.     import flash.display.Sprite;
  4.     import flash.events.Event;
  5.     import flash.text.TextField;
  6.     import flash.text.TextFormat;
  7.  
  8.     public class Indexextends Sprite
  9.     {
  10.         var sp:Sprite;
  11.         var tf:TextField;
  12.  
  13.         [Embed(source="fontfile", fontFamily="foo")]
  14.         public var foo:String;
  15.  
  16.         function Index():void {
  17.            
  18.             sp = new Sprite();
  19.             sp.x = stage.stageWidth / 2;
  20.             sp.y = stage.stageHeight / 2;
  21.             addChild(sp);
  22.            
  23.             var format:TextFormat = new TextFormat();
  24.             format.font = "foo";
  25.            
  26.             tf = new TextField();
  27.             tf.embedFonts = true;
  28.             tf.defaultTextFormat = format;
  29.             sp.addChild(tf);
  30.            
  31.             addEventListener(Event.ENTER_FRAME, onEnterframe, false, 0, true);
  32.         }
  33.         private function onEnterframe(e:Event):void {
  34.             tf.text = "degree:" + ++sp.rotation;
  35.             tf.alpha = ( Math.abs(sp.rotation) % 100 ) / 100;
  36.         }
  37.     }
  38.  
  39. }

ポイントはフォントをEmbedで埋め込む部分。というかここしか目立つとこないすね。
おまけで透明度も変えられるか検証しています。

これでとりあえずやりたかったことが実現できた。
前回の方法とどっちが早いんだろう?

CLICKとMOUSE_DOWN & MOUSE_UPイベントを区別したい

2009 年 4 月 23 日 木曜日

1個のmcにCLICKイベントとMOUSE_DOWNとMOUSE_UPイベントリスナーを設定した場合、1回のクリックでそれぞれ1回ずつイベントが発生しますが、MOUSE_DOWNとMOUSE_UPイベントをドラッグ&ドロップ等で使いつつクリックも検出したい場合は思惑通りに動いてくれなかったので、動かすための手順をメモ。

ACTIONSCRIPT:
  1. package
  2. {
  3.     import flash.display.Sprite;
  4.     import flash.events.MouseEvent;
  5.     import flash.geom.Point;
  6.     public class Index extends Sprite
  7.     {
  8.         var sp:Sprite;
  9.         var pointMousedown:Point;
  10.         public function Index()
  11.         {
  12.             sp = new Sprite();
  13.             sp.graphics.beginFill(0x0);
  14.             sp.graphics.drawRect(0, 0, 100, 40);
  15.             sp.x = stage.stageWidth / 2 - sp.width / 2;
  16.             sp.y = stage.stageHeight / 2 - sp.height / 2;
  17.             addChild(sp);
  18. //    sp.addEventListener(MouseEvent.CLICK, onClick, false, 0, true);
  19.             sp.addEventListener(MouseEvent.MOUSE_DOWN, onMousedown, false, 0, true);
  20.             sp.addEventListener(MouseEvent.MOUSE_UP, onMouseup, false, 0, true);
  21.         }
  22.         private function onClick(e:MouseEvent):void {
  23.             trace("onClick");
  24.         }
  25.         private function onMousedown(e:MouseEvent):void {
  26.             trace("onMousedown");
  27.             e.target.startDrag();
  28.             pointMousedown = new Point(e.target.x, e.target.y);
  29.         }
  30.         private function onMouseup(e:MouseEvent):void {
  31.             trace("onMouseup");
  32.             e.target.stopDrag();
  33.             var pointMouseup:Point = new Point(e.target.x, e.target.y);
  34.             //5ピクセル以内ならクリックとみなし処理を行う
  35.             if (Point.distance(pointMousedown, pointMouseup) <5) {
  36.                 trace("onClickByScript");
  37.             }
  38.             trace("distance:" + Point.distance(pointMousedown, pointMouseup));
  39.         }
  40.     }
  41. }

CLICKイベントは使わずにMOUSE_DOWNとMOUSE_UPの間に移動したピクセル数を算出し、ある値を超えればクリックとみなす。とういもの。

この応用で、MOUSE_DOWNとMOUSE_UPの間にかかった時間も判断の1つとして加えても良いかも。

TextFieldを透過させつつ回転させる方法

2009 年 4 月 11 日 土曜日

ダイナミックテキストを回すとrotationが0のとき以外消えてしまう。

ならば、とビットマップ化するところまでは簡単だったけど、まんま白い背景がついてしまったので、それを消すところまでやりました。けっこうハマってしまった上、忘れてしまって二度手間になりそうな臭いプンプンなので、未来の自分の為にメモ。AS3です。

追記:他の方法(というかこっちが理想的)もエントリーしてます

ACTIONSCRIPT:
  1. package
  2. {
  3.     import flash.display.Sprite;
  4.     import flash.text.TextField;
  5.     import flash.display.BitmapData;
  6.     import flash.display.Bitmap;
  7.     public class Index extends Sprite {
  8.         [SWF(backgroundColor = "0xaaaaaa")]
  9.         function Index() {
  10.             var tf:TextField;
  11.             var bm:Bitmap;
  12.             var bmd:BitmapData;
  13.             var sp:Sprite;
  14.            
  15.             tf = new TextField();
  16.             tf.text = "この文字列を回転";
  17.             addChild(tf);
  18.            
  19.             bmd = new BitmapData(tf.width, tf.height, true, 0x00ffffff);
  20.             //    bmd = new BitmapData(tf.width, tf.height);
  21.             bmd.draw(tf);
  22.            
  23.             bm = new Bitmap(bmd, "auto", true);
  24.            
  25.             sp = new Sprite();
  26.             sp.addChild(bm);
  27.             addChild(sp);
  28.            
  29.             sp.rotation = 45;
  30.         }
  31.     }
  32. }

BitmapData(txtWidth, txtHeight, true, 0x00ffffff);

3番目の引数で「透過します」として、
4番目の引数で「透過するカラーコード」をしているみたい。←間違ってました。
4番目の引数は作成するBitmapの最初のカラーで、0xAARRGGBBの形式になります。
(上の0x00ffffffの場合、ffffffは白だけど先頭2桁のAA(透明度)が00だったので透明になりましたってことだね、きっと)

テキストを入れたmcにフィルタをかけて、テキストをビットマップ化させるような方法で実践している例もいくつかあったけど、なぜかうまくいかなかったので、これでやってみることにします。

FlashLite1.1 へパラメータ渡し

2009 年 3 月 12 日 木曜日

FlashLite1.1(他のバージョンは未検証)でswfへのパラメータ渡しの方法

http://faces.jp/2008/08/flash_1.html

これで、foo.php?para1=xxx てな感じでパラメータを受け取った状態でswfを呼び出せます。

実際は「渡す」ではなく、そのパラメータを埋め込んだswfを「生成して吐き出す」ですね。

パラメータを渡すだけなのに、ここまでやらなきゃいけないなんてー!

ハード側が3.0へ世代交代するのを待つしかない、、耐えろ耐えろ、、