Beautifl - Flash Gallery

Preview

Same Direction
o_healer 2011年9月7日 MIT License
?
操作方法  
・↑、↓、←、→  
 ・対応する弾を撃ち落とす
      /*
 「Same Direction」
 ・飛んでくる弾と同じ方向キーを押して撃ち落とすゲーム

 操作方法
 ・↑、↓、←、→
  ・対応する弾を撃ち落とす

 その他
 ・Hoobastankとは特に関係ありません
*/

/*
ToDo

対応
・スコアのランキング対応?
*/


package {
    import flash.display.*;
    import flash.events.*;
    import flash.filters.*;
    import flash.geom.*;
    import flash.net.*;
    import flash.system.*;
    import flash.text.*;
    import flash.ui.*;
    import net.wonderfl.utils.WonderflAPI;
 
    [SWF(width="465", height="465", frameRate="30", backgroundColor="0x000000")]
    public class GameMain extends Sprite {
        //==Const==

        //画面の大きさ
        static public const VIEW_W:int = 465;
        static public const VIEW_H:int = 465;

        //この回数ミスしたらゲームオーバー
        static public const MISS_END_NUM:int = 5;

        //ミスマークのグラフィック
        static public const MISS_LINE_W:int = 8;
        static public const MISS_WIDTH:int = 16;

        //Dir
        static public var DirIter:int = 0;
        static public const DIR_U:int    = DirIter++;
        static public const DIR_R:int    = DirIter++;
        static public const DIR_D:int    = DirIter++;
        static public const DIR_L:int    = DirIter++;
        static public const DIR_NUM:int    = DirIter;

        //弾の出現パターン
        static public const BULLET_DATA:Array = [
//*
            //チュートリアル:上下左右
            {Dir:DIR_U, RatioX:0.5, RatioY:0.0, Time:1.0, MoveTime:2.5},
            {Dir:DIR_D, RatioX:0.5, RatioY:1.0, Time:1.0, MoveTime:2.5},
            {Dir:DIR_L, RatioX:0.0, RatioY:0.5, Time:1.0, MoveTime:2.5},
            {Dir:DIR_R, RatioX:1.0, RatioY:0.5, Time:1.0, MoveTime:2.5},

            //チュートリアル:斜めを見せることで、あくまで表示方向を押すことを示す
            {Dir:DIR_U, RatioX:1.0, RatioY:0.0, Time:1.0, MoveTime:2.5},
            {Dir:DIR_D, RatioX:1.0, RatioY:1.0, Time:1.0, MoveTime:2.5},
            {Dir:DIR_R, RatioX:0.0, RatioY:1.0, Time:1.0, MoveTime:2.5},
            {Dir:DIR_L, RatioX:0.0, RatioY:0.0, Time:1.0, MoveTime:2.5},

            //チュートリアル:来る方向と表示方向が逆の上下左右
            {Dir:DIR_U, RatioX:0.5, RatioY:1.0, Time:1.0, MoveTime:2.5},
            {Dir:DIR_D, RatioX:0.5, RatioY:0.0, Time:1.0, MoveTime:2.5},
            {Dir:DIR_L, RatioX:1.0, RatioY:0.5, Time:1.0, MoveTime:2.5},
            {Dir:DIR_R, RatioX:0.0, RatioY:0.5, Time:1.0, MoveTime:2.5},

            //同時出現:上下
            {Dir:DIR_U, RatioX:0.5, RatioY:0.0, Time:2.0, MoveTime:2.5},
            {Dir:DIR_D, RatioX:0.5, RatioY:1.0, Time:0.0, MoveTime:2.5},

            //同時出現:左右
            {Dir:DIR_L, RatioX:0.0, RatioY:0.5, Time:2.0, MoveTime:2.5},
            {Dir:DIR_R, RatioX:1.0, RatioY:0.5, Time:0.0, MoveTime:2.5},

            //同時出現:ランダム×2
            {Dir:-1, RatioX:0.0, RatioY:0.0, Time:2.0, MoveTime:2.5},
            {Dir:-1, RatioX:1.0, RatioY:1.0, Time:0.0, MoveTime:2.5},

            //同時出現:ランダム×2
            {Dir:-1, RatioX:1.0, RatioY:0.0, Time:2.0, MoveTime:2.5},
            {Dir:-1, RatioX:0.0, RatioY:1.0, Time:0.0, MoveTime:2.5},

            //同時出現:上下左右
            {Dir:DIR_U, RatioX:0.5, RatioY:0.0, Time:3.0, MoveTime:2.5},
            {Dir:DIR_D, RatioX:0.5, RatioY:1.0, Time:0.0, MoveTime:2.5},
            {Dir:DIR_L, RatioX:0.0, RatioY:0.5, Time:0.0, MoveTime:2.5},
            {Dir:DIR_R, RatioX:1.0, RatioY:0.5, Time:0.0, MoveTime:2.5},

            //同時出現:ランダム×4
            {Dir:-1, RatioX:0.0, RatioY:0.0, Time:2.5, MoveTime:3.0},
            {Dir:-1, RatioX:0.0, RatioY:1.0, Time:0.0, MoveTime:3.0},
            {Dir:-1, RatioX:1.0, RatioY:0.0, Time:0.0, MoveTime:3.0},
            {Dir:-1, RatioX:1.0, RatioY:1.0, Time:0.0, MoveTime:3.0},

            //同時出現:ランダム×4
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:3.0, MoveTime:2.5},
            {Dir:-1, RatioX:0.5, RatioY:1.0, Time:0.0, MoveTime:2.5},
            {Dir:-1, RatioX:0.0, RatioY:0.5, Time:0.0, MoveTime:2.5},
            {Dir:-1, RatioX:1.0, RatioY:0.5, Time:0.0, MoveTime:2.5},

            //同時出現:ランダム×8:低速
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:3.0, MoveTime:6.0},
            {Dir:-1, RatioX:1.0, RatioY:0.0, Time:0.0, MoveTime:6.0},
            {Dir:-1, RatioX:1.0, RatioY:0.5, Time:0.0, MoveTime:6.0},
            {Dir:-1, RatioX:1.0, RatioY:1.0, Time:0.0, MoveTime:6.0},
            {Dir:-1, RatioX:0.5, RatioY:1.0, Time:0.0, MoveTime:6.0},
            {Dir:-1, RatioX:0.0, RatioY:1.0, Time:0.0, MoveTime:6.0},
            {Dir:-1, RatioX:0.0, RatioY:0.5, Time:0.0, MoveTime:6.0},
            {Dir:-1, RatioX:0.0, RatioY:0.0, Time:0.0, MoveTime:6.0},

            //同時出現:ランダム×8:中速
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:5.0, MoveTime:5.0},
            {Dir:-1, RatioX:1.0, RatioY:0.0, Time:0.0, MoveTime:5.0},
            {Dir:-1, RatioX:1.0, RatioY:0.5, Time:0.0, MoveTime:5.0},
            {Dir:-1, RatioX:1.0, RatioY:1.0, Time:0.0, MoveTime:5.0},
            {Dir:-1, RatioX:0.5, RatioY:1.0, Time:0.0, MoveTime:5.0},
            {Dir:-1, RatioX:0.0, RatioY:1.0, Time:0.0, MoveTime:5.0},
            {Dir:-1, RatioX:0.0, RatioY:0.5, Time:0.0, MoveTime:5.0},
            {Dir:-1, RatioX:0.0, RatioY:0.0, Time:0.0, MoveTime:5.0},

            //同時出現:ランダム×8:高速
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:4.0, MoveTime:4.0},
            {Dir:-1, RatioX:1.0, RatioY:0.0, Time:0.0, MoveTime:4.0},
            {Dir:-1, RatioX:1.0, RatioY:0.5, Time:0.0, MoveTime:4.0},
            {Dir:-1, RatioX:1.0, RatioY:1.0, Time:0.0, MoveTime:4.0},
            {Dir:-1, RatioX:0.5, RatioY:1.0, Time:0.0, MoveTime:4.0},
            {Dir:-1, RatioX:0.0, RatioY:1.0, Time:0.0, MoveTime:4.0},
            {Dir:-1, RatioX:0.0, RatioY:0.5, Time:0.0, MoveTime:4.0},
            {Dir:-1, RatioX:0.0, RatioY:0.0, Time:0.0, MoveTime:4.0},

            //大量の同方向(きっちり表示された数を押す)
            {Dir:DIR_U, RatioX:0.25, RatioY:0.00, Time:3.0, MoveTime:6.0},
            {Dir:DIR_U, RatioX:0.50, RatioY:0.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_U, RatioX:0.75, RatioY:0.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_U, RatioX:1.00, RatioY:0.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_U, RatioX:1.00, RatioY:0.25, Time:0.0, MoveTime:6.0},
            {Dir:DIR_U, RatioX:1.00, RatioY:0.50, Time:0.0, MoveTime:6.0},
            {Dir:DIR_U, RatioX:1.00, RatioY:0.75, Time:0.0, MoveTime:6.0},
            {Dir:DIR_U, RatioX:1.00, RatioY:1.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_U, RatioX:0.25, RatioY:1.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_U, RatioX:0.50, RatioY:1.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_U, RatioX:0.75, RatioY:1.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_U, RatioX:0.00, RatioY:1.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_U, RatioX:0.00, RatioY:0.25, Time:0.0, MoveTime:6.0},
            {Dir:DIR_U, RatioX:0.00, RatioY:0.50, Time:0.0, MoveTime:6.0},
            {Dir:DIR_U, RatioX:0.00, RatioY:0.75, Time:0.0, MoveTime:6.0},
            {Dir:DIR_U, RatioX:0.00, RatioY:0.00, Time:0.0, MoveTime:6.0},

            {Dir:DIR_D, RatioX:0.25, RatioY:0.00, Time:6.0, MoveTime:6.0},
            {Dir:DIR_D, RatioX:0.50, RatioY:0.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_D, RatioX:0.75, RatioY:0.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_D, RatioX:1.00, RatioY:0.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_D, RatioX:1.00, RatioY:0.25, Time:0.0, MoveTime:6.0},
            {Dir:DIR_D, RatioX:1.00, RatioY:0.50, Time:0.0, MoveTime:6.0},
            {Dir:DIR_D, RatioX:1.00, RatioY:0.75, Time:0.0, MoveTime:6.0},
            {Dir:DIR_D, RatioX:1.00, RatioY:1.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_D, RatioX:0.25, RatioY:1.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_D, RatioX:0.50, RatioY:1.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_D, RatioX:0.75, RatioY:1.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_D, RatioX:0.00, RatioY:1.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_D, RatioX:0.00, RatioY:0.25, Time:0.0, MoveTime:6.0},
            {Dir:DIR_D, RatioX:0.00, RatioY:0.50, Time:0.0, MoveTime:6.0},
            {Dir:DIR_D, RatioX:0.00, RatioY:0.75, Time:0.0, MoveTime:6.0},
            {Dir:DIR_D, RatioX:0.00, RatioY:0.00, Time:0.0, MoveTime:6.0},

            {Dir:DIR_L, RatioX:0.25, RatioY:0.00, Time:5.0, MoveTime:6.0},
            {Dir:DIR_L, RatioX:0.50, RatioY:0.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_L, RatioX:0.75, RatioY:0.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_L, RatioX:1.00, RatioY:0.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_L, RatioX:1.00, RatioY:0.25, Time:0.0, MoveTime:6.0},
            {Dir:DIR_L, RatioX:1.00, RatioY:0.50, Time:0.0, MoveTime:6.0},
            {Dir:DIR_L, RatioX:1.00, RatioY:0.75, Time:0.0, MoveTime:6.0},
            {Dir:DIR_L, RatioX:1.00, RatioY:1.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_L, RatioX:0.25, RatioY:1.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_L, RatioX:0.50, RatioY:1.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_L, RatioX:0.75, RatioY:1.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_L, RatioX:0.00, RatioY:1.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_L, RatioX:0.00, RatioY:0.25, Time:0.0, MoveTime:6.0},
            {Dir:DIR_L, RatioX:0.00, RatioY:0.50, Time:0.0, MoveTime:6.0},
            {Dir:DIR_L, RatioX:0.00, RatioY:0.75, Time:0.0, MoveTime:6.0},
            {Dir:DIR_L, RatioX:0.00, RatioY:0.00, Time:0.0, MoveTime:6.0},

            //1つだけ別
            {Dir:DIR_R, RatioX:0.25, RatioY:0.00, Time:4.0, MoveTime:6.0},
            {Dir:DIR_R, RatioX:0.50, RatioY:0.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_R, RatioX:0.75, RatioY:0.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_R, RatioX:1.00, RatioY:0.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_R, RatioX:1.00, RatioY:0.25, Time:0.0, MoveTime:6.0},
            {Dir:DIR_R, RatioX:1.00, RatioY:0.50, Time:0.0, MoveTime:6.0},
            {Dir:DIR_R, RatioX:1.00, RatioY:0.75, Time:0.0, MoveTime:6.0},
            {Dir:DIR_R, RatioX:1.00, RatioY:1.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_R, RatioX:0.25, RatioY:1.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_R, RatioX:0.50, RatioY:1.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_R, RatioX:0.75, RatioY:1.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_R, RatioX:0.00, RatioY:1.00, Time:0.0, MoveTime:6.0},
            {Dir:DIR_R, RatioX:0.00, RatioY:0.25, Time:0.0, MoveTime:6.0},
            {Dir:DIR_R, RatioX:0.00, RatioY:0.50, Time:0.0, MoveTime:6.0},
            {Dir:DIR_L, RatioX:0.00, RatioY:0.75, Time:0.0, MoveTime:6.0},
            {Dir:DIR_R, RatioX:0.00, RatioY:0.00, Time:0.0, MoveTime:6.0},

            //螺旋:ランダム×8:低速
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:5.0, MoveTime:3.0},
            {Dir:-1, RatioX:1.0, RatioY:0.0, Time:0.8, MoveTime:3.0},
            {Dir:-1, RatioX:1.0, RatioY:0.5, Time:0.8, MoveTime:3.0},
            {Dir:-1, RatioX:1.0, RatioY:1.0, Time:0.8, MoveTime:3.0},
            {Dir:-1, RatioX:0.5, RatioY:1.0, Time:0.8, MoveTime:3.0},
            {Dir:-1, RatioX:0.0, RatioY:1.0, Time:0.8, MoveTime:3.0},
            {Dir:-1, RatioX:0.0, RatioY:0.5, Time:0.8, MoveTime:3.0},
            {Dir:-1, RatioX:0.0, RatioY:0.0, Time:0.8, MoveTime:3.0},

            //螺旋:ランダム×8:中速
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.7, MoveTime:2.2},
            {Dir:-1, RatioX:1.0, RatioY:0.0, Time:0.6, MoveTime:2.0},
            {Dir:-1, RatioX:1.0, RatioY:0.5, Time:0.6, MoveTime:2.0},
            {Dir:-1, RatioX:1.0, RatioY:1.0, Time:0.6, MoveTime:2.0},
            {Dir:-1, RatioX:0.5, RatioY:1.0, Time:0.6, MoveTime:2.0},
            {Dir:-1, RatioX:0.0, RatioY:1.0, Time:0.6, MoveTime:2.0},
            {Dir:-1, RatioX:0.0, RatioY:0.5, Time:0.6, MoveTime:2.0},
            {Dir:-1, RatioX:0.0, RatioY:0.0, Time:0.6, MoveTime:2.0},

            //螺旋:ランダム×8:高速
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.5, MoveTime:1.8},
            {Dir:-1, RatioX:1.0, RatioY:0.0, Time:0.4, MoveTime:1.6},
            {Dir:-1, RatioX:1.0, RatioY:0.5, Time:0.4, MoveTime:1.6},
            {Dir:-1, RatioX:1.0, RatioY:1.0, Time:0.4, MoveTime:1.6},
            {Dir:-1, RatioX:0.5, RatioY:1.0, Time:0.4, MoveTime:1.6},
            {Dir:-1, RatioX:0.0, RatioY:1.0, Time:0.4, MoveTime:1.6},
            {Dir:-1, RatioX:0.0, RatioY:0.5, Time:0.4, MoveTime:1.6},
            {Dir:-1, RatioX:0.0, RatioY:0.0, Time:0.4, MoveTime:1.6},

            //螺旋:ランダム×8:高速もう一周
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.6},
            {Dir:-1, RatioX:1.0, RatioY:0.0, Time:0.4, MoveTime:1.6},
            {Dir:-1, RatioX:1.0, RatioY:0.5, Time:0.4, MoveTime:1.6},
            {Dir:-1, RatioX:1.0, RatioY:1.0, Time:0.4, MoveTime:1.6},
            {Dir:-1, RatioX:0.5, RatioY:1.0, Time:0.4, MoveTime:1.6},
            {Dir:-1, RatioX:0.0, RatioY:1.0, Time:0.4, MoveTime:1.6},
            {Dir:-1, RatioX:0.0, RatioY:0.5, Time:0.4, MoveTime:1.6},
            {Dir:-1, RatioX:0.0, RatioY:0.0, Time:0.4, MoveTime:1.6},

            //螺旋:ランダム×8:高速さらにもう一周
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.6},
            {Dir:-1, RatioX:1.0, RatioY:0.0, Time:0.4, MoveTime:1.6},
            {Dir:-1, RatioX:1.0, RatioY:0.5, Time:0.4, MoveTime:1.6},
            {Dir:-1, RatioX:1.0, RatioY:1.0, Time:0.4, MoveTime:1.6},
            {Dir:-1, RatioX:0.5, RatioY:1.0, Time:0.4, MoveTime:1.6},
            {Dir:-1, RatioX:0.0, RatioY:1.0, Time:0.4, MoveTime:1.6},
            {Dir:-1, RatioX:0.0, RatioY:0.5, Time:0.4, MoveTime:1.6},
            {Dir:-1, RatioX:0.0, RatioY:0.0, Time:0.4, MoveTime:1.6},

            //高速弾:導入
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:3.0, MoveTime:2.4},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:2.0, MoveTime:2.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:1.8, MoveTime:2.0},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:1.4, MoveTime:1.8},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:1.0, MoveTime:1.6},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.8, MoveTime:1.4},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},

            //高速弾:連射
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},

            //高速弾:不意打ち
            {Dir:-1, RatioX:0.5, RatioY:1.0, Time:0.4, MoveTime:1.2},

            //高速弾:連射
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
            {Dir:-1, RatioX:0.5, RatioY:0.0, Time:0.4, MoveTime:1.2},
