Esempio n. 1
0
        //true of moved, false if not
        public static bool MoveWithCollisionCheck(Vector2 offset, Player player, Map map)
        {
            var tempPlayer = (Player)player.Clone();

            tempPlayer.X += offset.X;
            tempPlayer.Y += offset.Y;

            var tempPlayerRect = GetPlayerRectangle(tempPlayer);

            for (int i = 0; i < map.MapData.Count; i++)
            {
                for (int j = 0; j < map.MapData[i].Count; j++)
                {
                    if (map.MapData[i][j].Intersects(tempPlayerRect, j, i))
                    {
                        return(false);
                    }
                }
            }
            if (tempPlayer.Y + Player.Height > Map.TileSize * (int)map.MapSize)
            {
                return(false);
            }
            if (tempPlayer.Y < 0)
            {
                return(false);
            }
            if (tempPlayer.X + Player.Width > Map.TileSize * (int)map.MapSize)
            {
                return(false);
            }
            if (tempPlayer.X < 0)
            {
                return(false);
            }

            player.X += offset.X;
            player.Y += offset.Y;
            return(true);
        }
        //true if moved full distance, false if not
        public static bool MoveWithCollisionCheck(Vector2 offset, Player player, Map map)
        {
            var tempPlayer = (Player)player.Clone();

            tempPlayer.X += offset.X;
            tempPlayer.Y += offset.Y;

            var tempPlayerRect = new Rectangle(
                Convert.ToInt32(tempPlayer.X),
                Convert.ToInt32(tempPlayer.Y),
                Convert.ToInt32(Player.Width),
                Convert.ToInt32(Player.Height));

            for (int i = 0; i < map.MapData.Count; i++)
            {
                for (int j = 0; j < map.MapData[i].Count; j++)
                {
                    var rect = map.MapData[i][j].GetCollisionRectangle(j * Map.TileSize, i * Map.TileSize);
                    if (rect.Width == 0 || rect.Height == 0)
                    {
                        continue;
                    }
                    if (tempPlayerRect.Intersects(rect))
                    {
                        tempPlayerRect.X -= Convert.ToInt16(offset.X);
                        tempPlayerRect.Y -= Convert.ToInt16(offset.Y);
                        if (offset.Y > 0)
                        {
                            for (int k = 1; k <= Convert.ToInt16(offset.Y); k++)
                            {
                                var tempTempPlayerRect = tempPlayerRect;
                                var tempOffset         = Convert.ToInt16(offset.Y) - k;
                                tempTempPlayerRect.Y += tempOffset;
                                if (tempTempPlayerRect.Intersects(rect))
                                {
                                    continue;
                                }
                                break;
                            }
                            if (offset.Y < 0)
                            {
                                offset.Y = 0;
                            }
                        }
                        else if (offset.Y < 0)
                        {
                            for (int k = 1; k >= Convert.ToInt16(Math.Abs(offset.Y)); k++)
                            {
                                var tempTempPlayerRect = tempPlayerRect;
                                var tempOffset         = Convert.ToInt16(offset.Y) + k;
                                tempTempPlayerRect.Y += tempOffset;
                                if (tempPlayerRect.Intersects(rect))
                                {
                                    continue;
                                }
                                break;
                            }
                            if (offset.Y > 0)
                            {
                                offset.Y = 0;
                            }
                        }
                        if (offset.X > 0)
                        {
                            for (int k = 1; k <= Convert.ToInt16(offset.X); k++)
                            {
                                var tempOffset = Convert.ToInt16(offset.X) - k;
                                tempPlayerRect.X += tempOffset;
                                if (tempPlayerRect.Intersects(rect))
                                {
                                    tempPlayerRect.X -= tempOffset;
                                    continue;
                                }
                                break;
                            }
                            if (offset.X < 0)
                            {
                                offset.X = 0;
                            }
                        }
                        else if (offset.X < 0)
                        {
                            for (int k = -1; k >= Convert.ToInt16(offset.X); k--)
                            {
                                var tempOffset = Convert.ToInt16(offset.X) - k;
                                tempPlayerRect.X += tempOffset;
                                if (tempPlayerRect.Intersects(rect))
                                {
                                    tempPlayerRect.X -= tempOffset;
                                    continue;
                                }
                                break;
                            }
                            if (offset.X > 0)
                            {
                                offset.X = 0;
                            }
                        }
                        map.MapData[i][j].OnTouch(player);
                        player.Move(offset);
                        return(false);
                    }
                }
            }
            if (tempPlayer.Y + Player.Height > Map.TileSize * (int)map.MapSize)
            {
                return(false);
            }
            if (tempPlayer.Y < 0)
            {
                return(false);
            }
            if (tempPlayer.X + Player.Width > Map.TileSize * (int)map.MapSize)
            {
                return(false);
            }
            if (tempPlayer.X < 0)
            {
                return(false);
            }

            player.Move(offset);
            return(true);
        }