private IIndividual _CheckHit(IEnumerable <IIndividual> controllers, Vector2 center, Guid self, Vector2 ray)
        {
            foreach (var individual in controllers)
            {
                if (individual.Id == _Player.Id)
                {
                    continue;
                }
                if (individual.Id == self)
                {
                    continue;
                }

                float   distance;
                Vector2 hitPoint;
                Vector2 normal;
                if (StandardWisdom.RayPolygonIntersect(
                        center,
                        ray,
                        individual.Mesh.Points,
                        out distance,
                        out hitPoint,
                        out normal))
                {
                    return(individual);
                }
            }
            return(null);
        }
        private Hit _Detect(float scan_angle, float max_distance)
        {
            scan_angle += 360f;
            scan_angle %= 360f;
            var pos  = _Entiry.GetPosition();
            var view = Vector2.AngleToVector(scan_angle);

            //Unity Debug Code
#if UNITY_EDITOR
            UnityEngine.Debug.DrawRay(new UnityEngine.Vector3(pos.X, 0, pos.Y), new UnityEngine.Vector3(view.X, 0, view.Y), UnityEngine.Color.blue, 0.5f);
#endif

            var hit = new Hit();
            hit.HitPoint = pos + view * max_distance;
            hit.Distance = max_distance;
            foreach (var visible in _FieldOfVision)
            {
                var     mesh = StandardWisdom._BuildMesh(visible);
                float   dis;
                Vector2 normal;
                Vector2 point;
                if (RayPolygonIntersect(pos, view, mesh.Points, out dis, out point, out normal))
                {
                    if (dis < hit.Distance)
                    {
                        hit.Visible  = visible;
                        hit.HitPoint = point;
                        hit.Distance = dis;
                    }
                }
            }


            return(hit);
        }
示例#3
0
        private Aboriginal _Create(Map map, ENTITY type, ItemProvider item_provider)
        {
            var entiry = EntityProvider.Create(type);
            var items  = item_provider.FromStolen();

            foreach (var item in items)
            {
                entiry.Bag.Add(item);
            }
            var wisdom     = new StandardWisdom(entiry);
            var aboriginal = new Aboriginal(map, this, entiry, wisdom);

            return(aboriginal);
        }
示例#4
0
 public TurnHandler(StandardWisdom standard_wisdom)
 {
     _StandardWisdom = standard_wisdom;
 }
