【AS3】「ActionScript3の、こんなときどうするの??」
こんにちは、橋本です。
今日は、自分が普段AS3を書いていて「こんなときどうするの??」と思ったところを中心にいくつか書いみました。
思いついたものから書いていったので、内容はバラバラですが、お役に立てる内容が一つでもあれば幸いです。
では、どうぞー。
Q. イベントリスナーに引数を渡したい。
A. 関数を返すイベントハンドラを指定することで、引数を渡すことができます。
サンプル.
Q. イベントの進行を止めたい。
A. event.stopPropagation()を使います。現在処理されている対象で、イベントの伝達をストップすることができます。
サンプル.
Q. イベントの、currentTargetとtargetの違いが、実はよくわかりません。
A. 大丈夫です。僕は最初はよくわかっていませんでしたw
currentTargetは、イベントを受け取ったオブジェクトで、targetはイベントを発生させたオブジェクトです。
以下のサンプルで、親のボックスをクリックしたときには、両方とも"parent"と表示されますが、子のボックスをクリックしたときには、targetが"child"となり、currentTargetが"parent"となります。これは、子のボックスをクリックしたことで発生したイベントを、親のボックスで受け取っているからです。
サンプル.
Q. オブジェクトのクラス名を知りたい。
A. flash.utils.getQualifiedClassNameメソッドを使うと、フルパスのクラス名を取得できます。純粋にクラス名だけを取りたいときには正規表現を使ったりしてみてくだしい。
サンプル.
Q. 配列にオブジェクトが含まれているか知りたい(PHPでいうところの、in_array)。
A. indexOfメソッドを使います。配列に含まれている場合には、インデックスを返し、無い場合には"-1"を返してくれるので、そこで判定します。
サンプル.
Q. 配列のコピーが欲しい。
A. Arrayの中身をfor文で回して…というのは嘘で、Array.concat()もしくは、Array.slice()を引数無しで呼び出すことで作成可能です。
サンプル.
Q. オブジェクトディープコピーが欲しい。
A. ByteArrayクラスのインスタンスを作成することでディープコピーが可能になるようです。(参考:http://help.adobe.com/ja_JP/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7ee7.html)リンク先にもありますが、一応cloneメソッドのサンプルを載せておきます。
サンプル.
どうでしょうか。
お役に立てることがひとつでもあれば幸いです。
今日は、自分が普段AS3を書いていて「こんなときどうするの??」と思ったところを中心にいくつか書いみました。
思いついたものから書いていったので、内容はバラバラですが、お役に立てる内容が一つでもあれば幸いです。
では、どうぞー。
Q. イベントリスナーに引数を渡したい。
A. 関数を返すイベントハンドラを指定することで、引数を渡すことができます。
サンプル.
- //
イベントリスナを登録するときに、引数を渡す - addEventListener(MouseEvent.CLICK,
clickHandler("hoge")); - private
function clickHandler(str:String):Function - {
return function (event:MouseEvent):void {trace(str)}; - }
Q. イベントの進行を止めたい。
A. event.stopPropagation()を使います。現在処理されている対象で、イベントの伝達をストップすることができます。
サンプル.
- public
class test extends Sprite - {
public function test() { var obj:Object = {hoge: "hoge"}; var sprite:Sprite = new Sprite(); sprite.name = "parent"; this.addChild(sprite); sprite.graphics.beginFill(0xFFFF00); sprite.graphics.drawRect(0, 0, 100, 100); sprite.addEventListener(MouseEvent.CLICK, clickHandler1); var sprite2:Sprite = new Sprite(); sprite2.name = "child"; sprite.addChild(sprite2); sprite2.graphics.beginFill(0x00FF00); sprite2.graphics.drawRect(0, 0, 50, 50); sprite2.addEventListener(MouseEvent.CLICK, clickHandler2); } private function clickHandler1(event:MouseEvent):void { trace("parent"); } private function clickHandler2(event:MouseEvent):void { trace("child") event.stopPropagation(); } - }
Q. イベントの、currentTargetとtargetの違いが、実はよくわかりません。
A. 大丈夫です。僕は最初はよくわかっていませんでしたw
currentTargetは、イベントを受け取ったオブジェクトで、targetはイベントを発生させたオブジェクトです。
以下のサンプルで、親のボックスをクリックしたときには、両方とも"parent"と表示されますが、子のボックスをクリックしたときには、targetが"child"となり、currentTargetが"parent"となります。これは、子のボックスをクリックしたことで発生したイベントを、親のボックスで受け取っているからです。
サンプル.
- public
class test extends Sprite - {
public function test() { var obj:Object = {hoge: "hoge"}; var sprite:Sprite = new Sprite(); sprite.name = "parent"; this.addChild(sprite); sprite.graphics.beginFill(0xFFFF00); sprite.graphics.drawRect(0, 0, 100, 100); sprite.addEventListener(MouseEvent.CLICK, clickHandler1); var sprite2:Sprite = new Sprite(); sprite2.name = "child"; sprite.addChild(sprite2); sprite2.graphics.beginFill(0x00FF00); sprite2.graphics.drawRect(0, 0, 50, 50); } private function clickHandler1(event:MouseEvent):void { trace("currentTarget:" + event.currentTarget.name + ", target:" + event.target.name); } - }
Q. オブジェクトのクラス名を知りたい。
A. flash.utils.getQualifiedClassNameメソッドを使うと、フルパスのクラス名を取得できます。純粋にクラス名だけを取りたいときには正規表現を使ったりしてみてくだしい。
サンプル.
- var
sprite:Sprite = new Sprite(); - trace(getQualifiedClassName(sprite));
// flash.display::Sprite - trace(getQualifiedClassName(sprite).match(/::(.*)/)[1]);
// Sprite
Q. 配列にオブジェクトが含まれているか知りたい(PHPでいうところの、in_array)。
A. indexOfメソッドを使います。配列に含まれている場合には、インデックスを返し、無い場合には"-1"を返してくれるので、そこで判定します。
サンプル.
- public
static function inArray(item:*, arr:Array):Boolean - {
return arr.indexOf(item) != -1; - }
Q. 配列のコピーが欲しい。
A. Arrayの中身をfor文で回して…というのは嘘で、Array.concat()もしくは、Array.slice()を引数無しで呼び出すことで作成可能です。
サンプル.
- var
arr:Array = [1, 2, 3]; - var
arr2:Array = arr.concat(); - for
each (var num:Number in arr2) - {
trace(num); - }
Q. オブジェクトディープコピーが欲しい。
A. ByteArrayクラスのインスタンスを作成することでディープコピーが可能になるようです。(参考:http://help.adobe.com/ja_JP/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7ee7.html)リンク先にもありますが、一応cloneメソッドのサンプルを載せておきます。
サンプル.
- import
flash.utils.ByteArray; - function
clone(source:Object):* - {
var myBA:ByteArray = new ByteArray(); myBA.writeObject(source); myBA.position = 0; return(myBA.readObject()); - }
どうでしょうか。
お役に立てることがひとつでもあれば幸いです。
コメント
-
- 勉強になりました!
コメントフォーム
トラックバック
最近の記事
- 「Felica交換日記」 最優秀賞受賞!@Felica&AIR/Flashアプリケーションコンテスト [2010年03月18日 : 小林有佳]
- 【Flex3】「Flex3の、こんなときどうするの??」 [2010年03月18日 : 橋本章史]
- DoctrineのMaster&Slaveのコネクションを操作するクラスを作成する方法 [2010年03月15日 : 笹亀弘]
- <Symfony Componentsシリーズ(2)> Symfony 2の秘密兵器: Request Handler [2010年03月11日 : 小川雄大]
- <Symfony Componentsシリーズ(1)> オブジェクトをつなぐEvent Dispatcher [2010年03月11日 : 小川雄大]
- Symfony 2のアプリケーション構成を読む [2010年03月04日 : 小川雄大]
- サーバサイドJavaScriptの「node.js」を試してみました [2010年03月03日 : 中川善樹]
- お初の山梨旅行 [2010年02月26日 : 阿部恵]
- OpenVPNで拠点間VPN [2010年02月25日 : 門脇優児]
- OracleでのLIMITの記述あれこれ [2010年02月24日 : 松田惇]



最近のコメント