public static void update(BasicSprite character, SpriteContainer staticSprites, GameTime time) { for (int i = staticSprites.Count - 1; i >= 0; i--) { if (willCollide(character, staticSprites[i], time)) { character.velocity = collisionWithSlip(character, staticSprites[i], time); character.onCollide(staticSprites[i], data, time); staticSprites[i].onCollide(character, data, time); } } character.updatePosition(); }
public static Velocity collisionWithSlip(BasicSprite s1, BasicSprite s2) { if (willCollide(s1, s2)) { s1.onCollide(s2); s2.onCollide(s1); if (s1.collidable && s2.collidable) { float vf1, vf2; Velocity v1 = Velocity.FromCoordinates(s1.velocity.getDirection().X, 0.0f); Velocity v2 = Velocity.FromCoordinates(s2.velocity.getDirection().X, 0.0f); Rectangle collision = Rectangle.Intersect(new Rectangle(s1.getUpdatePositionFromVelocity(v1).ToPoint(), s1.spriteSize), new Rectangle(s2.getUpdatePositionFromVelocity(v2).ToPoint(), s2.spriteSize)); if (collision != Rectangle.Empty) { vf1 = (int)v1.getDirection().X + (Math.Sign(v1.getDirection().X) * -collision.Width); } else { vf1 = v1.getDirection().X; } v1 = Velocity.FromCoordinates(0.0f, s1.velocity.getDirection().Y); v2 = Velocity.FromCoordinates(0.0f, s2.velocity.getDirection().Y); collision = Rectangle.Intersect(new Rectangle(s1.getUpdatePositionFromVelocity(v1).ToPoint(), s1.spriteSize), new Rectangle(s2.getUpdatePositionFromVelocity(v2).ToPoint(), s2.spriteSize)); if (collision != Rectangle.Empty) { vf2 = (int)v1.getDirection().Y + (Math.Sign(v1.getDirection().Y) * -collision.Height); } else { vf2 = v1.getDirection().Y; } return(Velocity.FromCoordinates(vf1, vf2)); } else { return(s1.velocity); } } else { return(s1.velocity); } }
public static Velocity collisionWithSlip(BasicSprite s1, BasicSprite s2) { if (willCollide(s1, s2)) { s1.onCollide(s2); s2.onCollide(s1); if (s1.collidable && s2.collidable) { float vf1, vf2; Velocity v1 = Velocity.FromCoordinates(s1.velocity.getDirection().X, 0.0f); Velocity v2 = Velocity.FromCoordinates(s2.velocity.getDirection().X, 0.0f); Rectangle collision = Rectangle.Intersect(new Rectangle(s1.getUpdatePositionFromVelocity(v1).ToPoint(), s1.spriteSize), new Rectangle(s2.getUpdatePositionFromVelocity(v2).ToPoint(), s2.spriteSize)); if (collision != Rectangle.Empty) vf1 = (int)v1.getDirection().X + (Math.Sign(v1.getDirection().X) * -collision.Width); else vf1 = v1.getDirection().X; v1 = Velocity.FromCoordinates(0.0f, s1.velocity.getDirection().Y); v2 = Velocity.FromCoordinates(0.0f, s2.velocity.getDirection().Y); collision = Rectangle.Intersect(new Rectangle(s1.getUpdatePositionFromVelocity(v1).ToPoint(), s1.spriteSize), new Rectangle(s2.getUpdatePositionFromVelocity(v2).ToPoint(), s2.spriteSize)); if (collision != Rectangle.Empty) vf2 = (int)v1.getDirection().Y + (Math.Sign(v1.getDirection().Y) * -collision.Height); else vf2 = v1.getDirection().Y; return Velocity.FromCoordinates(vf1, vf2); } else { return s1.velocity; } } else { return s1.velocity; } }
public static bool willCollide(BasicSprite s1, BasicSprite s2, GameTime time) { Rectangle r = Rectangle.Intersect(new Rectangle(s1.getUpdatePosition().ToPoint(), s1.spriteSize), new Rectangle(s2.getUpdatePosition().ToPoint(), s2.spriteSize)); if ((r != Rectangle.Empty)) { if (!(s1.collidable && s2.collidable)) { s1.onCollide(s2, r, time); s2.onCollide(s1, r, time); } return true; } return false; }