public Vector2 checkCollisions(CollisionObjectInterface obj, Vector2 newPosition) { if(checkObjectCollisions(obj, newPosition)) { return obj.getPosition(); } return checkBoundsCollisions(obj, newPosition); }
protected Vector2 checkTranslationalCollisionsSingleHeight(CollisionObjectInterface obj, Vector2 velocity, HeightEnum height) { float radius = obj.getRadius() + velocity.Length(); Vector2 position = obj.getPosition(); ConvexPolygonInterface movingObjectPolygon = obj.getBounds(height); Height objectHeight = obj.getHeight(); Vector2 translate, tempVelocity = velocity; float dist; List<Vector2> collisions = new List<Vector2>(); foreach (CollisionObjectInterface cObj in objects_) { dist = distanceBetweenPoints(position, cObj.getPosition()); if (cObj != obj && objectHeight.collides(cObj.getHeight()) && dist < radius + cObj.getRadius()) { dist = radius + cObj.getRadius() - dist; //translate = checkCollision(movingObjectPolygon, cObj.getBounds(tileHeight), dist, velocity); translate = cObj.checkCollisionWith(obj, this, height, dist, tempVelocity); if (translate != Vector2.Zero) { obj.collidedInto(cObj); cObj.collidedWith(obj); //velocity += translate; //movingObjectPolygon.rotate(direction, newPosition); position = movingObjectPolygon.getCenter(); translate = obj.checkCollisionInto(cObj, this, Height.getHeight(height), dist, translate); if (translate != Vector2.Zero) { collisions.Add(translate); tempVelocity += translate; } } } } if (collisions.Count == 0) { movingObjectPolygon.translate(velocity); return velocity; } if (collisions.Count == 1) { movingObjectPolygon.translate(velocity + collisions[0]); return (velocity + collisions[0]); } velocity += correctMultipleCollisions(velocity, collisions); movingObjectPolygon.translate(velocity); return velocity; }
protected Vector2 checkTranslationalCollisionsMultiHeight(CollisionObjectInterface obj, Vector2 velocity) { float radius = obj.getRadius() + velocity.Length(); Vector2 position = obj.getPosition(); ConvexPolygonInterface movingObjectPolygonLow = obj.getBounds(HeightEnum.LOW); ConvexPolygonInterface movingObjectPolygonHigh = obj.getBounds(HeightEnum.HIGH); Height objectHeight = obj.getHeight(), otherObjectHeight; Height translationHeight; Vector2 tempVelocity = velocity; Vector2 translate = Vector2.Zero, translateHigh = Vector2.Zero, translateLow = Vector2.Zero; float dist; List<Vector2> collisions = new List<Vector2>(); foreach (CollisionObjectInterface cObj in objects_) { dist = distanceBetweenPoints(position, cObj.getPosition()); otherObjectHeight = cObj.getHeight(); if (cObj != obj && objectHeight.collides(otherObjectHeight) && dist < radius + cObj.getRadius()) { dist = radius + cObj.getRadius() - dist; //translate = checkCollision(movingObjectPolygon, cObj.getBounds(tileHeight), dist, velocity); //translate = cObj.checkCollisionWith(obj, this, tileHeight, dist, velocity); translateHigh = Vector2.Zero; translateLow = Vector2.Zero; translationHeight = new Height(false, false); if (otherObjectHeight.blocksLow_) { translateLow = cObj.checkCollisionWith(obj, this, HeightEnum.LOW, dist, tempVelocity); } if (otherObjectHeight.blocksHigh_) { translateHigh = cObj.checkCollisionWith(obj, this, HeightEnum.HIGH, dist, tempVelocity); } if (translateLow.LengthSquared() > translateHigh.LengthSquared()) { translate = translateLow; translationHeight.blocksLow_ = true; } else { translate = translateHigh; translationHeight.blocksHigh_ = true; } if (translate != Vector2.Zero) { obj.collidedInto(cObj); cObj.collidedWith(obj); //velocity += translate; //movingObjectPolygon.rotate(direction, newPosition); position = movingObjectPolygonHigh.getCenter(); translate = obj.checkCollisionInto(cObj, this, translationHeight, dist, translate); if (translate != Vector2.Zero) { bool isInCollisions = false; for (int i = 0; i < collisions.Count; i++ ) { if (translate.Equals(collisions[i])) { isInCollisions = true; break; } /* float cos = ConvexPolygon.dotProduct(translate, collisions[i]) / (translate.Length() * collisions[i].Length()); if (cos >= 0.99f && cos <= 1.01f) { if (collisions[i].LengthSquared() < translate.LengthSquared()) { collisions[i] = translate; } isInCollisions = true; break; } */ } if (!isInCollisions) { collisions.Add(translate); //movingObjectPolygonHigh.translate(translate); //movingObjectPolygonLow.translate(translate); tempVelocity += translate; } } } } } if (collisions.Count == 0) { movingObjectPolygonHigh.translate(velocity); movingObjectPolygonLow.translate(velocity); return velocity; } if (collisions.Count == 1) { movingObjectPolygonHigh.translate(velocity + collisions[0]); movingObjectPolygonLow.translate(velocity + collisions[0]); return (velocity + collisions[0]); } velocity += correctMultipleCollisions(velocity, collisions); movingObjectPolygonHigh.translate(velocity); movingObjectPolygonLow.translate(velocity); return velocity; }
protected Vector2 checkRotationalCollisionsSingleHeight(CollisionObjectInterface obj, ref Vector2 newDirection, HeightEnum height) { float radius = obj.getRadius(); Vector2 position = obj.getPosition(); ConvexPolygonInterface movingObjectPolygon = obj.getBounds(height); Vector2 oldDirection = obj.getDirection(); movingObjectPolygon.rotate(newDirection, position); Height objectHeight = obj.getHeight(); Vector2 translate = Vector2.Zero; float dist; List<Vector2> collisions = new List<Vector2>(); foreach (CollisionObjectInterface cObj in objects_) { dist = distanceBetweenPoints(position, cObj.getPosition()); if (cObj != obj && objectHeight.collides(cObj.getHeight()) && dist < radius + cObj.getRadius()) { dist = radius + cObj.getRadius() - dist; //translate = checkCollision(movingObjectPolygon, cObj.getBounds(tileHeight), dist, Vector2.Zero); translate = cObj.checkCollisionWith(obj, this, height, dist, Vector2.Zero); if (translate != Vector2.Zero) { obj.collidedInto(cObj); cObj.collidedWith(obj); //velocity += translate; //movingObjectPolygon.rotate(direction, newPosition); translate = obj.checkCollisionInto(cObj, this, Height.getHeight(height), dist, translate); if (translate != Vector2.Zero) { collisions.Add(translate); } } } } if (collisions.Count == 1) { return collisions[0]; } if (collisions.Count > 1) { translate = Vector2.Zero; for (int i = 0; i < collisions.Count; i++) { Vector2 colVector = collisions[i]; for (int j = i; j < collisions.Count; j++) { if (ConvexPolygon.dotProduct(colVector, collisions[j]) / (colVector.Length() * collisions[j].Length()) < 0) { newDirection = oldDirection; movingObjectPolygon.rotate(oldDirection, position); return Vector2.Zero; } } translate += colVector; } return translate; } return Vector2.Zero; }
protected Vector2 checkRotationalCollisionsMultiHeight(CollisionObjectInterface obj, ref Vector2 newDirection) { float radius = obj.getRadius(); Vector2 position = obj.getPosition(); ConvexPolygonInterface movingObjectPolygonHigh = obj.getBounds(HeightEnum.HIGH); ConvexPolygonInterface movingObjectPolygonLow = obj.getBounds(HeightEnum.LOW); Vector2 oldDirection = obj.getDirection(); movingObjectPolygonHigh.rotate(newDirection, position); movingObjectPolygonLow.rotate(newDirection, position); Height objectHeight = obj.getHeight(), otherObjectHeight; Height translationHeight; Vector2 translate = Vector2.Zero, translateHigh = Vector2.Zero, translateLow = Vector2.Zero; Vector2 translateTot = Vector2.Zero; float dist; List<Vector2> collisions = new List<Vector2>(); foreach (CollisionObjectInterface cObj in objects_) { dist = distanceBetweenPoints(position, cObj.getPosition()); otherObjectHeight = cObj.getHeight(); if (cObj != obj && objectHeight.collides(otherObjectHeight) && dist < radius + cObj.getRadius()) { dist = radius + cObj.getRadius() - dist; //translate = checkCollision(movingObjectPolygon, cObj.getBounds(tileHeight), dist, Vector2.Zero); translateHigh = Vector2.Zero; translateLow = Vector2.Zero; translationHeight = new Height(false, false); if (otherObjectHeight.blocksLow_) { translateLow = cObj.checkCollisionWith(obj, this, HeightEnum.LOW, dist, Vector2.Zero); } if (otherObjectHeight.blocksHigh_) { translateHigh = cObj.checkCollisionWith(obj, this, HeightEnum.HIGH, dist, Vector2.Zero); } if (translateLow.LengthSquared() > translateHigh.LengthSquared()) { translate = translateLow; translationHeight.blocksLow_ = true; } else { translate = translateHigh; translationHeight.blocksHigh_ = true; } if (translate != Vector2.Zero) { obj.collidedInto(cObj); cObj.collidedWith(obj); //velocity += translate; //movingObjectPolygon.rotate(direction, newPosition); translate = obj.checkCollisionInto(cObj, this, translationHeight, dist, translate); if (translate != Vector2.Zero) { translateTot += translate; movingObjectPolygonLow.rotate(newDirection, position + translateTot); movingObjectPolygonHigh.rotate(newDirection, position + translateTot); collisions.Add(translate); } } } } if (collisions.Count == 1) { return collisions[0]; } if (collisions.Count > 1) { translate = Vector2.Zero; for (int i = 0; i < collisions.Count; i++) { Vector2 colVector = collisions[i]; for (int j = i + 1; j < collisions.Count; j++) { if (ConvexPolygon.dotProduct(colVector, collisions[j]) / (colVector.Length() * collisions[j].Length()) < 0) { Console.Out.Write("double:"); Console.Out.Write(colVector); Console.Out.Write(collisions[j]); Console.Out.WriteLine(ConvexPolygon.dotProduct(colVector, collisions[j]) / (colVector.Length() * collisions[j].Length())); newDirection = oldDirection; movingObjectPolygonLow.rotate(oldDirection, position); movingObjectPolygonHigh.rotate(oldDirection, position); return Vector2.Zero; } Console.Out.Write(colVector); Console.Out.Write(collisions[j]); Console.Out.WriteLine(ConvexPolygon.dotProduct(colVector, collisions[j]) / (colVector.Length() * collisions[j].Length())); } translate += colVector; } return translateTot; } return Vector2.Zero; }
public Vector2 checkCollisions(CollisionObjectInterface obj, Vector2 newPosition) { Vector2 oldPosition = obj.getPosition(); float radius = obj.getRadius(); Vector2 velocity = newPosition - oldPosition; ConvexPolygonInterface movingObjectPolygon= obj.getBounds(HeightEnum.LOW); ConvexPolygonInterface movingObjectPolygonHigh = obj.getBounds(HeightEnum.HIGH); Vector2 direction = obj.getDirection(); Vector2 position = movingObjectPolygon.getCenter(); movingObjectPolygon.rotate(direction, position); movingObjectPolygonHigh.rotate(direction, position); //TODO: Check collisions on rotations Vector2 translate; float dist; List<CollisionObjectInterface> collisions = new List<CollisionObjectInterface>(); foreach (CollisionObjectInterface cObj in objects_) { dist = distanceBetweenPoints(position, cObj.getPosition()); //Console.Out.WriteLine(dist); if (cObj != obj && dist < radius + cObj.getRadius()) { dist = radius + cObj.getRadius() - dist; translate = checkCollision(movingObjectPolygon, cObj.getBounds(HeightEnum.LOW), dist); //Console.Out.WriteLine(translate); if (translate != Vector2.Zero) { obj.collidedInto(cObj); cObj.collidedWith(obj); newPosition += translate; //movingObjectPolygon.translate(translate); movingObjectPolygon.rotate(direction, newPosition); position = movingObjectPolygon.getCenter(); collisions.Add(cObj); } } } bool noMoreCollisions = true; /* foreach (CollisionObjectInterface cObj in collisions) { dist = distanceBetweenPoints(position, cObj.getPosition()); //Console.Out.WriteLine(dist); if (cObj != obj && dist < radius + cObj.getRadius()) { dist = radius + cObj.getRadius() - dist; translate = checkCollision(movingObjectPolygon, cObj.getBounds(), dist); //Console.Out.WriteLine(translate); if (translate != Vector2.Zero) { noMoreCollisions = false; break; } } }*/ if (noMoreCollisions) { return newPosition; } movingObjectPolygon.rotate(direction, oldPosition); return oldPosition; }