//*/

            //End~Random
            {Dir:DIR_L, RatioX:0.0, RatioY:0.0, Time:4.0, MoveTime:2.5},
        ];


        //==Var==

        //Pseudo Singleton
        static public var Instance:GameMain;

        //レイヤー
        public var m_Layer_Root:Sprite = new Sprite();
        public var  m_Layer_BG:Sprite = new Sprite();
        public var  m_Layer_Bullet:Sprite = new Sprite();
        public var  m_Layer_Effect:Sprite = new Sprite();

        //弾管理
        public var m_BulletTimer:Number = 0;
        public var m_BulletIter:int = 0;
        public var m_BulletInterval:Number = 1.0;

        //スコア
        public var m_Score:int = 0;

        //ミス
        public var m_MissCount:int = 0;
        public var m_MissGraphic:Vector.<Sprite> = new Vector.<Sprite>(MISS_END_NUM);

        //テキスト
        public var m_Text_Score:TextField = new TextField();
        public var m_Text_GameOver:TextField = new TextField();

        //==Function==

        //Init
        public function GameMain() {
            var i:int;
            var g:Graphics;

            //Pseudo Singleton
            {
                Instance = this;
            }

            //Static Init
            {
                ScoreWindowLoader.init(this, new WonderflAPI(loaderInfo.parameters));
            }

            //Layer
            {
                //Root
                addChild(m_Layer_Root);

                {
                    //背景
                    m_Layer_Root.addChild(m_Layer_BG);

                    //弾
                    m_Layer_Root.addChild(m_Layer_Bullet);

                    //エフェクト
                    m_Layer_Root.addChild(m_Layer_Effect);
                }
            }

            //背景
            {
                m_Layer_BG.addChild(new Bitmap(new BitmapData(VIEW_W, VIEW_H, false, 0x000000)));
            }

            //プレイヤー的なもの
            {
                var player:Sprite = new Sprite();

                player.x = VIEW_W/2;
                player.y = VIEW_H/2;

                g = player.graphics;
                g.lineStyle(1.5*Bullet.CIRCLE_W, Bullet.COLOR, 1.0);
                g.drawCircle(0,0, Bullet.RAD);
                player.filters = [new GlowFilter(Bullet.SOUSAI_COLOR,1.0, Bullet.GLOW_W,Bullet.GLOW_W)];

                m_Layer_BG.addChild(player);
            }

            //
            {
                var s:Sprite;
                for(i = 0; i < MISS_END_NUM; i++){
                    s = new Sprite();

                    s.x = 8 + (MISS_WIDTH + MISS_LINE_W*2) * i;
                    s.y = 0;

                    g = s.graphics;
                    g.lineStyle(MISS_LINE_W, 0x444444, 1.0);
                    g.moveTo(MISS_LINE_W, MISS_LINE_W);
                    g.lineTo(MISS_LINE_W + MISS_WIDTH, MISS_LINE_W + MISS_WIDTH);
                    g.moveTo(MISS_LINE_W + MISS_WIDTH, MISS_LINE_W);
                    g.lineTo(MISS_LINE_W, MISS_LINE_W + MISS_WIDTH);

                    m_Layer_BG.addChild(s);

                    m_MissGraphic[i] = s;
                }
            }


            //Text
            {
                m_Text_Score.selectable = false;
                m_Text_Score.autoSize = TextFieldAutoSize.RIGHT;
                m_Text_Score.defaultTextFormat = new TextFormat('Verdana', 16, 0xFFFFFF, true);
                m_Text_Score.text = '0';
                m_Text_Score.filters = [new GlowFilter(0x00FFFF,1.0, 4,4)];

                m_Text_Score.x = VIEW_W - 32;
                m_Text_Score.y = 0;

                addChild(m_Text_Score);
            }
            {
                m_Text_GameOver.selectable = false;
                m_Text_GameOver.autoSize = TextFieldAutoSize.LEFT;
                m_Text_GameOver.defaultTextFormat = new TextFormat('Verdana', 60, 0xFFFF00, true);
                m_Text_GameOver.text = '';
                m_Text_GameOver.filters = [new GlowFilter(0xFF0000,1.0, 8,8)];

                addChild(m_Text_GameOver);
            }

            //Key
            {
                //キー入力を見る
                stage.addEventListener(KeyboardEvent.KEY_DOWN, OnKeyDown);
                stage.addEventListener(KeyboardEvent.KEY_UP, OnKeyUp);
            }

            //Update
            {
                addEventListener(Event.ENTER_FRAME, Update);
            }
        }

        //Update
        public function Update(e:Event=null):void{
            var DeltaTime:Number = 1.0 / stage.frameRate;

            //弾
            Update_Bullet(DeltaTime);

            //エフェクト
            Update_Effect(DeltaTime);
        }

        //Update : Bullet
        public function Update_Bullet(in_DeltaTime:Number):void{
            var i:int;
            var num:int;

            var bullet:Bullet;

            //Check
            if(MISS_END_NUM <= m_MissCount){
                return;
            }

            //生成
            {
                //画面端だと画像の一部がいきなり表示されるので、もう少し外に表示するためのオフセット
                const Offset:int = 32;

                m_BulletTimer += in_DeltaTime;

                num = BULLET_DATA.length;

                for(;;){
                    bullet = null;
                    if(m_BulletIter < num){
                        //指定されたデータがある
                        var BulletData:Object = BULLET_DATA[m_BulletIter];
                        var t:Number = BulletData.Time;

                        if(t <= m_BulletTimer){
                            m_BulletTimer -= t;
                            ++m_BulletIter;

                            var Dir:int = BulletData.Dir;
                            if(Dir < 0){Dir = DIR_NUM * Math.random();}
                            var SrcX:int = -Offset + (VIEW_W + 2*Offset) * BulletData.RatioX;
                            var SrcY:int = -Offset + (VIEW_H + 2*Offset) * BulletData.RatioY;

                            bullet = new Bullet(Dir, SrcX, SrcY, BulletData.MoveTime);
                            //- 厳密にはbulletのローカルタイマーがズレてるので、m_BulletTimer-in_DeltaTimeでUpdateすべきだが
                        }
                    }else{
                        //指定されたデータがなければランダム
//                        const Interval:Number = 0.1;
                        const IntervaRatio:Number = 0.95;
                        const IntervalMin:Number = 0.1;
                        const MoveTime:Number = 2.0;

                        if(m_BulletInterval <= m_BulletTimer){
                            m_BulletTimer -= m_BulletInterval;
                            m_BulletInterval *= IntervaRatio;
                            if(m_BulletInterval < IntervalMin){m_BulletInterval = IntervalMin;}

                            switch((int)(4 * Math.random())){
                            case 0:
                                bullet = new Bullet(DIR_NUM * Math.random(), VIEW_W * Math.random(), -Offset, MoveTime);
                                break;
                            case 1:
                                bullet = new Bullet(DIR_NUM * Math.random(), VIEW_W * Math.random(),  VIEW_H+Offset, MoveTime);
                                break;
                            case 2:
                                bullet = new Bullet(DIR_NUM * Math.random(), -Offset, VIEW_H * Math.random(), MoveTime);
                                break;
                            case 3:
                                bullet = new Bullet(DIR_NUM * Math.random(), VIEW_W+Offset, VIEW_H * Math.random(), MoveTime);
                                break;
                            }
                        }
                    }

                    if(bullet != null){
                        m_Layer_Bullet.addChild(bullet);
                    }else{
                        break;
                    }
                }
            }

            //更新
            {
                num = m_Layer_Bullet.numChildren;
                for(i = 0; i < num; i++){
                    bullet = m_Layer_Bullet.getChildAt(i) as Bullet;

                    //更新
                    bullet.Update(in_DeltaTime);

                    //消失チェック
                    if(bullet.parent == null){//登録が解除された
                        num -= 1;//更新
                        i--;//相殺
                        continue;
                    }
                }
            }
        }


        //Update : Effect
        public function Update_Effect(in_DeltaTime:Number):void{
            var i:int;
            var num:int;

            var effect:Effect;

            //更新
            {
                num = m_Layer_Effect.numChildren;
                for(i = 0; i < num; i++){
                    effect = m_Layer_Effect.getChildAt(i) as Effect;

                    //更新
                    effect.Update(in_DeltaTime);

                    //消失チェック
                    if(effect.parent == null){//登録が解除された
                        num -= 1;//更新
                        i--;//相殺
                        continue;
                    }
                }
            }
        }

        //Update : Input
        private var m_PressFlag:uint = 0;
        private function OnKeyDown(event:KeyboardEvent):void{
            //Check
            if(MISS_END_NUM <= m_MissCount){
                return;
            }

            //対応する方向を求める(なければ負の数)
            var Dir:int = -1;
            {
                switch(event.keyCode){
                case Keyboard.LEFT:  Dir = DIR_L; break;
                case Keyboard.RIGHT: Dir = DIR_R; break;
                case Keyboard.UP:    Dir = DIR_U; break;
                case Keyboard.DOWN:  Dir = DIR_D; break;
                default: return;
                }
            }

            //Releaseされてなければスキップ(押しっぱの連打は無視)
            if((m_PressFlag & (1 << Dir)) != 0){
                return;
            }
            m_PressFlag |= (1 << Dir);

            //該当する弾を見つける
            var num:int = m_Layer_Bullet.numChildren;
            for(var i:int = 0; i < num; i++){
                var bullet:Bullet = m_Layer_Bullet.getChildAt(i) as Bullet;

                //方向が違えばスキップ
                if(bullet.m_Dir != Dir){
                    continue;
                }

                //すでに相殺弾が撃たれていたらスキップ
                if(bullet.IsSousai()){
                    continue;
                }

                //=この弾に決定=

                //相殺処理(Bullet側に任せる)
                bullet.CreateSousai();

                return;
            }

            //該当する弾がないので、失敗として扱いワンミス
            onMiss();
        }
        private function OnKeyUp(event:KeyboardEvent):void{
            //Check
            if(MISS_END_NUM <= m_MissCount){
                return;
            }

            //対応する方向を求める(なければ負の数)
            var Dir:int = -1;
            {
                switch(event.keyCode){
                case Keyboard.LEFT:  Dir = DIR_L; break;
                case Keyboard.RIGHT: Dir = DIR_R; break;
                case Keyboard.UP:    Dir = DIR_U; break;
                case Keyboard.DOWN:  Dir = DIR_D; break;
                default: return;
                }
            }

            m_PressFlag &= ~(1 << Dir);
        }


        public function onMiss():void{
            //ミスエフェクト
            {
                var effect:Effect = new Effect();

                effect.x = VIEW_W/2;
                effect.y = VIEW_H/2;

                m_Layer_Effect.addChild(effect);
            }

            //ミスマーク
            {
                var s:Sprite = m_MissGraphic[m_MissCount];

                var g:Graphics = s.graphics;
                g.lineStyle(MISS_LINE_W, 0xFF4444, 1.0);
                g.moveTo(MISS_LINE_W, MISS_LINE_W);
                g.lineTo(MISS_LINE_W + MISS_WIDTH, MISS_LINE_W + MISS_WIDTH);
                g.moveTo(MISS_LINE_W + MISS_WIDTH, MISS_LINE_W);
                g.lineTo(MISS_LINE_W, MISS_LINE_W + MISS_WIDTH);
            }

            //ミスの数+1
            {
                ++m_MissCount;
            }

            //ミスの数が規定数を超えたらおしまい
            if(MISS_END_NUM <= m_MissCount){
                //Text
                m_Text_GameOver.text = 'GAME OVER';

                //Centering
                m_Text_GameOver.x = (VIEW_W - m_Text_GameOver.width) / 2;
                m_Text_GameOver.y = (VIEW_H - m_Text_GameOver.height) / 2;

                //スコア表示
                {
                    ScoreWindowLoader.show(m_Score);
                }
            }
        }

        public function onSousai():void{
            ++m_Score;

            m_Text_Score.text = m_Score.toString();
        }

    }
}


