Esempio n. 1
0
        public virtual void Update(float elapsed)
        {
            List <float> angles = new List <float>();

            foreach (var castObject in castObjects)
            {
                castObject.RelAngles(position, angles);
            }

            const float small         = 0.0001f;
            int         oldAngleCount = angles.Count;

            for (int i = 0; i < oldAngleCount; i++)
            {
                angles.Add(angles[i] + small);
                angles.Add(angles[i] - small);
            }

            PrepareAngles(ref angles);

            List <Vector2> vertices = new List <Vector2>();

            float maxDist = 2000;

            for (int i = 0; i < angles.Count; i++)
            {
                float        angle   = angles[i];
                Vector2      rayDir  = new Vector2((float)Math.Cos(angle), (float)Math.Sin(angle));
                List <float> dists   = new List <float>();
                float        minDist = maxDist;
                foreach (var castObject in castObjects)
                {
                    castObject.InterPoint(position, rayDir, dists);
                }
                foreach (float dist in dists)
                {
                    float d = dist + 1f;
                    if (d >= 0 && d < minDist)
                    {
                        minDist = d;
                    }
                }
                vertices.Add(position + minDist * rayDir);
            }

            if (maxAngleDiff * 2 < MathHelper.TwoPi)
            {
                vertices.Add(position);
            }

            polygon.Update(position, vertices);
        }
Esempio n. 2
0
        public virtual void Update(float elapsed)
        {
            List <AngleObj> angles = new List <AngleObj>();

            foreach (var castObject in castObjects)
            {
                castObject.RelAngles(position, angles);
            }

            const float small         = 0.0001f;
            int         oldAngleCount = angles.Count;

            for (int i = 0; i < oldAngleCount; i++)
            {
                angles.Add(new AngleObj(angles[i].angle + small, angles[i].castingObject));
                //angles.Add(angles[i] - small);
                angles[i].angle -= small;
            }

            float maxDist = 2000;
            Empty empty   = new Empty(maxDist);

            empty.RelAngles(position, angles);
            for (int i = 0; i < angles.Count; i++)
            {
                angles[i].angle = MathHelper.WrapAngle(angles[i].angle);
            }
            angles.Sort();

            //PrepareAngles(ref angles);

            List <Vector2> vertices = new List <Vector2>();
            HashSet <IShadowCastingObject> curObj = new HashSet <IShadowCastingObject>()
            {
                empty,
            };

            foreach (var castObject in castObjects)
            {
                angle = -MathHelper.Pi;
                if (!IfMisses(castObject))
                {
                    curObj.Add(castObject);
                }
            }

            for (int i = 0; i < angles.Count; i++)
            {
                angle = angles[i].angle;
                curObj.RemoveWhere(IfMisses);
                curObj.Add(angles[i].castingObject);

                if (/*Keyboard.GetState().IsKeyDown(Keys.Space) && */ curObj.Count > 50)
                {
                    ;
                }

                Vector2      rayDir  = Dir(angle);
                List <float> dists   = new List <float>();
                float        minDist = maxDist;
                foreach (var castObject in curObj)
                {
                    castObject.InterPoint(position, rayDir, dists);
                }
                foreach (float dist in dists)
                {
                    float d = dist;
                    if (d >= 0 && d < minDist)
                    {
                        minDist = d;
                    }
                }
                vertices.Add(position + minDist * rayDir);
            }

            if (maxAngleDiff * 2 < MathHelper.TwoPi)
            {
                vertices.Add(position);
            }

            polygon.Update(position, vertices);
        }