private CollisionDetails getCollisionDetails(Vector2 a_oldPos, Vector2 a_newPosition, Vector2 a_size, Vector2 a_velocity)
        {
            CollisionDetails ret = new CollisionDetails(a_oldPos, a_velocity);

            Vector2 slidingXPosition = new Vector2(a_newPosition.X, a_oldPos.Y); //Y movement ignored
            Vector2 slidingYPosition = new Vector2(a_oldPos.X, a_newPosition.Y); //X movement ignored

            if (didCollide(slidingXPosition, a_size) == false)
            {
                return(doOnlyXMovement(ref a_velocity, ret, ref slidingXPosition));
            }
            if (didCollide(slidingYPosition, a_size) == true)
            {
                ret.m_hasCollidedWidthTheLeft = true;
                return(doOnlyYMovement(ref a_velocity, ret, ref slidingYPosition));
            }

            if (didCollide(slidingYPosition, a_size) == false)
            {
                return(doOnlyYMovement(ref a_velocity, ret, ref slidingYPosition));
            }
            else
            {
                return(doStandStill(ret, a_velocity));
            }
        }
Ejemplo n.º 2
0
 public void Collision(object sender, CollisionDetails colDetails)
 {
     if (colDetails.ColliderUname == UName)
     {
         if (colDetails.ColldingObject is Patient)
         {
             OnLevelFinished(this);
         }
         else if (colDetails.ColldingObject is Artifact)
         {
             CanFinish   = true;
             hasArtefact = true;
         }
         else if (colDetails.ColldingObject is Player)
         {
             if (hasArtefact)
             {
                 CanFinish          = false;
                 hasArtefact        = false;
                 artefact.Position += new Vector2(100, 100);
             }
         }
         else if (colDetails.ColldingObject is Ice)
         {
             onIce = true;
         }
         else
         {
             Position += colDetails.mtv;
         }
     }
 }
        public void UpdatePlayer(float a_elapsedTime)
        {
            //Get the old position
            oldPos = m_player.GetPosition();

            //Get the new position
            m_player.Update(a_elapsedTime);

            m_ghost.Update(a_elapsedTime);

            newPos = m_player.GetPosition();

            //Collide
            m_hasCollidedWithGround = false;
            Vector2 speed = m_player.GetSpeed();

            if (didCollide(newPos, m_player.m_sizes))
            {
                CollisionDetails details = getCollisionDetails(oldPos, newPos, m_player.m_sizes, speed);
                m_hasCollidedWithGround   = details.m_hasCollidedWithGround;
                m_hasCollidedWidthTheLeft = details.m_hasCollidedWidthTheLeft;
                //set the new speed and position after collision
                m_player.SetPosition(details.m_positionAfterCollision);
                //    m_player.SetSpeed(details.m_speedAfterCollision);
            }
        }
 private static CollisionDetails doStandStill(CollisionDetails ret, Vector2 a_velocity)
 {
     if (a_velocity.Y > 0)
     {
         ret.m_hasCollidedWithGround = true;
     }
     return(ret);
 }
Ejemplo n.º 5
0
 private static CollisionDetails doOnlyYMovement(ref Vector2 a_velocity, CollisionDetails ret, ref Vector2 slidingYPosition)
 {
     //a_velocity.X *= -0.5f; //bounce from wall
     a_velocity.X = 0f;
     ret.m_speedAfterCollision    = a_velocity;
     ret.m_positionAfterCollision = slidingYPosition;
     return(ret);
 }
 private static CollisionDetails doOnlyXMovement(ref Vector2 a_velocity, CollisionDetails ret, ref Vector2 slidingXPosition)
 {
     ret.m_positionAfterCollision = slidingXPosition;
     //did we slide on ground?
     if (a_velocity.Y > 0)
     {
         ret.m_hasCollidedWithGround = true;
     }
     return(ret);
 }
Ejemplo n.º 7
0
        public override CollisionDetails FindNearestHit(Shapes.Ray ray)
        {
            var c = new CollisionDetails();

            //Find nearest Hit
            foreach (I3DObject objectCandidate in _objects)
            {
                double distanceCandidate = objectCandidate.GetHitPointDistance(ray);
                if (distanceCandidate > 0 && distanceCandidate < c.Distance)
                {
                    c.Obj      = objectCandidate;
                    c.Distance = distanceCandidate;
                }
            }

            return(c);
        }
Ejemplo n.º 8
0
        protected override WideColor ShootRay(Shapes.Ray ray, int level)
        {
            if (level == MaxRecursionDepth)
            {
                return(Color.Red.ToWide());
            }

            //Find nearest Hit
            CollisionDetails c = Scene.FindNearestHit(ray);

            //No hit
            if (c.Obj == null || double.IsInfinity(c.Distance))
            {
                // TODO: actually use the scene sky here!
                return(Color.White.ToWide());
            }

            //Calculate hit position
            Vect3 hitPoint = ray.Origin + ray.Direction * c.Distance;

            //Get color and normal at hitpoint
            WideColor color  = c.Obj.GetColorAt(hitPoint).ToWide();
            Vect3     normal = c.Obj.GetNormalAt(hitPoint);

            //Check if anything is blocking direct sunlight (go where the sunlight comes from)
            Vect3 lrDir    = Scene.AmbientLightDirection * -1;
            var   lightRay = new Shapes.Ray
            {
                Origin    = hitPoint,
                Direction = lrDir
            };
            CollisionDetails lc = Scene.FindNearestHit(lightRay);

            //if nothing blocks the sun's light, add ambient and diffuse light, otherwise ambient only
            double lightScale = 0;

            if (lc.Obj == null)
            {
                lightScale = normal * Scene.AmbientLightDirection;
            }
            lightScale = AmbientLightIntensity + DiffuseLightIntensity * (lightScale < 0 ? -lightScale : 0);

            return(color * lightScale);
        }
Ejemplo n.º 9
0
        internal void UpdatePlayer(float a_timeElapsed, float a_scale)
        {
            Vector2 oldPos = m_player.Position;

            m_player.Update(a_timeElapsed);

            m_hasCollidedWithGround = false;
            Vector2 newPos = m_player.Position;

            if (didCollide(m_player.Position, m_player.PlayerTextureSize / a_scale))
            {
                CollisionDetails details = getCollisionDetails(oldPos, newPos, m_player.PlayerTextureSize / a_scale, m_player.Speed);
                m_hasCollidedWithGround = details.m_hasCollidedWithGround;

                //set the new speed and position after collision
                //m_player.Position = details.m_positionAfterCollision;
                m_player.Position = details.m_positionAfterCollision;
                m_player.Speed    = details.m_speedAfterCollision;
            }
        }
Ejemplo n.º 10
0
        protected virtual WideColor ShootRay(Shapes.Ray ray, int level)
        {
            if (level == MaxRecursionDepth)
            {
                return Color.Red.ToWide();
            }

            //Find nearest Hit
            CollisionDetails c = Scene.FindNearestHit(ray);

            //No hit
            if (c.Obj == null)
            {
                return Color.White.ToWide();
            }

            //Calculate hit point
            Vect3 hitPoint = ray.Origin + ray.Direction*c.Distance;

            //Return object's color at hit point
            return c.Obj.GetColorAt(hitPoint).ToWide();
        }
 private static CollisionDetails doOnlyYMovement(ref Vector2 a_velocity, CollisionDetails ret, ref Vector2 slidingYPosition)
 {
     ret.m_positionAfterCollision = slidingYPosition;
     return(ret);
 }