public void SetPositionWithPoint()
        {
            var start = new PointF(0, 0);
            var end   = new PointF(5.1f, 3.66f);

            Assert.AreEqual(start, _position.Position);
            _position.SetPosition(end);
            Assert.AreEqual(end, _position.Position);
        }
        public void Collision_FloatingPointError_StillWorks()
        {
            var hitbox = new CollisionBox(-7.5f, -9f, 15, 21);

            hitbox.Name        = "Test";
            hitbox.Environment = true;
            hitbox.PushAway    = true;
            _position.SetPosition(5f, 115.999992f);
            _collision.AddBox(hitbox);
            _collision.Message(new HitBoxMessage(EntityMock.Object, new List <CollisionBox>(), new HashSet <string>()
            {
                "Test"
            }, false));

            var layer = new Mock <IScreenLayer>();

            layer.SetupGet(l => l.Stage).Returns(Container);

            var tileset = new Common.Tileset()
            {
                TileSize = 16
            };
            var backTile    = new Common.Tile(1, new Common.TileSprite(tileset));
            var blankSquare = new MapSquare(layer.Object, backTile, 0, 0, 16);

            Screen.Setup(s => s.SquareAt(It.IsAny <float>(), It.IsAny <float>())).Returns(blankSquare);


            var blockTile = new Common.Tile(2, new Common.TileSprite(tileset));

            blockTile.Properties = new Common.TileProperties()
            {
                Blocking = true
            };
            var blockSquare = new MapSquare(layer.Object, blockTile, 0, 8, 16);

            Screen.Setup(s => s.SquareAt(It.IsInRange <float>(0, 16, Range.Inclusive), It.IsInRange <float>(128, 144, Range.Inclusive))).Returns(blockSquare);

            Assert.IsFalse(_collision.BlockBottom);

            Container.Tick();

            Assert.IsTrue(_collision.BlockBottom);

            Container.Tick();

            Assert.IsTrue(_collision.BlockBottom);

            Container.Tick();

            Assert.IsTrue(_collision.BlockBottom);
        }
Beispiel #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);
        }