アシアルの中の人が技術と思いのたけをつづるブログ

1 | 2 | 3 | 4 | 5  [59]

【AS3】「ActionScript3の、こんなときどうするの??」

こんにちは、橋本です。
今日は、自分が普段AS3を書いていて「こんなときどうするの??」と思ったところを中心にいくつか書いみました。
思いついたものから書いていったので、内容はバラバラですが、お役に立てる内容が一つでもあれば幸いです。

では、どうぞー。


Q. イベントリスナーに引数を渡したい。

A. 関数を返すイベントハンドラを指定することで、引数を渡すことができます。

サンプル.
  1. // イベントリスナを登録するときに、引数を渡す
  2. addEventListener(MouseEvent.CLICK, clickHandler("hoge"));
  3.  
  4. private function clickHandler(str:String):Function
  5. {
  6.   return function (event:MouseEvent):void {trace(str)};
  7. }

Q. イベントの進行を止めたい。

A. event.stopPropagation()を使います。現在処理されている対象で、イベントの伝達をストップすることができます。

サンプル.
  1. public class test extends Sprite
  2. {
  3.   public function test()
  4.   {
  5.     var obj:Object = {hoge: "hoge"};
  6.     
  7.     var sprite:Sprite = new Sprite();
  8.     sprite.name = "parent";
  9.     this.addChild(sprite);
  10.     sprite.graphics.beginFill(0xFFFF00);
  11.     sprite.graphics.drawRect(0, 0, 100, 100);
  12.     
  13.     sprite.addEventListener(MouseEvent.CLICK, clickHandler1);
  14.     
  15.     var sprite2:Sprite = new Sprite();
  16.     sprite2.name = "child";
  17.     sprite.addChild(sprite2);
  18.     sprite2.graphics.beginFill(0x00FF00);
  19.     sprite2.graphics.drawRect(0, 0, 50, 50);
  20.     
  21.     sprite2.addEventListener(MouseEvent.CLICK, clickHandler2);
  22.   }
  23.   
  24.   private function clickHandler1(event:MouseEvent):void
  25.   {
  26.     trace("parent");
  27.   }
  28.     
  29.   private function clickHandler2(event:MouseEvent):void
  30.   {
  31.     trace("child")
  32.     
  33.     event.stopPropagation();
  34.   }
  35. }

Q. イベントの、currentTargetとtargetの違いが、実はよくわかりません。

A. 大丈夫です。僕は最初はよくわかっていませんでしたw
currentTargetは、イベントを受け取ったオブジェクトで、targetはイベントを発生させたオブジェクトです。
以下のサンプルで、親のボックスをクリックしたときには、両方とも"parent"と表示されますが、子のボックスをクリックしたときには、targetが"child"となり、currentTargetが"parent"となります。これは、子のボックスをクリックしたことで発生したイベントを、親のボックスで受け取っているからです。

サンプル.
  1. public class test extends Sprite
  2. {
  3.   public function test()
  4.   {
  5.     var obj:Object = {hoge: "hoge"};
  6.     
  7.     var sprite:Sprite = new Sprite();
  8.     sprite.name = "parent";
  9.     this.addChild(sprite);
  10.     sprite.graphics.beginFill(0xFFFF00);
  11.     sprite.graphics.drawRect(0, 0, 100, 100);
  12.     
  13.     sprite.addEventListener(MouseEvent.CLICK, clickHandler1);
  14.     
  15.     var sprite2:Sprite = new Sprite();
  16.     sprite2.name = "child";
  17.     sprite.addChild(sprite2);
  18.     sprite2.graphics.beginFill(0x00FF00);
  19.     sprite2.graphics.drawRect(0, 0, 50, 50);
  20.   }
  21.   
  22.   private function clickHandler1(event:MouseEvent):void
  23.   {
  24.     trace("currentTarget:" + event.currentTarget.name + ", target:" + event.target.name);
  25.   }
  26. }

Q. オブジェクトのクラス名を知りたい。

A. flash.utils.getQualifiedClassNameメソッドを使うと、フルパスのクラス名を取得できます。純粋にクラス名だけを取りたいときには正規表現を使ったりしてみてくだしい。

サンプル.
  1. var sprite:Sprite = new Sprite();
  2.  
  3. trace(getQualifiedClassName(sprite)); // flash.display::Sprite
  4. trace(getQualifiedClassName(sprite).match(/::(.*)/)[1]); // Sprite

Q. 配列にオブジェクトが含まれているか知りたい(PHPでいうところの、in_array)。

A. indexOfメソッドを使います。配列に含まれている場合には、インデックスを返し、無い場合には"-1"を返してくれるので、そこで判定します。

