Exemplo n.º 1
0
        public override void DoAfterAction()
        {
            if (BuildTime.IsFull)
            {
                for (int i = 0; i < BombCount; i++)
                {
                    int    speed         = Global.Rand.Next(BombSpeedMin, Math.Max(BombSpeedMin, BombSpeedMax) + 1);
                    int    life          = Global.Rand.Next(BombLifeMin, Math.Max(BombLifeMin, BombLifeMax) + 1);
                    double bombDirection = Global.Rand.NextDouble() * 360;

                    MoveStraight moveObject = new MoveStraight(null, 1, speed, 1, 0, 1);
                    moveObject.Target.SetOffsetByAngle(bombDirection, 1000);

                    DrawBase bombDraw;
                    if (BombDrawObject == null)
                    {
                        bombDraw = new DrawPolygon(Color.Empty, Owner.DrawObject.MainColor, 2, 2, Global.Rand.Next(0, 360))
                        {
                            RotateEnabled = true
                        };
                    }
                    else
                    {
                        bombDraw = BombDrawObject.Copy();
                    }

                    ObjectBase newObject = new ObjectBase(bombDraw, moveObject);
                    newObject.Layout.Anchor        = DirectionType.Center;
                    newObject.Layout.CollisonShape = ShapeType.Ellipse;
                    newObject.Layout.Width         = BombWidth;
                    newObject.Layout.Height        = BombHeight;
                    newObject.Layout.X             = Owner.Layout.CenterX;
                    newObject.Layout.Y             = Owner.Layout.CenterY;
                    newObject.League     = Owner.League;
                    newObject.Life.Limit = life;

                    newObject.Propertys.Add(new PropertyRotate(-1, Global.Rand.Next(280, 360), false, true));
                    newObject.Propertys.Add(new PropertyDeadExplosion(8, 0, 1, LeagueType.Ememy1, Color.FromArgb(180, 225, 70, 40), 0, 1, 2, ObjectDeadType.All)
                    {
                        DrawRange = false
                    });
                    newObject.Propertys.Add(new PropertyCollision(1));

                    moveObject.Target.SetObject(newObject);
                    Owner.Container.Add(newObject);
                }
                BuildTime.Value = 0;
            }
            else
            {
                BuildTime.Value += Scene.SceneIntervalOfRound;
            }
            base.DoAfterAction();
        }
