Exemplo n.º 1
0
            /// <summary>
            /// Arrange the individual children
            /// </summary>
            /// <param name="index"></param>
            /// <param name="child"></param>
            /// <param name="finalSize"></param>
            public static (int, int, Rect) GetChildRect(Coordinate coordinate, Size childSize, Size totalSize, int rows, int columns, CircleRegion region)
            {
                var(row, column) = region switch
                {
                    CircleRegion.Left => (coordinate.Y, coordinate.X),
                    CircleRegion.Right => (coordinate.Y, coordinate.X),
                    CircleRegion.Top => (coordinate.X, coordinate.Y),
                    CircleRegion.Bottom => (coordinate.X, coordinate.Y),
                };

                Point center = new Point(totalSize.Width / 2, totalSize.Height / 2);

                var offSetFactor = ((columns) / 2d);

                var(xPosition, yPosition) = region switch
                {
                    CircleRegion.Left => (column * childSize.Width, center.Y + (row - offSetFactor) * childSize.Height),
                    CircleRegion.Right => (totalSize.Width - ((column + 1) * childSize.Width), center.Y + (row - offSetFactor) * childSize.Height),
                    CircleRegion.Top => (center.X + (column - offSetFactor) * childSize.Width, row *childSize.Height),
                    CircleRegion.Bottom => (center.X + (column - offSetFactor) * childSize.Width, totalSize.Height - ((row + 1) * childSize.Height)),
                };

                // Debug.WriteLine("x:" + xPosition + distance.X + " y:" + yPosition + distance.Y);

                return(row, column, new Rect(
                           xPosition,
                           yPosition, childSize.Width, childSize.Height));
            }
Exemplo n.º 2
0
 public override bool Update(float dt)
 {
     if (Movement.Update(dt))
     {
         //普攻伤害
         if (damage > 0)
         {
             if (isAttack)
             {
                 Target.removeExpectedDamage(damage);
             }
             Target.LostHP(damage, Shooter, damageType, isAttack);
         }
         //给目标上buff
         if (buffs != null)
         {
             for (int i = 0; i < buffs.Length; ++i)
             {
                 Target.AddBuff(buffs[i], Shooter);
             }
         }
         //AOE
         if (aoeRadius > 0)
         {
             AoeRegion region = new CircleRegion(BattleInterface.Instance.world, position.x, position.y, aoeRadius);
             AoeField  aoe    = new AoeField(Shooter, region, duration, interval, emitters);
             BattleInterface.Instance.AddAoeField(aoe);
         }
         return(true);
     }
     return(false);
 }
Exemplo n.º 3
0
 public ChildSizer(int columns, int rows, Size totalSize, CircleRegion region)
 {
     this.columns   = columns;
     this.rows      = rows;
     this.totalSize = totalSize;
     this.region    = region;
 }