import flash.display.*;
import flash.events.*;
import flash.filters.*;
import flash.geom.*;
import flash.net.*;
import flash.system.*;
import flash.ui.*;
import net.wonderfl.utils.WonderflAPI;


//#Utility
function Lerp(in_Src:Number, in_Dst:Number, in_Ratio:Number):Number{
    return (in_Src * (1.0 - in_Ratio)) + (in_Dst * in_Ratio);
}


//#Bullet
class Bullet extends Sprite
{
    //==Constt==

    //Graphic
    static public const COLOR:uint = 0xFFFFFF;
    static public const RAD:int = 16;
    static public const CIRCLE_W:int = 2;
    static public const LINE_W:int = RAD/4;
    static public const GLOW_COLOR:uint = 0xFF0000;
    static public const GLOW_W:int = 8;
    static public const SOUSAI_COLOR:uint = 0x0080FF;


    //==Var==

    //Dir
    public var m_Dir:int = 0;

    //MovePos
    public var m_SrcX:int = 0;
    public var m_SrcY:int = 0;
    public var m_DstX:int = 0;
    public var m_DstY:int = 0;

    //Local Timer
    public var m_Timer:Number = 0;
    public var m_MoveTime:Number = 0;
    public var m_SousaiTimer:Number = 0;

    //Sprite
    public var m_BulletSprite:Sprite;
    public var m_SousaiSprite:Sprite;