Exemplo n.º 2
0
        public SceneStand()
        {
            InitializeComponent();

            // 場景:畫面變黑暗
            WaveEvents.Add("@Dark", (n) =>
            {
                EffectObjects.Add(new EffectDyeing(Color.Black, Wave(0.5F), Wave(Math.Max(n - 1, 0)), Wave(0.5F)));
            });

            // 場景:邊界縮小
            WaveEvents.Add("@Shrink", (n) =>
            {
                double scaleX = Global.Rand.NextDouble();
                double scaleY = 1 - scaleX;

                int limitX     = (int)(scaleX * MainRectangle.Width * 0.4F);
                int limitY     = (int)(scaleY * MainRectangle.Height * 0.4F);
                int limitLeft  = Global.Rand.Next(0, limitX);
                int limitTop   = Global.Rand.Next(0, limitY);
                int limitRight = limitX - limitLeft;
                int limitDown  = limitY - limitTop;

                Padding shrinkPerRound = new Padding(limitLeft, limitTop, limitRight, limitDown);
                EffectObjects.Add(new EffectShrink(shrinkPerRound, Wave(0.5F), Wave(Math.Max(n - 1, 0)), Wave(0.5F)));
            });

            // 物件:追捕者
            WaveEvents.Add("Catcher", (n) =>
            {
                int roundIdx = Global.Rand.Next(4);
                for (int i = 0; i < n; i++)
                {
                    int size         = Global.Rand.Next(7, 12);
                    int offsetLimit  = size + Global.Rand.Next(5, 10);
                    float speed      = Global.Rand.Next(320, 380) * _SpeedFix;
                    float weight     = 0.3F + size * 0.1F;
                    int life         = Sec(3.5F * _LifeFix) + Global.Rand.Next(0, 5);
                    Point enterPoint = GetEnterPoint(roundIdx);

                    MoveStraight moveObject = new MoveStraight(PlayerObject, weight, speed, offsetLimit, 100, 0.5F);
                    ObjectActive newObject  = new ObjectActive(enterPoint.X, enterPoint.Y, size, size, life, LeagueType.Ememy1, ShapeType.Ellipse, new DrawBrush(Color.Red, ShapeType.Ellipse), moveObject);
                    newObject.Skills.Add(new SkillSprint(0, Sec(1.5F), 15, 0, true)
                    {
                        AutoCastObject = new AutoCastNormal(0.4F)
                    });
                    newObject.Skills.Add(new SkillSprint(0, Sec(0.5F), 5, 0, false)
                    {
                        AutoCastObject = new AutoCastNormal(3F)
                    });
                    newObject.Propertys.Add(new PropertyDeadBroken(15, 2, 2, ObjectDeadType.Collision, 30, 150, 400, Sec(0.5F), Sec(0.9F)));
                    newObject.Propertys.Add(new PropertyDeadCollapse(1, Sec(0.6F), Sec(0.01F), 2, 2, ObjectDeadType.LifeEnd, 50, 100, Sec(0.15F), Sec(0.25F)));
                    newObject.Propertys.Add(new PropertyCollision(1));
                    newObject.Propertys.Add(new PropertyShadow(2, 3));
                    GameObjects.Add(newObject);
                    roundIdx = ++roundIdx % 4;
                }
            });

            // 物件:快速追捕者 速度更快 更常使用加速
            WaveEvents.Add("Faster", (n) =>
            {
                int roundIdx = Global.Rand.Next(4);
                for (int i = 0; i < n; i++)
                {
                    int size         = Global.Rand.Next(6, 8);
                    int offsetLimit  = size + Global.Rand.Next(2, 4);
                    float speed      = Global.Rand.Next(400, 460) * _SpeedFix;
                    float weight     = 0.3F + size * 0.1F;
                    int life         = Sec(4.5F * _LifeFix) + Global.Rand.Next(0, 5);
                    Point enterPoint = GetEnterPoint(roundIdx);

                    MoveStraight moveObject = new MoveStraight(PlayerObject, weight, speed, offsetLimit, 100, 0.5F);
                    ObjectActive newObject  = new ObjectActive(enterPoint.X, enterPoint.Y, size, size, life, LeagueType.Ememy1, ShapeType.Ellipse, new DrawBrush(Color.Blue, ShapeType.Ellipse), moveObject);
                    newObject.Skills.Add(new SkillSprint(0, Sec(1F), 8, 0, true)
                    {
                        AutoCastObject = new AutoCastNormal(1F)
                    });
                    newObject.Skills.Add(new SkillSprint(0, Sec(0.5F), 4, 0, false)
                    {
                        AutoCastObject = new AutoCastNormal(3F)
                    });
                    newObject.Propertys.Add(new PropertyDeadBroken(15, 2, 2, ObjectDeadType.Collision, 20, 150, 400, Sec(0.5F), Sec(0.9F)));
                    newObject.Propertys.Add(new PropertyDeadCollapse(1, Sec(0.6F), Sec(0.01F), 2, 2, ObjectDeadType.LifeEnd, 50, 100, Sec(0.15F), Sec(0.25F)));
                    newObject.Propertys.Add(new PropertyCollision(1));
                    newObject.Propertys.Add(new PropertyShadow(2, 3));
                    GameObjects.Add(newObject);
                    roundIdx = ++roundIdx % 4;
                }
            });

            // 物件:流星 四面八方的直線前進物件
            WaveEvents.Add("Meteor", (n) =>
            {
                int roundIdx = Global.Rand.Next(4);
                for (int i = 0; i < n; i++)
                {
                    int size         = 10;
                    int movesCount   = 6;
                    float speed      = 500 * _SpeedFix;
                    float weight     = 0.3F + size * 0.1F;
                    int life         = Sec(10F);
                    Point enterPoint = GetEnterPoint(roundIdx);

                    double angel            = Function.GetAngle(enterPoint.X, enterPoint.Y, PlayerObject.Layout.CenterX, PlayerObject.Layout.CenterY) + Global.Rand.Next(-20, 20);
                    MoveStraight moveObject = new MoveStraight(null, weight, speed, movesCount, 0, 1F);
                    moveObject.Target.SetOffsetByAngle(angel, 1000F);
                    ObjectActive newObject = new ObjectActive(enterPoint.X, enterPoint.Y, size, size, life, LeagueType.Ememy1, ShapeType.Ellipse, new DrawBrush(Color.Orchid, ShapeType.Ellipse), moveObject);
                    newObject.Propertys.Add(new PropertyDeadBroken(15, 2, 2, ObjectDeadType.Collision, 20, 150, 400, Sec(0.5F), Sec(0.9F)));
                    newObject.Propertys.Add(new PropertyDeadCollapse(1, Sec(0.6F), Sec(0.01F), 2, 2, ObjectDeadType.LifeEnd, 50, 100, Sec(0.15F), Sec(0.25F)));
                    newObject.Propertys.Add(new PropertySmoking(-1, Sec(0.2F)));
                    newObject.Propertys.Add(new PropertyFreeze(Sec(0.2F * i)));
                    newObject.Propertys.Add(new PropertyCollision(1));
                    newObject.Propertys.Add(new PropertyShadow(2, 3));
                    newObject.Propertys.Add(new PropertyOutClear());
                    moveObject.Target.SetObject(newObject);
                    GameObjects.Add(newObject);
                    roundIdx = ++roundIdx % 4;
                }
            });

            // 物件:水平牆壁(有缺口)
            WaveEvents.Add("WallA", (n) =>
            {
                List <ObjectActive> objects = new List <ObjectActive>();
                for (int i = 0; i < MainRectangle.Height + 60; i += 30)
                {
                    int movesCount          = 6;
                    float speed             = 700 * (10 + n) / 10F;
                    float weight            = 3;
                    int life                = Sec(10F);
                    MoveStraight moveObject = new MoveStraight(null, weight, speed, movesCount, 0, 1F);
                    moveObject.Target.SetOffsetByXY(1000F, 0);
                    DrawBrush drawObject = new DrawBrush(Color.Orchid, ShapeType.Rectangle)
                    {
                        RotateEnabled = false
                    };
                    //DrawPolygon drawObject = new DrawPolygon(Color.Orchid, Color.Orchid, 2, 5, 0) { RotateEnabled = false };
                    ObjectActive newObject = new ObjectActive(-50, MainRectangle.Top + i - 20, 5, 28, life, LeagueType.Ememy1, ShapeType.Ellipse, drawObject, moveObject);
                    //newObject.Propertys.Add(new PropertyRotate(-1, 780, false, true));
                    //newObject.Propertys.Add(new PropertyDeadBroken(new DrawBrush(Color.Orchid, ShapeType.Rectangle), 15, 6, 6, ObjectDeadType.Collision | ObjectDeadType.LifeEnd, 20, 200, 600, Sec(0.6F), Sec(1.2F)));
                    newObject.Propertys.Add(new PropertyDeadBrokenShaping(15, 6, 6, ObjectDeadType.Collision | ObjectDeadType.LifeEnd, 20, 100, 300, Sec(0.6F), Sec(1.2F)));
                    newObject.Propertys.Add(new PropertyCollision(1));
                    newObject.Propertys.Add(new PropertyShadow(2, 3));
                    newObject.Propertys.Add(new PropertyOutClear());
                    moveObject.Target.SetObject(newObject);
                    GameObjects.Add(newObject);
                    objects.Add(newObject);
                }

                int clearCount = 2;
                int clearIndex = Global.Rand.Next(1, objects.Count - 2 - clearCount + 1);
                for (int i = 0; i < clearCount; i++)
                {
                    objects[clearIndex + i].Kill(null, ObjectDeadType.Clear);
                }
            });

            // 物件:水平牆壁(交錯)
            WaveEvents.Add("WallB", (n) =>
            {
                List <ObjectActive> objects = new List <ObjectActive>();
                int midRand   = 50;
                int cot       = MainRectangle.Height + 60 / 30;
                int offsetMid = 100 / cot;
                for (int i = 0; i < MainRectangle.Height + 60; i += 30)
                {
                    int movesCount = 6;
                    float speed    = 700 * (10 + n) / 10F;
                    float weight   = 3;
                    int life       = Sec(10F);
                    int enterX;
                    int moveX;
                    if (Global.Rand.Next(100) > midRand)
                    {
                        enterX   = -50;
                        moveX    = 1000;
                        midRand += offsetMid;
                    }
                    else
                    {
                        enterX   = Width + 50;
                        moveX    = -1000;
                        midRand -= offsetMid;
                    }

                    MoveStraight moveObject = new MoveStraight(null, weight, speed, movesCount, 0, 1F);
                    moveObject.Target.SetOffsetByXY(moveX, 0);
                    DrawPolygon drawObject = new DrawPolygon(Color.Orchid, Color.Orchid, 2, 5, 0)
                    {
                        RotateEnabled = true
                    };
                    ObjectActive newObject = new ObjectActive(enterX, MainRectangle.Top + i - 20, 28, 28, life, LeagueType.Ememy1, ShapeType.Ellipse, drawObject, moveObject);
                    newObject.Propertys.Add(new PropertyRotate(-1, 780, false, true));
                    newObject.Propertys.Add(new PropertyDeadBrokenShaping(15, 6, 6, ObjectDeadType.Collision | ObjectDeadType.LifeEnd, 20, 100, 300, Sec(0.6F), Sec(1.2F)));
                    newObject.Propertys.Add(new PropertyCollision(1));
                    newObject.Propertys.Add(new PropertyShadow(2, 3));
                    newObject.Propertys.Add(new PropertyOutClear());
                    moveObject.Target.SetObject(newObject);
                    GameObjects.Add(newObject);
                    objects.Add(newObject);
                }
            });

            // 物件:序列 排列成直線的追捕者
            WaveEvents.Add("Series", (n) =>
            {
                Point enterPoint = GetEnterPoint();
                int size         = Global.Rand.Next(10, 12);
                int movesCount   = 6;
                float speed      = Global.Rand.Next(300, 400) * _SpeedFix;
                float weight     = 0.3F + size * 0.1F;
                int life         = Sec(6F * _LifeFix) + Global.Rand.Next(0, 5);

                ObjectActive target     = PlayerObject;
                ObjectActive lastObject = null;
                for (int i = 0; i < n; i++)
                {
                    MoveStraight moveObject = new MoveStraight(target, weight, speed, movesCount, 30, 1F);
                    ObjectActive newObject  = new ObjectActive(enterPoint.X, enterPoint.Y, size, size, life, LeagueType.Ememy1, ShapeType.Ellipse, new DrawBrush(Color.DarkOrange, ShapeType.Ellipse), moveObject);
                    newObject.Propertys.Add(new PropertyFreeze(Sec(i * 0.05F)));
                    newObject.Propertys.Add(new PropertyDeadBroken(15, 2, 2, ObjectDeadType.Collision, 40, 150, 400, Sec(0.5F), Sec(0.9F)));
                    newObject.Propertys.Add(new PropertyDeadCollapse(1, Sec(0.2F), Sec(0.01F), 2, 2, ObjectDeadType.LifeEnd, 50, 100, Sec(0.15F), Sec(0.25F)));
                    newObject.Propertys.Add(new PropertyCollision(1));
                    newObject.Propertys.Add(new PropertyShadow(2, 3));
                    GameObjects.Add(newObject);
                    target = newObject;
                    speed += 10;
                    life  -= 50;
                    if (lastObject != null)
                    {
                        lastObject.Dead += (x, e, t) =>
                        {
                            newObject.MoveObject.Target.SetObject((x as ObjectActive).MoveObject.Target.Object);
                        };
                    }
                    lastObject = newObject;
                }
            });

            // 物件:轟炸機
            WaveEvents.Add("Bomber", (n) =>
            {
                int roundIdx = Global.Rand.Next(4);
                for (int i = 0; i < n; i++)
                {
                    Point enterPoint = GetEnterPoint(roundIdx);
                    int size         = Global.Rand.Next(28, 34);
                    int movesCount   = 6;
                    float speed      = Global.Rand.Next(300, 380);
                    float weight     = 0.3F + size * 0.1F;
                    double angle     = Function.GetAngle(enterPoint.X, enterPoint.Y, MainRectangle.Left + MainRectangle.Width / 2, MainRectangle.Top + MainRectangle.Height / 2) + Global.Rand.Next(-20, 20);
                    int life         = Sec(10F);

                    MoveStraight moveObject = new MoveStraight(null, weight, speed, movesCount, 30, 1F);
                    DrawPic drawObject      = new DrawPic(Color.Black, Properties.Resources.Bomber, (float)angle);
                    drawObject.Colors.RFix  = 0.7F;
                    drawObject.Colors.BFix  = 0.5F;
                    //DrawPolygon drawObject = new DrawPolygon(Color.SlateBlue, Color.SlateBlue, 3, 1, (float)angle);
                    ObjectActive newObject = new ObjectActive(enterPoint.X, enterPoint.Y, size, size, life, LeagueType.Ememy1, ShapeType.Ellipse, drawObject, moveObject);
                    moveObject.Target.SetOffsetByAngle(angle, 1000);
                    moveObject.Target.SetObject(newObject);

                    newObject.Propertys.Add(new PropertyAlert(-1));
                    newObject.Propertys.Add(new PropertyDeadBroken(30, 2, 2, ObjectDeadType.Collision, 40, 150, 400, Sec(0.5F), Sec(0.9F)));
                    newObject.Propertys.Add(new PropertyCollision(10));
                    newObject.Propertys.Add(new PropertyShadow(4, 6));
                    newObject.Propertys.Add(new PropertyBomber(-1, Sec(0.2F), 3, 8, 8, 5, 80, Sec(1F), Sec(1.4F)));
                    newObject.Propertys.Add(new PropertyOutClear());
                    GameObjects.Add(newObject);
                    roundIdx = ++roundIdx % 4;
                }
            });

            // 物件:攔截者 不會加速 但速度會越來越快
            WaveEvents.Add("Blocker", (n) =>
            {
                int roundIdx = Global.Rand.Next(4);
                for (int i = 0; i < n; i++)
                {
                    int size         = Global.Rand.Next(14, 17);
                    int movesCount   = 2;
                    float weight     = 0.3F + size * 0.1F;
                    float speed      = 200 * _SpeedFix;
                    int life         = Sec(6F * _LifeFix) + Global.Rand.Next(0, 5);
                    Point enterPoint = GetEnterPoint(roundIdx);

                    MoveStraight moveObject = new MoveStraight(PlayerObject, weight, speed, movesCount, 100, 0.5F);
                    DrawPolygon drawObject  = new DrawPolygon(Color.Fuchsia, Color.Fuchsia, 3, 1, 0)
                    {
                        RotateEnabled = true, Resistance = weight
                    };
                    ObjectActive newObject = new ObjectActive(enterPoint.X, enterPoint.Y, size, size, life, LeagueType.Ememy1, ShapeType.Ellipse, drawObject, moveObject);
                    newObject.Propertys.Add(new PropertyRotate(-1, 360, false, false));
                    newObject.Propertys.Add(new PropertyDeadBroken(15, 2, 2, ObjectDeadType.Collision, 60, 150, 400, Sec(0.5F), Sec(0.9F)));
                    newObject.Propertys.Add(new PropertyDeadCollapse(1, Sec(0.6F), Sec(0.01F), 2, 2, ObjectDeadType.LifeEnd, 50, 100, Sec(0.15F), Sec(0.25F)));
                    newObject.Propertys.Add(new PropertyCollision(10));
                    newObject.Propertys.Add(new PropertySpeeded(-1, 100));
                    newObject.Propertys.Add(new PropertyShadow(2, 3));
                    GameObjects.Add(newObject);
                    roundIdx = ++roundIdx % 4;
                }
            });

            // 物件:地雷
            WaveEvents.Add("Mine", (n) =>
            {
                int roundIdx = Global.Rand.Next(4);
                for (int i = 0; i < n; i++)
                {
                    int size       = Global.Rand.Next(16, 20);
                    int movesCount = Global.Rand.Next(10, 15);
                    float speed    = Global.Rand.Next(200, 300);
                    float weight   = 0.3F + size * 0.1F;
                    int life       = Sec(4);

                    Point enterPoint = Point.Empty;
                    int targetX      = 0, targetY = 0;
                    switch (roundIdx)
                    {
                    case 0:
                        enterPoint = GetEnterPoint(DirectionType.Left);
                        targetX    = MainRectangle.Left + Global.Rand.Next(MainRectangle.Width / 2);
                        targetY    = MainRectangle.Top + Global.Rand.Next(MainRectangle.Height);
                        break;

                    case 1:
                        enterPoint = GetEnterPoint(DirectionType.Right);
                        targetX    = MainRectangle.Left + MainRectangle.Width / 2 + Global.Rand.Next(MainRectangle.Width / 2);
                        targetY    = MainRectangle.Top + Global.Rand.Next(MainRectangle.Height);
                        break;

                    case 2:
                        enterPoint = GetEnterPoint(DirectionType.Top);
                        targetX    = MainRectangle.Left + Global.Rand.Next(MainRectangle.Width);
                        targetY    = MainRectangle.Top + Global.Rand.Next(MainRectangle.Height / 2);
                        break;

                    case 3:
                        enterPoint = GetEnterPoint(DirectionType.Bottom);
                        targetX    = MainRectangle.Left + Global.Rand.Next(MainRectangle.Width);
                        targetY    = MainRectangle.Top + MainRectangle.Height / 2 + Global.Rand.Next(MainRectangle.Height / 2);
                        break;
                    }

                    MoveStraight moveObject = new MoveStraight(new PointObject(targetX, targetY), weight, speed, movesCount, 100, 0.5F);
                    DrawPic drawObject      = new DrawPic(Color.Black, Properties.Resources.Mine, 0)
                    {
                        RotateEnabled = true, Resistance = weight
                    };
                    ObjectActive newObject = new ObjectActive(enterPoint.X, enterPoint.Y, size, size, life, LeagueType.Ememy1, ShapeType.Ellipse, drawObject, moveObject);
                    newObject.Propertys.Add(new PropertyRotate(-1, 280, false, false));
                    newObject.Propertys.Add(new PropertyDeadExplosion(10, 0, 1, LeagueType.Chaos, Color.FromArgb(180, 225, 70, 40), 0.15F, 0.1F, 5, ObjectDeadType.Collision | ObjectDeadType.LifeEnd));
                    newObject.Propertys.Add(new PropertyCollision(1));
                    newObject.Propertys.Add(new PropertyShadow(2, 3));
                    GameObjects.Add(newObject);
                    roundIdx = ++roundIdx % 4;
                }
            });

            // 物件:分裂地雷
            WaveEvents.Add("MineSplit", (n) =>
            {
                int size       = Global.Rand.Next(28, 30);
                int movesCount = Global.Rand.Next(10, 15);
                float speed    = Global.Rand.Next(200, 300);
                float weight   = 0.3F + size * 0.1F;
                int life       = Sec(4);

                Point enterPoint = GetEnterPoint();
                int targetX      = MainRectangle.Left + MainRectangle.Width / 2 + Global.Rand.Next(-40, 40);
                int targetY      = MainRectangle.Top + MainRectangle.Height / 2 + Global.Rand.Next(-40, 40);

                MoveStraight moveObject = new MoveStraight(new PointObject(targetX, targetY), weight, speed, movesCount, 100, 0.5F);
                DrawPic drawObject      = new DrawPic(Color.Black, Properties.Resources.Mine, 0)
                {
                    RotateEnabled = true, Resistance = weight
                };
                drawObject.Colors.BFix = 0.5F;
                ObjectActive newObject = new ObjectActive(enterPoint.X, enterPoint.Y, size, size, life, LeagueType.Ememy1, ShapeType.Ellipse, drawObject, moveObject);
                newObject.Propertys.Add(new PropertyRotate(-1, 280, false, false));
                newObject.Propertys.Add(new PropertyDeadExplosion(10, 0, 1, LeagueType.None, Color.FromArgb(180, 225, 70, 40), 0.15F, 0.1F, 5, ObjectDeadType.Collision | ObjectDeadType.LifeEnd));
                newObject.Propertys.Add(new PropertyCollision(1));
                newObject.Propertys.Add(new PropertyShadow(2, 3));
                newObject.Dead += (x, e, t) =>
                {
                    float partAngle = 360F / n;
                    float baseAngle = Global.Rand.Next(360);
                    for (int i = 0; i < n; i++)
                    {
                        int size2                = Global.Rand.Next(16, 18);
                        float speed2             = Global.Rand.Next(150, 250);
                        float weight2            = 0.3F + size2 * 0.1F;
                        int life2                = Sec(1.5F);
                        MoveStraight moveObject2 = new MoveStraight(null, weight2, speed2, movesCount, 0, 1F);
                        moveObject2.Target.SetOffsetByAngle(baseAngle, 1000);
                        DrawPic drawObject2 = new DrawPic(Color.Black, Properties.Resources.Mine, 0)
                        {
                            RotateEnabled = true, Resistance = weight2
                        };
                        drawObject2.Colors.BFix = 0.5F;
                        ObjectActive newObject2 = new ObjectActive(x.Layout.CenterX, x.Layout.CenterY, size2, size2, life2, LeagueType.Ememy1, ShapeType.Ellipse, drawObject2, moveObject2);
                        newObject2.Propertys.Add(new PropertyRotate(-1, 280, false, false));
                        newObject2.Propertys.Add(new PropertyDeadExplosion(10, 0, 1, LeagueType.None, Color.FromArgb(180, 225, 70, 40), 0.15F, 0.1F, 5, ObjectDeadType.Collision | ObjectDeadType.LifeEnd));
                        newObject2.Propertys.Add(new PropertyCollision(1));
                        newObject2.Propertys.Add(new PropertyShadow(2, 3));
                        moveObject2.Target.SetObject(newObject2);

                        newObject2.Dead += (x2, e2, t2) =>
                        {
                            float baseAngle2 = Global.Rand.Next(360);
                            for (int j = 0; j < n; j++)
                            {
                                int size3                = Global.Rand.Next(8, 10);
                                float speed3             = Global.Rand.Next(150, 250);
                                float weight3            = 0.3F + size3 * 0.1F;
                                int life3                = Sec(1.5F);
                                MoveStraight moveObject3 = new MoveStraight(null, weight3, speed3, movesCount, 0, 1F);
                                moveObject3.Target.SetOffsetByAngle(baseAngle2, 1000);
                                DrawPic drawObject3 = new DrawPic(Color.Black, Properties.Resources.Mine, 0)
                                {
                                    RotateEnabled = true, Resistance = weight3
                                };
                                drawObject3.Colors.BFix = 0.5F;
                                ObjectActive newObject3 = new ObjectActive(x2.Layout.CenterX, x2.Layout.CenterY, size3, size3, life3, LeagueType.Ememy1, ShapeType.Ellipse, drawObject3, moveObject3);
                                newObject3.Propertys.Add(new PropertyRotate(-1, 280, false, false));
                                newObject3.Propertys.Add(new PropertyDeadExplosion(10, 0, 1, LeagueType.None, Color.FromArgb(180, 225, 70, 40), 0.15F, 0.1F, 5, ObjectDeadType.Collision | ObjectDeadType.LifeEnd));
                                newObject3.Propertys.Add(new PropertyCollision(1));
                                newObject3.Propertys.Add(new PropertyShadow(2, 3));
                                moveObject3.Target.SetObject(newObject2);
                                GameObjects.Add(newObject3);
                                baseAngle2 += partAngle;
                            }
                        };

                        GameObjects.Add(newObject2);
                        baseAngle += partAngle;
                    }
                };
                GameObjects.Add(newObject);
            });
        }