サンプル.
  1. public static function inArray(item:*, arr:Array):Boolean
  2. {
  3.   return arr.indexOf(item) != -1;
  4. }

Q. 配列のコピーが欲しい。

A. Arrayの中身をfor文で回して…というのは嘘で、Array.concat()もしくは、Array.slice()を引数無しで呼び出すことで作成可能です。

サンプル.
  1. var arr:Array = [1, 2, 3];
  2.  
  3. var arr2:Array = arr.concat();
  4.  
  5. for each (var num:Number in arr2)
  6. {
  7.   trace(num);
  8. }

Q. オブジェクトディープコピーが欲しい。

A. ByteArrayクラスのインスタンスを作成することでディープコピーが可能になるようです。(参考:http://help.adobe.com/ja_JP/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7ee7.html)リンク先にもありますが、一応cloneメソッドのサンプルを載せておきます。

サンプル.
  1. import flash.utils.ByteArray; 
  2.  
  3. function clone(source:Object):* 
  4. { 
  5.     var myBA:ByteArray = new ByteArray(); 
  6.     myBA.writeObject(source); 
  7.     myBA.position = 0; 
  8.     return(myBA.readObject()); 
  9. }

どうでしょうか。
お役に立てることがひとつでもあれば幸いです。

この記事へのリンク

Twitter-APIを使ってみました

2010/02/05

icon
こんにちは、中川です。

今週のPHPプロのメルマガで、

「現在発売中の日経ソフトウエア2010年3月号に記事を書きました!Web APIに
ついての特集で、今はやりのTwitterと、Google ChartのAPIを活用したPHPの
アプリケーションを作成する内容になっています。ぜひ読んでみてください。
皆さまのご意見やご感想をお待ちしています! By Katsuhiro Ogawa」

こんな序文を見つけました。

ブログネタに困っていた時だったのもあり、
また、現在担当しているプロジェクトで使うかもしれないということで、
TwitterのAPIをちょっと触ってみました。

続きを読む

PHPの名前空間と主要フレームワークの対応について

2010/02/04

icon
こんにちは、小川です。

以前、「モダンPHP勉強会」でPHP 5.3から採用された名前空間について話したことがあるのですが、今日はその時の内容の中から、主要フレームワークの名前空間の対応に関するお話しについてご紹介したいと思います。

続きを読む

HDDのフォーマットには時間がかかるんです

2010/02/01

icon
こんばんは岡本です。

最近、日常記事が少ないとのお声を頂いたため、
とある休日の日常のお話。
地元のワイン専門店さんに、
NASの導入をしに行った時の、ごくごくありふれた平和な休日のお話を書きつづりたいと思います。

続きを読む

GoogleChrome に Firebug extension をいれてみた + よさげなextensionまとめ

2010/01/26

icon.png
こんにちは。松田です。
システムの開発時にはFirefox+Firebugが欠かせなくなっていますが、最近Firefoxがクラッシュしまくる現象に悩まされてます。セーフモードで起動しようがFirefox自体インストールし直そうが、ちょっと使っているとすぐにクラッシュ。
いい加減Firefoxに愛想がつきてきた・・・けどFirebug無いと開発できない。ChromeとかでFirebugっぽいこと出来ないかなぁ・・・、と検索してみたらFirebug Liteエクステンションなるものを発見。さっそく入れてみました。

続きを読む

社員旅行で作成した陶磁器が完成しました!

2010/01/21

1.jpg
こんばんは、阿部です。

社員旅行で作成した陶磁器が完成しました!!!
なので今回は届いた完成物を紹介します。

続きを読む

PHPでコマンドライン・アプリケーションを簡単に作成する

2010/01/20

523d360556258114e0f12f2ef2782ef6.png
こんにちは、小川です。

本日は、PHPで簡単にコマンドライン・アプリケーションを作成できるライブラリをご紹介します。
(本日ご紹介するライブラリは実際には開発途中のものでドキュメントなども存在しません。こういうものがある、程度でとらえていただければ幸いです。)

続きを読む

kvmでwindows7を入れてみました

2010/01/20

icon
仮想化といえば、VMWareやXenが有名ですが、
今回は割と新しいkvmを使用したいと思います。

続きを読む

ratproxyとSelenium IDEを組み合わせたWebアプリケーションテスト

2010/01/15

Selenium IDE
今回は、統合テストなどで利用できる便利ツール「seleniumIDE」と「ratproxy」を組み合わせてのテスト方法を紹介します。

続きを読む

lsyncdでファイルを同期してみよう

2010/01/13

icon
複数サーバ間で手軽にファイルの同期を行うことが出来るlsyncdを使ってみました。

続きを読む