    //==Function==

    //Init
    public function Bullet(in_Dir:int, in_X:int, in_Y:int, in_MoveTime:Number){
        //Param
        {
            m_SrcX = in_X;
            m_SrcY = in_Y;

            m_DstX = GameMain.VIEW_W/2;
            m_DstY = GameMain.VIEW_H/2;

            var GapX:Number = m_DstX - m_SrcX;
            var GapY:Number = m_DstY - m_SrcY;
            var Distance:Number = Math.sqrt(GapX*GapX + GapY*GapY);
//            var Vel:Number = GameMain.VIEW_W / 2;//1秒で何ドット進むか
            //var Vel:Number = GameMain.VIEW_W / 4;//1秒で何ドット進むか
            //m_MoveTime = Distance / Vel;
            m_MoveTime = in_MoveTime;

            m_SousaiTimer = m_MoveTime;

            m_Dir = in_Dir;
        }

        //Graphic
        {
            m_BulletSprite = CreateGraphic(in_Dir, true);
            addChild(m_BulletSprite);
        }
    }

    static public function CreateGraphic(in_Dir:int, in_IsBullet:Boolean):Sprite{
        var sprite:Sprite = new Sprite();

        var g:Graphics = sprite.graphics;

        //Circle
        g.lineStyle(CIRCLE_W, COLOR, 1.0);
        g.drawCircle(0,0, RAD);

        //Arrow
        var theta:Number = Math.PI/2 * in_Dir;
        var r:Number = 0.7 * RAD;
        var SrcX:int = r *  Math.sin(theta);
        var SrcY:int = r * -Math.cos(theta);
        g.lineStyle(LINE_W, COLOR, 1.0);
        g.moveTo(SrcX, SrcY);
        g.lineTo(-SrcX, -SrcY);
        g.moveTo(SrcX, SrcY);
        g.lineTo( SrcY, -SrcX);
        g.moveTo(SrcX, SrcY);
        g.lineTo(-SrcY,  SrcX);

        //Filter
        var color:uint = in_IsBullet? GLOW_COLOR: SOUSAI_COLOR;
        sprite.filters = [new GlowFilter(color,1.0, GLOW_W,GLOW_W)];

        return sprite;
    }