Exemplo n.º 3
0
        /// <summary>
        /// 技能生效
        /// </summary>
        public override void DoBeforeAction()
        {
            switch (Status)
            {
            case SkillStatus.Enabled:
            {
                if (Owner == null)
                {
                    Break();
                    return;
                }

                int effectWidth  = Owner.Layout.RectWidth + 12;
                int effectHeight = Owner.Layout.RectHeight + 12;
                effectWidth  += effectWidth % 2;
                effectHeight += effectHeight % 2;

                Color       color      = Owner.DrawObject.MainColor;
                Color       colorBack  = Color.FromArgb(50, color);
                DrawPolygon drawShield = new DrawPolygon(colorBack, color, 6, 1, 0)
                {
                    RotateEnabled = true
                };
                DrawPolygon drawScrap = new DrawPolygon(Color.Empty, color, 2, 1, 0)
                {
                    RotateEnabled = true
                };
                _ShieldObject = new ObjectActive(0, 0, effectWidth, effectHeight, -1, Owner.League, ShapeType.Ellipse, drawShield, MoveNull.Value);

                _ShieldObject.Propertys.Add(new PropertyRotate(-1, Global.Rand.Next(-360, 360), false, true));
                _ShieldObject.Propertys.Add(new PropertyDeadBroken(drawScrap, 6, 10, 10, ObjectDeadType.Collision, 360, 100, 150, Scene.Sec(0.4F), Scene.Sec(0.6F)));
                _ShieldObject.Propertys.Add(new PropertyDeadCollapse(drawScrap, 3, Scene.Sec(0.2F), Scene.Sec(0.05F), 10, 10, ObjectDeadType.LifeEnd, 100, 200, Scene.Sec(0.2F), Scene.Sec(0.3F)));
                _ShieldObject.Propertys.Add(new PropertyCollision(1));
                _ShieldObject.Layout.Depend.SetObject(Owner);
                Owner.Container.Add(_ShieldObject);

                _MiniBar       = new PropertyUI(-1, new Size(30, 6), new DrawUICounterBar(_BarColor, Color.Black, Color.White, 1, true, Channeled));
                _MiniBar.Affix = SpecialStatus.Ghost;           // 增加幽靈屬性

                Owner.Propertys.Add(_MiniBar);
                Status = SkillStatus.Channeled;
            }
            break;

            case SkillStatus.Channeled:
                if (_ShieldObject.Status != ObjectStatus.Alive)
                {
                    if (_ShieldObject.Life.Value < Scene.Sec(0.3F))
                    {
                        SceneGaming scene = Scene as SceneGaming;
                        if (scene != null)
                        {
                            scene.AddScoreToPlayer("千鈞一髮", 800);
                        }
                    }
                    this.Break();
                }
                break;
            }
            base.DoBeforeAction();
        }
