fc2ブログ

パーフェクトシャッフル

2010-01-13 | 15:18

パーフェクトシャッフルというのを知ったので作ってみた。
(クリックすると一回シャッフルされます)

ボールは52個あるが、この場合8回シャッフルすると元に戻るらしい。
package{
        import flash.display.*;
        import flash.events.*;
        import flash.geom.*;
        import flash.utils.*;
        
        import caurina.transitions.Tweener;
        import caurina.transitions.properties.CurveModifiers;       
        [SWF(width="550", height="200",backgroundColor="0xffffff")]
        
        public class PerfectShufful extends Sprite{
                
                private var balls:Array = [];
                private const SIZE:int = 52;               
                private var Y:int = 100;
                private var INTERVAL:int = 10;
                
                private var RADIUS:int = 4;
                public function PerfectShufful(){
                        Tweener.init(stage);
                        CurveModifiers.init();

                        for(var i:int = 0 ; i < SIZE ; i++){
                                var c:int = ((i*5) << 16) + ((i*5) << 8);
                                var b:Ball = new Ball(c,RADIUS);
                                
                                balls.push(b);
                                addChild(b);
                                b.x = i*INTERVAL+RADIUS;
                                b.y = Y;
                        }
                        stage.addEventListener(MouseEvent.MOUSE_DOWN, function(e:*){shuffle();});
                }
                
                private function shuffle() : void{
                    var temp:Array=new Array(balls.length);
                    for(var i:int = 0 ; i < balls.length ; i++){
                        var j:int = (i == balls.length - 1) ? balls.length - 1 : (i*2) % (SIZE-1);

                        var b:Ball = balls[i];
                        var sign:int = (i < (balls.length / 2)) ? -1 : 1;

                        Tweener.addTween(b, {x:j*INTERVAL+RADIUS, y:Y,
                                _bezier:[{x:i*INTERVAL+RADIUS, y:Y+30*sign}, {x:j*INTERVAL+RADIUS, y:Y+30*sign},],
                                time:1, transition:"linear"} );

                        temp[j] = b;
                    }
                    balls = temp;
                }
        }
}

import flash.display.*;
internal class Ball extends Sprite{
        public function Ball(color:int, radius:int){
                graphics.beginFill(color);
                graphics.drawCircle(0,0,radius);
                graphics.endFill();
        }
}
スポンサーサイト



Comment

Post a comment

Secret