    //Update
    public function Update(in_DeltaTime:Number):void{
        var Ratio:Number;

        //Timer
        if(m_Timer < m_SousaiTimer)
        {
            m_Timer += in_DeltaTime;

            if(IsSousai()){
                const VelRatio:Number = 2.0;//通常の弾の倍速で動く
                m_SousaiTimer -= VelRatio * in_DeltaTime;
            }
        }

        //Check End
        {
            if(m_SousaiTimer <= m_Timer){
                if(! IsSousai()){
                    //プレイヤーに当たったのでワンミス
                    GameMain.Instance.onMiss();

                    //Kill
                    parent.removeChild(this);//描画登録の解除で実現
                }else{
                    //相殺時はすぐには消えない
                    if(m_BulletSprite != null){
                        //元の弾の画像は消す
                        removeChild(m_BulletSprite);
                        m_BulletSprite = null;

                        //相殺弾をエフェクト代わりに使う
                        m_SousaiSprite.filters = [new GlowFilter(0xFFFFFF,1.0, GLOW_W,GLOW_W)];

                        //タイマーを互いの中間位置で固定(位置固定)
                        m_Timer = (m_Timer + m_SousaiTimer)/2;
                        m_SousaiTimer = m_Timer;
                    }

                    const ScaleVel:Number = 5.0;
                    const ScaleThr:Number = 2.0;
                    var scl:Number = m_SousaiSprite.scaleX + ScaleVel * in_DeltaTime;
                    if(ScaleThr < scl){scl = ScaleThr;}
                    m_SousaiSprite.scaleX = m_SousaiSprite.scaleY = scl;
                    m_SousaiSprite.alpha = (ScaleThr - scl) / (ScaleThr - 1);

                    if(m_SousaiSprite.alpha <= 0){
                        //スコア++
                        GameMain.Instance.onSousai();

                        //Kill
                        parent.removeChild(this);//描画登録の解除で実現
                    }
                }

                return;
            }
        }

        //Move
        if(m_BulletSprite != null)
        {
            Ratio = m_Timer / m_MoveTime;
            m_BulletSprite.x = Lerp(m_SrcX, m_DstX, Ratio);
            m_BulletSprite.y = Lerp(m_SrcY, m_DstY, Ratio);
        }

        //Move:Sousai
        if(m_SousaiSprite != null)
        {
            Ratio = m_SousaiTimer / m_MoveTime;
            m_SousaiSprite.x = Lerp(m_SrcX, m_DstX, Ratio);
            m_SousaiSprite.y = Lerp(m_SrcY, m_DstY, Ratio);
        }
    }

