2010年12月30日木曜日

クロージャでaddEventListenerしたEventをremoveするメモ

クロージャでaddEventListenerしたEventをremoveするメモ

1arguments.callee

を使う。

Docs[argument]
arguments オブジェクトは、関数の引数の保存や、引数へのアクセスに使用されます。関数の本体に含まれる場合、arguments オブジェクトにはローカルの arguments 変数を使用してアクセスできます。


1var count:Number = 0
2addEventListener(Event.ENTER_FRAME, function():void {
3    count++
4    if(count > 10){
5            removeEventListener(Event.ENTER_FRAME,arguments.callee);
6     }
7}



以下、使ってみたsample

クロージャの中でイベントを削除する - wonderfl build flash online



01package {
02    import flash.geom.Point;
03    import flash.events.Event;
04    import flash.display.Shape;
05    import flash.events.MouseEvent;
06    import flash.display.Sprite;
07     
08    [SWF(width = "465", height = "465", frameRate = "60", backgroundColor = "000000")]
09 
10    public class Line extends Sprite {
11        public function Line() {
12            // write as3 code here..
13            init();
14        }
15         
16        private function init():void
17        {
18         stage.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler);
19        }
20 
21        private function mouseDownHandler(e:MouseEvent):void
22        {
23         stage.addEventListener(MouseEvent.MOUSE_MOVE,mouseMoveHandler);
24         stage.addEventListener(MouseEvent.MOUSE_UP,mouseUpHandler);  
25        }
26         
27        private function mouseUpHandler(e:MouseEvent):void
28        {
29            stage.removeEventListener(MouseEvent.MOUSE_MOVE,mouseMoveHandler);
30            stage.removeEventListener(MouseEvent.MOUSE_UP,mouseUpHandler);
31        }
32 
33        private function mouseMoveHandler(e:MouseEvent):void
34        {
35            drawLines(mouseX,mouseY);
36        }
37         
38        private function drawLines(startX:Number,startY:Number):void
39        {
40            var line:Shape = new Shape();
41            var col:uint = Math.random() * 0xFFFFFF;
42            var count:Number = 0;
43            addChild(line);
44            line.x = startX;
45            line.y = startY;
46            line.graphics.lineStyle(1,col);
47            line.graphics.moveTo(20,0);
48            line.addEventListener(Event.ENTER_FRAME,
49                                function():void{
50                                    count+= 0.1;
51                                    var px:Number = 20 * (Math.cos(count) + count * Math.sin(count));
52                                    var py:Number = 20 * (Math.sin(count) - count * Math.cos(count));
53                                    line.graphics.lineTo(px,py);
54                                    line.alpha -= 0.005;
55                                    if(count > 10){
56                                        removeChild(line);
57                                        line.removeEventListener(Event.ENTER_FRAME,arguments.callee);
58                                    }
59             
60            });
61        }
62    }
63}

2010年12月23日木曜日

【ActionScript3.0】BINGO

忘年会シーズンなので、ビンゴゲーム用のアルゴリズムを書いてみました。自分で書くとお金がかからない上に、自由に演出ができていいですね。

ビンゴのルール
ビンゴ-wikipedia
一般的にビンゴカードはタテ・ヨコ5マスずつ、計25個のマス目が書かれている。その内、中央を除く24マスには1から75までの番号のうち24個の番号が書かれており、中央はフリースポットとして最初から有効な番号として扱われる。1枚のカードの中で同じ番号が重複することはない。

と言う訳なので、75個の数字から一文字ずつランダムで数字を取り出すと言うやり方にしました。
もっといい書き方はきっとあると思うのですが。。。。以下コード。

01private const NUM_MAX:Number = 75;
02private var _numbers:Array = [];
03private var _selectedNumbers:Array = [];
04 
05//すべての数字を格納する配列を用意する。
06private function setNumberAsset():void
07{
08    for (var i:int = 0; i < NUM_MAX; i++) {
09        _numbers.push(i + 1);
10    }          
11}
12 
13//数値が正しく得られるまで計算を繰り返す。
14private function selectNumbers():void
15{
16    var check:Boolean = false;
17    while (!check) {
18        check = checkNumber();
19    }
20//ココで数字を表示しています。
21    trace(_selectedNumbers);          
22}
23 
24//配列からランダムに数字を取り出す。
25private function checkNumber():Boolean
26{
27    var nMax:Number = 75;
28    var nMin:Number = 1;
29    var check:Boolean;
30    var selectNum:int = Math.floor(Math.random()
31         * (nMax - nMin + 1)) + nMin;
32    //元データがなかったら何もしない。
33    if (_numbers.length == 0) return true;
34     
35    for (var i:int = 0; i < _numbers.length; i++) {
36        if (_numbers[i] == selectNum) {
37            _numbers.splice(_numbers.indexOf(selectNum),1);
38            _selectedNumbers.push(selectNum);
39            return true;
40        }else {
41            check = false;
42        }
43    }
44    return check;
45     
46}


結果:クリックで数字が出ます

flash on 2010-12-23 - wonderfl build flash online

2010年12月4日土曜日

【Emacs】Carbon Emacsのshell-modeでaliasを設定する。

Carbon Emacsのshell-modeでaliasを設定するのにつまずいたのでメモ。最初shell上でalias hoge='foo -hogehoge'ってやれば、そのままその後も適用されると思って、もう一度起動したらもう使えなかった。そういうものじゃないらしい。初期のshellの設定として.bashrc とか.bash_profileというのをユーザーのホームディレクトリに作成してそこに設定を書き込めばいいと言う事らしい、と言う事で早速

1alias hoge='foo -hogehoge'


と書き込んでみて、再起動。
してみたものの何も起きずに、どうしたらいいかわからなくてemacsの設定ファイルをいろいろいじってみたけれどやり方がわからない。で、こちらの記事(のろのろwikiさん)にたどり着きようやく判明

1source .bash_profile


で設定ファイルを読み込んであげればいいらしい。Carbon Emacs関係なかった。ちなみに.bashrcと.bash_profileの違いは、.bash_profileと.bashrcの違いは(@IT)こちらの記事に書いてある感じらしい。