Exemplo n.º 4
0
        public SceneDisco()
        {
            InitializeComponent();

            // 場景:畫面變黑暗
            WaveEvents.Add("@Dark", (n) =>
            {
                EffectObjects.Add(new EffectDyeing(Color.Black, Wave(0.1F), Wave(Math.Max(n, 0)), Wave(0.1F)));
            });

            // 場景:邊界縮小
            WaveEvents.Add("@Shrink", (n) =>
            {
                double scaleX = Global.Rand.NextDouble();
                double scaleY = 1 - scaleX;

                int limitX     = (int)(scaleX * MainRectangle.Width * 0.4F);
                int limitY     = (int)(scaleY * MainRectangle.Height * 0.4F);
                int limitLeft  = Global.Rand.Next(0, limitX);
                int limitTop   = Global.Rand.Next(0, limitY);
                int limitRight = limitX - limitLeft;
                int limitDown  = limitY - limitTop;

                Padding shrinkPerRound = new Padding(limitLeft, limitTop, limitRight, limitDown);
                EffectObjects.Add(new EffectShrink(shrinkPerRound, Wave(0.1F), Wave(Math.Max(n, 0)), Wave(0.1F)));
            });

            // 物件:追捕者
            WaveEvents.Add("Catcher", (n) =>
            {
                int roundIdx = Global.Rand.Next(4);
                for (int i = 0; i < n; i++)
                {
                    int size         = Global.Rand.Next(9, 11);
                    int offsetLimit  = 10;
                    float speed      = Global.Rand.Next(200, 240) * _SpeedFix;
                    float weight     = 0.3F + size * 0.1F;
                    int life         = Sec(6F * _LifeFix) + Global.Rand.Next(0, 5);
                    Point enterPoint = GetEnterPoint(roundIdx);

                    MoveFrog moveObject    = new MoveFrog(PlayerObject, weight, speed, offsetLimit, Sec(1F));
                    ObjectActive newObject = new ObjectActive(enterPoint.X, enterPoint.Y, size, size, life, LeagueType.Ememy1, ShapeType.Ellipse, new DrawBrush(Color.Red, ShapeType.Ellipse), moveObject);
                    newObject.Propertys.Add(new PropertyDeadBroken(15, 2, 2, ObjectDeadType.Collision, 20, 150, 400, Sec(0.5F), Sec(0.9F)));
                    newObject.Propertys.Add(new PropertyDeadCollapse(1, Sec(0.6F), Sec(0.01F), 2, 2, ObjectDeadType.LifeEnd, 50, 100, Sec(0.15F), Sec(0.25F)));
                    newObject.Propertys.Add(new PropertyCollision(1));
                    newObject.Propertys.Add(new PropertyShadow(2, 3));
                    GameObjects.Add(newObject);
                    roundIdx = ++roundIdx % 4;
                }
            });

            // 物件:快速追捕者 移動間格減半
            WaveEvents.Add("Faster", (n) =>
            {
                int roundIdx = Global.Rand.Next(4);
                for (int i = 0; i < n; i++)
                {
                    int size         = Global.Rand.Next(6, 8);
                    int offsetLimit  = 10;
                    float speed      = Global.Rand.Next(275, 320) * _SpeedFix;
                    float weight     = 0.3F + size * 0.1F;
                    int life         = Sec(4.5F * _LifeFix) + Global.Rand.Next(0, 5);
                    Point enterPoint = GetEnterPoint(roundIdx);

                    MoveFrog moveObject    = new MoveFrog(PlayerObject, weight, speed, offsetLimit, Sec(0.5F));
                    ObjectActive newObject = new ObjectActive(enterPoint.X, enterPoint.Y, size, size, life, LeagueType.Ememy1, ShapeType.Ellipse, new DrawBrush(Color.Blue, ShapeType.Ellipse), moveObject);
                    newObject.Propertys.Add(new PropertyDeadBroken(15, 2, 2, ObjectDeadType.Collision, 20, 150, 400, Sec(0.5F), Sec(0.9F)));
                    newObject.Propertys.Add(new PropertyDeadCollapse(1, Sec(0.6F), Sec(0.01F), 2, 2, ObjectDeadType.LifeEnd, 50, 100, Sec(0.15F), Sec(0.25F)));
                    newObject.Propertys.Add(new PropertyCollision(1));
                    newObject.Propertys.Add(new PropertyShadow(2, 3));
                    GameObjects.Add(newObject);
                    roundIdx = ++roundIdx % 4;
                }
            });

            // 物件:蜻蜓 固定方向且會左右擺動
            WaveEvents.Add("Dragonfly", (n) =>
            {
                for (int i = 0; i < n; i++)
                {
                    int size         = Global.Rand.Next(14, 18);
                    int offsetLimit  = 10;
                    float speed      = Global.Rand.Next(220, 260) * _SpeedFix;
                    float weight     = 0.3F + size * 0.1F;
                    int life         = -1;
                    Point enterPoint = GetEnterPoint(DirectionType.Right);

                    MoveFrog moveObject    = new MoveFrog(null, weight, speed, offsetLimit, Sec(1F));
                    DrawPolygon drawObject = new DrawPolygon(Color.BlueViolet, Color.BlueViolet, 3, 0, 0)
                    {
                        RotateEnabled = true
                    };
                    ObjectActive newObject = new ObjectActive(enterPoint.X, enterPoint.Y, size, size, life, LeagueType.Ememy1, ShapeType.Ellipse, drawObject, moveObject);
                    newObject.Propertys.Add(new PropertyDeadBroken(15, 2, 2, ObjectDeadType.Collision, 20, 150, 400, Sec(0.5F), Sec(0.9F)));
                    newObject.Propertys.Add(new PropertyDeadCollapse(1, Sec(0.6F), Sec(0.01F), 2, 2, ObjectDeadType.LifeEnd, 50, 100, Sec(0.15F), Sec(0.25F)));
                    newObject.Propertys.Add(new PropertyCollision(1));
                    newObject.Propertys.Add(new PropertyShadow(2, 3));
                    newObject.Propertys.Add(new PropertyOutClear());
                    newObject.Propertys.Add(new PropertyDelay(Sec(0.5F), new PropertyDrunken(-1, Sec(1F), -45, 45, Global.Rand.Next(2) == 0 ? 100 : -100)));
                    newObject.Propertys.Add(new PropertyRotateTarget(-1, 400, true));
                    moveObject.Target.SetObject(newObject);
                    moveObject.Target.SetOffsetByXY(-1000, 0);
                    GameObjects.Add(newObject);
                }
            });

            // 物件:水平牆壁
            WaveEvents.Add("WallA", (n) =>
            {
                List <ObjectActive> objects = new List <ObjectActive>();
                for (int i = 0; i < MainRectangle.Height + 60; i += 30)
                {
                    int movesCount      = 6;
                    float speed         = 300 * (10 + n) / 10F;
                    float weight        = 3;
                    int life            = -1;
                    MoveFrog moveObject = new MoveFrog(null, weight, speed, movesCount, Sec(1));
                    moveObject.Target.SetOffsetByXY(1000F, 0);
                    DrawBrush drawObject = new DrawBrush(Color.Orchid, ShapeType.Rectangle)
                    {
                        RotateEnabled = false
                    };
                    ObjectActive newObject = new ObjectActive(-50, MainRectangle.Top + i - 20, 5, 28, life, LeagueType.Ememy1, ShapeType.Ellipse, drawObject, moveObject);
                    newObject.Propertys.Add(new PropertyDeadBrokenShaping(15, 6, 6, ObjectDeadType.Collision | ObjectDeadType.LifeEnd, 20, 100, 300, Sec(0.6F), Sec(1.2F)));
                    newObject.Propertys.Add(new PropertyCollision(1));
                    newObject.Propertys.Add(new PropertyShadow(2, 3));
                    newObject.Propertys.Add(new PropertyOutClear());
                    moveObject.Target.SetObject(newObject);
                    GameObjects.Add(newObject);
                    objects.Add(newObject);
                }

                int clearCount = 2;
                int clearIndex = Global.Rand.Next(1, objects.Count - 2 - clearCount + 1);
                for (int i = 0; i < clearCount; i++)
                {
                    objects[clearIndex + i].Kill(null, ObjectDeadType.Clear);
                }
            });

            // 物件:箭雨(水平)
            WaveEvents.Add("Arrow", (n) =>
            {
                int baseTop = Global.Rand.Next(MainRectangle.Top - 20, MainRectangle.Top + MainRectangle.Height + 20 - ((n - 1) * 30));
                for (int i = 0; i < n; i++)
                {
                    int movesCount          = 12;
                    float weight            = 3;
                    int life                = -1;// Sec(10F);
                    MoveStraight moveObject = new MoveStraight(null, weight, 500, movesCount, 0, 1F);
                    moveObject.Target.SetOffsetByXY(1000F, 0);
                    DrawPolygon drawObject = new DrawPolygon(Color.Orchid, Color.Empty, 3, 1, 90F)
                    {
                        RotateEnabled = false
                    };
                    ObjectActive newObject = new ObjectActive(-30, baseTop, 25, 25, life, LeagueType.Ememy1, ShapeType.Ellipse, drawObject, moveObject);
                    newObject.Skills.Add(new SkillSprint(0, Sec(1F), 0, (int)(400000), false)
                    {
                        AutoCastObject = new AutoCastNormal(100), Status = SkillStatus.Cooldown
                    });
                    newObject.Propertys.Add(new PropertySpeeded(Sec(1F), -300));
                    newObject.Propertys.Add(new PropertyDeadBrokenShaping(15, 6, 6, ObjectDeadType.Collision | ObjectDeadType.LifeEnd, 20, 100, 300, Sec(0.6F), Sec(1.2F)));
                    newObject.Propertys.Add(new PropertyCollision(1));
                    newObject.Propertys.Add(new PropertyShadow(2, 3));
                    newObject.Propertys.Add(new PropertyOutClear());
                    moveObject.Target.SetObject(newObject);

                    GameObjects.Add(newObject);
                    baseTop += 30;
                }
            });

            // 物件:炸彈陣列
            WaveEvents.Add("BoomGrid", (n) =>
            {
                List <ObjectActive> objects = new List <ObjectActive>();
                for (int i = 0; i < MainRectangle.Height + 60; i += 120)
                {
                    int movesCount      = 6;
                    float speed         = 300 * (10 + n) / 10F;
                    float weight        = 3;
                    int life            = -1;
                    MoveFrog moveObject = new MoveFrog(null, weight, speed, movesCount, Sec(1));
                    moveObject.Target.SetOffsetByXY(1000F, 0);
                    DrawBrush drawObject = new DrawBrush(Color.Orchid, ShapeType.Rectangle)
                    {
                        RotateEnabled = false
                    };
                    ObjectActive newObject = new ObjectActive(-50, MainRectangle.Top + i - 20, 5, 28, life, LeagueType.Ememy1, ShapeType.Ellipse, drawObject, moveObject);
                    newObject.Propertys.Add(new PropertyDeadBrokenShaping(15, 6, 6, ObjectDeadType.Collision | ObjectDeadType.LifeEnd, 20, 100, 300, Sec(0.6F), Sec(1.2F)));
                    newObject.Propertys.Add(new PropertyCollision(1));
                    newObject.Propertys.Add(new PropertyShadow(2, 3));
                    newObject.Propertys.Add(new PropertyOutClear());
                    moveObject.Target.SetObject(newObject);
                    GameObjects.Add(newObject);
                    objects.Add(newObject);
                }

                int clearCount = 2;
                int clearIndex = Global.Rand.Next(1, objects.Count - 2 - clearCount + 1);
                for (int i = 0; i < clearCount; i++)
                {
                    objects[clearIndex + i].Kill(null, ObjectDeadType.Clear);
                }
            });
        }