    //Sousai
    public function IsSousai():Boolean{
        return (m_SousaiSprite != null);
    }

    public function CreateSousai():void{
        //すでに作られてたら何もしない
        if(IsSousai()){
            return;
        }

        //相殺弾の画像を生成
        m_SousaiSprite = CreateGraphic(m_Dir, false);
        m_SousaiSprite.x = m_DstX;
        m_SousaiSprite.y = m_DstY;
        addChild(m_SousaiSprite);
    }
}


//#Effect
class Effect extends Sprite
{
    //==Const==

    static public const LINE_W:int = 3;
    static public const RAD:int = 16;


    //==Function==

    //Init
    public function Effect(){
        //Graphic
        {
            var sprite:Sprite = new Sprite();

            var g:Graphics = sprite.graphics;

            //円
            g.lineStyle(LINE_W, 0xFFDD00, 1.0);
            g.drawCircle(0, 0, RAD);

            //×
            const cos:Number = 0.707;
            g.moveTo( RAD * cos,  RAD * cos);
            g.lineTo(-RAD * cos, -RAD * cos);
            g.moveTo(-RAD * cos,  RAD * cos);
            g.lineTo( RAD * cos, -RAD * cos);

            addChild(sprite);

            this.filters = [new GlowFilter(0xFF0000,1.0, 8,8)];
        }
    }