示例#5
0
        public TICKRESULT Detect(float delta, float decision_time, Entity entiry, StandardWisdom standard_wisdom, float view_distance, int scan_angle)
        {
            var decisionTime = decision_time;
            var _Entiry      = entiry;

            if (_Entiry == null)
            {
                throw new ArgumentNullException("_Entiry");
            }
            var goblinWisdom = standard_wisdom;
            var distance     = view_distance;
            var scanAngle    = scan_angle;

            var pos = _Entiry.GetPosition();

            _TimeCounter += delta;
            if (_TimeCounter < decisionTime)
            {
                var view = (float)distance;
                var x    = Math.PI * _TimeCounter / decisionTime;
                var y    = (float)Math.Sin(x);
                var a    = scanAngle * y - (scanAngle / 2);


                var target = goblinWisdom.Detect(a + _Entiry.Direction, view);

                if (target.Visible == null || (target.Visible != null && goblinWisdom.IsWall(target.Visible.EntityType)))
                {
                    var hitDistnace = target.HitPoint.DistanceTo(pos);
                    hitDistnace = (float)Math.Floor(hitDistnace);
                    var vector   = target.HitPoint - pos;
                    var hitAngle = Vector2.VectorToAngle(vector.GetNormalized());
                    hitAngle += 360;
                    hitAngle %= 360;
                    //Unity Debug Code
#if UNITY_EDITOR
                    _UnityDrawLine(hitAngle, pos, UnityEngine.Color.red, view_distance, decisionTime);
#endif

                    _Nears.Add(new Exit()
                    {
                        Distance = hitDistnace, Direction = hitAngle
                    });
                }


                return(TICKRESULT.RUNNING);
            }


            var sortedDirections = from e in _Nears
                                   let diff = Math.Abs(e.Direction - _Entiry.Direction)
                                              where diff > 0.0f
                                              orderby diff
                                              select e;
            var soteds = from e in sortedDirections orderby e.Distance descending select e;
            var first  = soteds.FirstOrDefault();

            OutputEvent(first.Direction - _Entiry.Direction);
            _Nears.Clear();
            _TimeCounter = 0.0f;

#if UNITY_EDITOR
            var trunForce = Vector2.AngleToVector(first.Direction);
            var forcePos  = pos + trunForce * (distance);
            UnityEngine.Debug.DrawLine(new UnityEngine.Vector3(pos.X, 0, pos.Y), new UnityEngine.Vector3(forcePos.X, 0, forcePos.Y), UnityEngine.Color.yellow, decisionTime);
            //UnityEngine.Debug.Log("TurnDirection = " + _StandardWisdom.TurnDirection);
#endif
            return(TICKRESULT.SUCCESS);
        }
        public TraceStrategy(StandardWisdom wisdom)
        {
            _Wisdom = wisdom;

            _BuildNode();
        }
 private Aboriginal _Create(Map map,ENTITY type, ItemProvider item_provider)
 {
     var entiry = EntityProvider.Create(type);
     var items = item_provider.FromStolen();
     foreach (var item in items)
     {
         entiry.Bag.Add(item);
     }
     var wisdom = new StandardWisdom(entiry);
     var aboriginal = new Aboriginal(map, this, entiry, wisdom);
     return aboriginal;
 }
 public TurnHandler(StandardWisdom standard_wisdom )
 {
     _StandardWisdom = standard_wisdom;
 }
        public TICKRESULT Detect(float delta, float decision_time, Entity entiry, StandardWisdom standard_wisdom, float view_distance, int scan_angle)
        {
            var decisionTime = decision_time;
            var _Entiry = entiry;
            if (_Entiry == null)
            {
                throw new ArgumentNullException("_Entiry");
            }
            var goblinWisdom = standard_wisdom;
            var distance = view_distance;
            var scanAngle = scan_angle;

            var pos = _Entiry.GetPosition();
            _TimeCounter += delta;
            if (_TimeCounter < decisionTime)
            {
                var view = (float)distance;
                var x = Math.PI * _TimeCounter / decisionTime;
                var y = (float)Math.Sin(x);
                var a = scanAngle * y - (scanAngle / 2);

                var target = goblinWisdom.Detect(a + _Entiry.Direction, view);

                if (target.Visible == null || (target.Visible != null && goblinWisdom.IsWall(target.Visible.EntityType)))
                {

                    var hitDistnace = target.HitPoint.DistanceTo(pos);
                    hitDistnace = (float)Math.Floor(hitDistnace);
                    var vector = target.HitPoint - pos;
                    var hitAngle = Vector2.VectorToAngle(vector.GetNormalized());
                    hitAngle += 360;
                    hitAngle %= 360;
                    //Unity Debug Code
            #if UNITY_EDITOR
                    _UnityDrawLine(hitAngle, pos, UnityEngine.Color.red , view_distance , decisionTime);
            #endif

                    _Nears.Add(new Exit() { Distance = hitDistnace, Direction = hitAngle });

                }

                return TICKRESULT.RUNNING;
            }

            var sortedDirections = from e in _Nears
                                   let diff = Math.Abs(e.Direction - _Entiry.Direction)
                                   where diff > 0.0f
                                   orderby diff
                                   select e;
            var soteds = from e in sortedDirections orderby e.Distance descending select e;
            var first = soteds.FirstOrDefault();

            OutputEvent(first.Direction - _Entiry.Direction);
            _Nears.Clear();
            _TimeCounter = 0.0f;

            #if UNITY_EDITOR
            var trunForce = Vector2.AngleToVector(first.Direction);
            var forcePos = pos + trunForce * (distance);
            UnityEngine.Debug.DrawLine(new UnityEngine.Vector3(pos.X, 0, pos.Y), new UnityEngine.Vector3(forcePos.X, 0, forcePos.Y), UnityEngine.Color.yellow, decisionTime);
            //UnityEngine.Debug.Log("TurnDirection = " + _StandardWisdom.TurnDirection);

            #endif
            return TICKRESULT.SUCCESS;
        }