Exemplo n.º 4
0
        public static ISizer Create(Vector size = default, CircleRegion circleRegion = CircleRegion.TopLeft, int offSetCount = 1)
        {
            switch (circleRegion)
            {
            case CircleRegion.Bottom:
                return(new YAxisSizer(size, offSetCount, -1));

            case CircleRegion.Top:
                return(new YAxisSizer(size, offSetCount));

            case CircleRegion.Right:
                return(new XAxisSizer(size, offSetCount, -1));

            case CircleRegion.Left:
                return(new XAxisSizer(size, offSetCount));

            case CircleRegion.TopRight:
                return(new SizerUtility(new XYOrganiser <Vector>(), -1, 1));

            case CircleRegion.BottomRight:
                return(new SizerUtility(new XYOrganiser <Vector>(), -1, -1));

            case CircleRegion.BottomLeft:
                return(new SizerUtility(new XYOrganiser <Vector>(), 1, -1));

            case CircleRegion.TopLeft:
                return(new SizerUtility(new XYOrganiser <Vector>(), 1, 1));

            case CircleRegion.Middle:
                return(new SizerUtility(new XYOrganiser <Vector>(), 0, 0));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Exemplo n.º 5
0
        private static Vector GetSizeAdjustment(CircleRegion region, Size size)
        {
            var width  = -size.Width / 2;
            var height = -size.Height / 2;

            return(new Vector(width, height));
        }
Exemplo n.º 6
0
        /// <summary>
        /// Writes the attached property Dock to the given element.
        /// </summary>
        /// <param name="element">UIElement to which to write the attached property.</param>
        /// <param name="dock">The property value to set</param>
        /// <seealso cref="CircleRegionProperty" />
        public static void SetCircleRegion(UIElement element, CircleRegion dock)
        {
            if (element == null)
            {
                throw new ArgumentNullException("element");
            }

            element.SetValue(CircleRegionProperty, dock);
        }
Exemplo n.º 7
0
 public override bool Update(float dt)
 {
     if (Movement.Update(dt))
     {
         //AOE
         if (aoeRadius > 0)
         {
             AoeRegion region = new CircleRegion(BattleInterface.Instance.world, position.x, position.y, aoeRadius);
             AoeField  aoe    = new AoeField(Shooter, region, duration, interval, emitters);
             BattleInterface.Instance.AddAoeField(aoe);
         }
         return(true);
     }
     return(false);
 }
Exemplo n.º 8
0
        public Vector GetIndividualSize(CircleRegion region, Sizing sizingHeight, Sizing sizingWidth)
        {
            //var h = sizingHeight == Sizing.FromParent;
            //var w = sizingWidth == Sizing.FromParent;

            return(region switch
            {
                CircleRegion.TopLeft => new Vector(leftRequiredWidth, topRequiredHeight),
                CircleRegion.TopRight => new Vector(rightRequiredWidth, topRequiredHeight),
                CircleRegion.BottomRight => new Vector(rightRequiredWidth, bottomRequiredHeight),
                CircleRegion.BottomLeft => new Vector(leftRequiredWidth, bottomRequiredHeight),

                CircleRegion.Top => new Vector(centerRequiredWidth, topRequiredHeight),
                CircleRegion.Bottom => new Vector(centerRequiredWidth, bottomRequiredHeight),

                CircleRegion.Right => new Vector(rightRequiredWidth, middleRequiredHeight),
                CircleRegion.Left => new Vector(leftRequiredWidth, middleRequiredHeight),

                CircleRegion.Middle => new Vector(centerRequiredWidth, middleRequiredHeight),
                _ => throw new NotImplementedException(),
            });
Exemplo n.º 9
0
        public override bool Update(float dt)
        {
            float x = position.x;
            float y = position.y;

            if (Movement.Update(dt))
            {
                //AOE
                if (aoeRadius > 0)
                {
                    AoeRegion region = new CircleRegion(BattleInterface.Instance.world, position.x, position.y, aoeRadius);
                    AoeField  aoe    = new AoeField(Shooter, region, duration, interval, emitters);
                    BattleInterface.Instance.AddAoeField(aoe);
                }
                return(true);
            }
            else
            {
                var shift = speed * dt;

                List <UnitBase> res = new List <UnitBase>();
                BattleInterface.Instance.world.SelectRect(x, y, Movement.shift.x, Movement.shift.y, this.radius * 2, shift, res, (obj) => obj.CampID != Shooter.CampID);

                if (res.Count > 0)
                {
                    if (this.decayScale > 0)
                    {
                        res.Sort((a, b) =>
                        {
                            float da_x = a.position.x - x;
                            float da_y = a.position.y - y;
                            float db_x = b.position.x - x;
                            float db_y = b.position.y - y;
                            float da   = da_x * da_x + da_y * da_y;
                            float db   = db_x * db_x + db_y * db_y;
                            return(da.CompareTo(db));
                        });
                        for (int i = 0; i < res.Count; ++i)
                        {
                            //普攻伤害
                            var rd = (int)(damage * this.damageScale);
                            if (rd > 0)
                            {
                                res[i].LostHP(rd, Shooter, damageType, true);
                            }
                            //给目标上buff
                            if (buffs != null)
                            {
                                for (int n = 0; n < buffs.Length; ++n)
                                {
                                    res[i].AddBuff(buffs[n], Shooter);
                                }
                            }
                            this.damageScale *= (1 - this.decayScale);
                        }
                    }
                    else
                    {
                        for (int i = 0; i < res.Count; ++i)
                        {
                            //普攻伤害
                            if (damage > 0)
                            {
                                res[i].LostHP(damage, Shooter, damageType, isAttack);
                            }
                            //给目标上buff
                            if (buffs != null)
                            {
                                for (int n = 0; n < buffs.Length; ++n)
                                {
                                    res[i].AddBuff(buffs[n], Shooter);
                                }
                            }
                        }
                    }
                }
            }
            return(false);
        }
Exemplo n.º 10
0
        public override bool Update(float dt)
        {
            float x = position.x;
            float y = position.y;

            if (Movement.Update(dt))
            {
                //AOE
                if (aoeRadius > 0)
                {
                    AoeRegion region = new CircleRegion(BattleInterface.Instance.world, position.x, position.y, aoeRadius);
                    AoeField  aoe    = new AoeField(Shooter, region, duration, interval, emitters);
                    BattleInterface.Instance.AddAoeField(aoe);
                }
                return(true);
            }
            else
            {
                var shift = speed * dt;

                BattleInterface.Instance.world.SelectRect(x, y, Movement.shift.x, Movement.shift.y, this.radius * 2, shift, res, (obj) => obj.CampID != Shooter.CampID);

                if (res.Count > 0)
                {
                    UnitBase unit    = null;
                    float    sqr_dis = 0;
                    for (int i = 0; i < res.Count; ++i)
                    {
                        float dx       = res[i].position.x - x;
                        float dy       = res[i].position.y - y;
                        var   _sqr_dis = dx * dx + dy * dy;
                        if (unit == null || _sqr_dis < sqr_dis)
                        {
                            unit    = res[i];
                            sqr_dis = _sqr_dis;
                        }
                    }
                    //普攻伤害
                    if (damage > 0)
                    {
                        unit.LostHP(damage, Shooter, damageType, isAttack);
                    }
                    //给目标上buff
                    if (buffs != null)
                    {
                        for (int i = 0; i < buffs.Length; ++i)
                        {
                            unit.AddBuff(buffs[i], Shooter);
                        }
                    }
                    //AOE
                    if (aoeRadius > 0)
                    {
                        AoeRegion region = new CircleRegion(BattleInterface.Instance.world, position.x, position.y, aoeRadius);
                        AoeField  aoe    = new AoeField(Shooter, region, duration, interval, emitters);
                        BattleInterface.Instance.AddAoeField(aoe);
                    }
                    return(true);
                }
            }
            return(false);
        }