    //Update
    public function Update(in_DeltaTime:Number):void{
        const ScaleVel:Number = 5.0;
        const ScaleThr:Number = 4.0;

        var scl:Number = this.scaleX + ScaleVel * in_DeltaTime;
        this.scaleX = this.scaleY = scl;

        this.alpha = (ScaleThr - scl) / (ScaleThr - 1);

        if(this.alpha <= 0){
            //Kill
            parent.removeChild(this);//描画登録の解除で実現
        }
    }
}





//bkzenさんのコードを利用
//@see http://wonderfl.net/c/cuY4
//@see http://wonderfl.net/c/kYyY
class ScoreWindowLoader
{
    private static var _top: DisplayObjectContainer;
    private static var _api: WonderflAPI;
    private static var _content: Object;
    //private static const URL: String = "wonderflScore.swf";
    private static const URL: String = "http://swf.wonderfl.net/swf/usercode/5/57/579a/579a46e1306b5770d429a3738349291f05fec4f3.swf";
    private static const TWEET: String = "Playing Same Direction [score: %SCORE%] #wonderfl";
    
    public static function init(top: DisplayObjectContainer, api: WonderflAPI): void 
    {
        _top = top, _api = api;
        var loader: Loader = new Loader();
        var comp: Function = function(e: Event): void
        {
            loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, comp);
            _content = loader.content;
//            handler();
        }
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, comp);
        loader.load(new URLRequest(URL), new LoaderContext(true));
    }
    
    /**
     * Wonderfl の Score API 用
     * ランキング表示から Tweet までをひとまとめにしたSWF素材を使う
     * @param    score            : 取得スコア
     * @param    closeHandler    : Window が閉じるイベントハンドら
     */
    public static function show( score: int): void
    {
        var window: DisplayObject = _content.makeScoreWindow(_api, score, "Same Direction", 1, TWEET);
//        var close: Function = function(e: Event): void
//        {
//            window.removeEventListener(Event.CLOSE, close);
//            closeHandler();
//        }
//        window.addEventListener(Event.CLOSE, close);
        _top.addChild(window);
    }
    
}