Esempio n. 1
0
        private void WriteAxis(PositionEffectAxisInfo axis, XmlWriter writer)
        {
            if (axis.Base.HasValue)
            {
                writer.WriteAttributeString("base", axis.Base.Value.ToString());
            }
            else
            {
                writer.WriteAttributeString("base", "Inherit");
            }

            if (axis.Offset.HasValue)
            {
                writer.WriteAttributeString("offset", axis.Offset.Value.ToString());
                writer.WriteAttributeString("direction", axis.OffsetDirection.ToString());
            }
        }
        private PositionEffectAxisInfo ParsePositionBehavior(PositionEffectPartInfo info, XElement prop)
        {
            var axisInfo = new PositionEffectAxisInfo();

            XAttribute baseAttr = prop.Attribute("base");

            if (baseAttr != null)
            {
                if (baseAttr.Value == "Inherit")
                {
                    axisInfo.Base = null;
                }
                else
                {
                    axisInfo.Base = prop.TryAttribute <float>("base");
                }
            }

            axisInfo.BaseVar = prop.TryAttribute <string>("baseVar");

            if (prop.Attribute("offset") != null)
            {
                axisInfo.Offset = prop.TryAttribute <float?>("offset");

                try
                {
                    axisInfo.OffsetDirection = prop.GetAttribute <OffsetDirection>("direction");
                } catch
                {
                    throw new GameXmlException(prop, "Position offset direction was not valid!");
                }
            }

            axisInfo.OffsetVar = prop.TryAttribute <string>("offsetVar");

            return(axisInfo);
        }
Esempio n. 3
0
        private Effect ParsePositionBehavior(PositionEffectAxisInfo axisInfo, Axis axis)
        {
            Effect action = e => { };

            var baseVar   = axisInfo.BaseVar;
            var offsetVar = axisInfo.OffsetVar;

            if (baseVar != null)
            {
                if (axis == Axis.X)
                {
                    action = entity => {
                        var x = CheckNumericVar(entity, baseVar);
                        if (x.HasValue)
                        {
                            PositionComponent pos = entity.GetComponent <PositionComponent>();
                            if (pos != null)
                            {
                                pos.SetPosition(new PointF(x.Value, pos.Position.Y));
                            }
                        }
                    }
                }
                ;
                else
                {
                    action = entity => {
                        var y = CheckNumericVar(entity, baseVar);
                        if (y.HasValue)
                        {
                            PositionComponent pos = entity.GetComponent <PositionComponent>();
                            if (pos != null)
                            {
                                pos.SetPosition(new PointF(pos.Position.X, y.Value));
                            }
                        }
                    }
                };
            }
            else if (axisInfo.Base == null)
            {
                action = entity => {
                    PositionComponent pos = entity.GetComponent <PositionComponent>();
                    if (pos != null && entity.Parent != null)
                    {
                        PositionComponent parentPos = entity.Parent.GetComponent <PositionComponent>();
                        if (parentPos != null)
                        {
                            pos.SetPosition(axis == Axis.X
                                ? new PointF(parentPos.Position.X, pos.Position.Y)
                                : new PointF(pos.Position.X, parentPos.Position.Y));
                        }
                    }
                };
            }
            else
            {
                if (axis == Axis.X)
                {
                    action = entity =>
                    {
                        PositionComponent pos = entity.GetComponent <PositionComponent>();
                        if (pos != null)
                        {
                            pos.SetPosition(new PointF(axisInfo.Base.Value, pos.Position.Y));
                        }
                    }
                }
                ;
                else
                {
                    action = entity =>
                    {
                        PositionComponent pos = entity.GetComponent <PositionComponent>();
                        if (pos != null)
                        {
                            pos.SetPosition(new PointF(pos.Position.X, axisInfo.Base.Value));
                        }
                    }
                };
            }

            if (axisInfo.Offset != null || offsetVar != null)
            {
                switch (axisInfo.OffsetDirection)
                {
                case OffsetDirection.Inherit:
                    action += entity => {
                        var offset            = axisInfo.Offset ?? CheckNumericVar(entity, offsetVar) ?? 0;
                        PositionComponent pos = entity.GetComponent <PositionComponent>();
                        if (pos != null && entity.Parent != null)
                        {
                            Direction offdir = entity.Parent.Direction;
                            switch (offdir)
                            {
                            case Direction.Down: pos.SetPosition(new PointF(pos.Position.X, pos.Position.Y + offset)); break;

                            case Direction.Up: pos.SetPosition(new PointF(pos.Position.X, pos.Position.Y - offset)); break;

                            case Direction.Left: pos.SetPosition(new PointF(pos.Position.X - offset, pos.Position.Y)); break;

                            case Direction.Right: pos.SetPosition(new PointF(pos.Position.X + offset, pos.Position.Y)); break;
                            }
                        }
                    };
                    break;

                case OffsetDirection.Input:
                    action += entity => {
                        var offset              = axisInfo.Offset ?? CheckNumericVar(entity, offsetVar) ?? 0;
                        PositionComponent pos   = entity.GetComponent <PositionComponent>();
                        InputComponent    input = entity.GetComponent <InputComponent>();
                        if (input != null && pos != null)
                        {
                            if (axis == Axis.Y)
                            {
                                if (input.Down)
                                {
                                    pos.SetPosition(new PointF(pos.Position.X, pos.Position.Y + offset));
                                }
                                else if (input.Up)
                                {
                                    pos.SetPosition(new PointF(pos.Position.X, pos.Position.Y - offset));
                                }
                            }
                            else
                            {
                                if (input.Left)
                                {
                                    pos.SetPosition(new PointF(pos.Position.X - offset, pos.Position.Y));
                                }
                                else if (input.Right || (!input.Up && !input.Down))
                                {
                                    pos.SetPosition(new PointF(pos.Position.X + offset, pos.Position.Y));
                                }
                            }
                        }
                    };
                    break;

                case OffsetDirection.Left:
                    action += entity =>
                    {
                        var offset            = axisInfo.Offset ?? CheckNumericVar(entity, offsetVar) ?? 0;
                        PositionComponent pos = entity.GetComponent <PositionComponent>();
                        if (pos != null)
                        {
                            pos.SetPosition(new PointF(pos.Position.X - offset, pos.Position.Y));
                        }
                    };
                    break;

                case OffsetDirection.Right:
                    action += entity =>
                    {
                        var offset            = axisInfo.Offset ?? CheckNumericVar(entity, offsetVar) ?? 0;
                        PositionComponent pos = entity.GetComponent <PositionComponent>();
                        if (pos != null)
                        {
                            pos.SetPosition(new PointF(pos.Position.X + offset, pos.Position.Y));
                        }
                    };
                    break;

                case OffsetDirection.Down:
                    action += entity =>
                    {
                        var offset            = axisInfo.Offset ?? CheckNumericVar(entity, offsetVar) ?? 0;
                        PositionComponent pos = entity.GetComponent <PositionComponent>();
                        if (pos != null)
                        {
                            pos.SetPosition(new PointF(pos.Position.X, pos.Position.Y + offset));
                        }
                    };
                    break;

                case OffsetDirection.Up:
                    action += entity =>
                    {
                        var offset            = axisInfo.Offset ?? CheckNumericVar(entity, offsetVar) ?? 0;
                        PositionComponent pos = entity.GetComponent <PositionComponent>();
                        if (pos != null)
                        {
                            pos.SetPosition(new PointF(pos.Position.X, pos.Position.Y - offset));
                        }
                    };
                    break;
                }
            }
            return(action);
        }