示例#1
0
        public void Shot()
        {
            var ray         = new Ray(PlayerPos, _player.Direction);
            var minDistance = double.MaxValue;
            var s           = new Vector(-85, -85);

            foreach (var w in _map.Walls.Select(wall => ray.Cast(wall)).Where(w => minDistance > Utils.GetDist(w, PlayerPos) && w.X > 0))
            {
                minDistance = Utils.GetDist(w, PlayerPos);
            }

            var bestEnemy = new Enemy(s);

            foreach (var enemy in _map.Enemies)
            {
                foreach (var w in enemy.EnemyWalls.Select(wall => ray.Cast(wall)).Where(w => minDistance > Utils.GetDist(w, PlayerPos) && w.X > 0))
                {
                    bestEnemy   = enemy;
                    minDistance = Utils.GetDist(w, PlayerPos);
                }
            }

            if (bestEnemy.Position.X != -85)
            {
                _map.Enemies.Remove(bestEnemy);
            }
        }
示例#2
0
        public void MoveEnemys()
        {
            var playerPos = new Vector(_player.X, _player.Y);

            foreach (var enemy in _map.Enemies)
            {
                var vec = playerPos - enemy.Position;
                vec.Normalize();
                var ray = new Ray(enemy.Position, 0)
                {
                    Direction = vec
                };
                if (!_map.Walls.Select(x => ray.Cast(x)).Any(x => (enemy.Position - x).Length < (playerPos - enemy.Position).Length))
                {
                    var angle = Math.Asin(Math.Abs(vec.Y / vec.Length));
                    if (vec.X < 0 && vec.Y >= 0)
                    {
                        angle = Math.PI - angle;
                    }
                    else if (vec.X < 0 && vec.Y < 0)
                    {
                        angle = Math.PI + angle;
                    }
                    else if (vec.X > 0 && vec.Y < 0)
                    {
                        angle = 2 * Math.PI - angle;
                    }
                    enemy.TurnTo(angle - Math.PI);
                    enemy.Move(vec);
                }
            }
        }
示例#3
0
        private Vector CorrectVector(Vector moveVector)
        {
            foreach (var wall in _map.Walls.Concat(_map.Doors.Select(x => x.DorWall)))
            {
                var t = new Vector(moveVector.X, moveVector.Y);
                t.Normalize();
                var playerRay = new Ray(new Vector(_player.X, _player.Y), 0)
                {
                    Direction = t
                };
                var distanceToWall = playerRay.Cast(wall);
                if (distanceToWall.X >= 0 && distanceToWall.Y >= 0 && moveVector.Length >
                    Utils.GetDist(new Vector(_player.X, _player.Y), distanceToWall))
                {
                    var x1           = wall.line.A.X;
                    var x2           = wall.line.B.X;
                    var y1           = wall.line.A.Y;
                    var y2           = wall.line.B.Y;
                    var normalX      = y2 - y1;
                    var normalY      = x1 - x2;
                    var c            = x1 * (y1 - y2) + y1 * (x2 - x1);
                    var px           = moveVector.X + _player.X;
                    var py           = moveVector.Y + _player.Y;
                    var distance     = Math.Abs(normalX * px + normalY * py + c) / Math.Sqrt(normalX * normalX + normalY * normalY) + 0.1;
                    var normalVector = new Vector(normalX, normalY);
                    normalVector.Normalize();
                    normalVector *= distance;

                    moveVector += normalVector.X * moveVector.X + normalVector.Y * moveVector.Y > 0
                        ? -normalVector
                        : normalVector;
                }
            }

            return(moveVector);
        }