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)); } }
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); }
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); }
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); }
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); }
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; } }
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); }