/// <summary> /// Check to see if two Rotated Rectangls have collided /// </summary> /// <param name="theRectangle"></param> /// <returns></returns> public bool Intersects(RotatedRectangle theRectangle) { //Calculate the Axis we will use to determine if a collision has occurred //Since the objects are rectangles, we only have to generate 4 Axis (2 for //each rectangle) since we know the other 2 on a rectangle are parallel. List <Vector2> aRectangleAxis = new List <Vector2>(); aRectangleAxis.Add(UpperRightCorner() - UpperLeftCorner()); aRectangleAxis.Add(UpperRightCorner() - LowerRightCorner()); aRectangleAxis.Add(theRectangle.UpperLeftCorner() - theRectangle.LowerLeftCorner()); aRectangleAxis.Add(theRectangle.UpperLeftCorner() - theRectangle.UpperRightCorner()); //Cycle through all of the Axis we need to check. If a collision does not occur //on ALL of the Axis, then a collision is NOT occurring. We can then exit out //immediately and notify the calling function that no collision was detected. If //a collision DOES occur on ALL of the Axis, then there is a collision occurring //between the rotated rectangles. We know this to be true by the Seperating Axis Theorem foreach (Vector2 aAxis in aRectangleAxis) { if (!IsAxisCollision(theRectangle, aAxis)) { return(false); } } return(true); }
public void Update(ContentManager Content, Level level) { sprite.setX(player.sprite.getX()); sprite.setY(player.sprite.getY()); rotation = player.playerRotation; HitBoxRot = new RotatedRectangle(new Rectangle((int)sprite.getX(), (int)sprite.getY() - (int)sprite.getTexture().Width / 4, sprite.getTexture().Width / 2, sprite.getTexture().Height / 4), rotation, originNew); Matrix hitBoxTransform = Matrix.CreateTranslation(new Vector3(-(originNew), 0.0f)) * Matrix.CreateRotationZ(rotation) * Matrix.CreateTranslation(new Vector3(sprite.vector, 0.0f)); HitBox = CalculateBoundingRectangle(new Rectangle(0, 0 - (int)sprite.getTexture().Height / 4, sprite.getTexture().Width / 2, sprite.getTexture().Height / 4), hitBoxTransform); if (Attacking > 0) { sprite.setTexture(attackTexture); foreach (Zombie zombie in level.zombies) { Rectangle zombieRectangle = new Rectangle((int)zombie.sprite.vector.X - zombie.sprite.getTexture().Width / 2, (int)zombie.sprite.vector.Y - zombie.sprite.getTexture().Height / 2, zombie.sprite.getTexture().Width, zombie.sprite.getTexture().Height); if (HitBox.Intersects(zombieRectangle)) { zombie.health -= 100; level.bloodParticles = level.GenerateBurst(level.bloodParticles, CHZ.options.bldCol, new Vector3(zombie.sprite.vector, 0), Content, 20, 60, Options.GetInstance().minLParticles, Options.GetInstance().maxLParticles, 0.1f, 5f, player.playerRotation - MathHelper.PiOver4 * 4 / 5 - MathHelper.PiOver2, player.playerRotation + MathHelper.PiOver4 * 4 / 5 - MathHelper.PiOver2, MathHelper.PiOver2, MathHelper.PiOver2 - MathHelper.PiOver4 * 3 / 5); } } Attacking -= 1; } else { sprite.setTexture(stillTexture); } }
public Hammer(ContentManager Content, Sprite sprite, Player player) { stillTexture = Content.Load <Texture2D>("HammerStill"); attackTexture = Content.Load <Texture2D>("HammerAttack"); this.player = player; this.sprite = sprite; this.sprite.setTexture(stillTexture); rotation = player.playerRotation; sprite.setX(player.sprite.getX()); sprite.setY(player.sprite.getY()); rotation = player.playerRotation; originNew = new Vector2(64, 96); origin = new Vector2(64, 64); HitBoxRot = new RotatedRectangle(new Rectangle((int)sprite.getX(), (int)sprite.getY(), sprite.getTexture().Width, sprite.getTexture().Height / 2), rotation, origin); }
/// <summary> /// Determines if a collision has occurred on an Axis of one of the /// planes parallel to the Rectangle /// </summary> /// <param name="theRectangle"></param> /// <param name="aAxis"></param> /// <returns></returns> private bool IsAxisCollision(RotatedRectangle theRectangle, Vector2 aAxis) { //Project the corners of the Rectangle we are checking on to the Axis and //get a scalar value of that project we can then use for comparison List <int> aRectangleAScalars = new List <int>(); aRectangleAScalars.Add(GenerateScalar(theRectangle.UpperLeftCorner(), aAxis)); aRectangleAScalars.Add(GenerateScalar(theRectangle.UpperRightCorner(), aAxis)); aRectangleAScalars.Add(GenerateScalar(theRectangle.LowerLeftCorner(), aAxis)); aRectangleAScalars.Add(GenerateScalar(theRectangle.LowerRightCorner(), aAxis)); //Project the corners of the current Rectangle on to the Axis and //get a scalar value of that project we can then use for comparison List <int> aRectangleBScalars = new List <int>(); aRectangleBScalars.Add(GenerateScalar(UpperLeftCorner(), aAxis)); aRectangleBScalars.Add(GenerateScalar(UpperRightCorner(), aAxis)); aRectangleBScalars.Add(GenerateScalar(LowerLeftCorner(), aAxis)); aRectangleBScalars.Add(GenerateScalar(LowerRightCorner(), aAxis)); //Get the Maximum and Minium Scalar values for each of the Rectangles int aRectangleAMinimum = aRectangleAScalars.Min(); int aRectangleAMaximum = aRectangleAScalars.Max(); int aRectangleBMinimum = aRectangleBScalars.Min(); int aRectangleBMaximum = aRectangleBScalars.Max(); //If we have overlaps between the Rectangles (i.e. Min of B is less than Max of A) //then we are detecting a collision between the rectangles on this Axis if (aRectangleBMinimum <= aRectangleAMaximum && aRectangleBMaximum >= aRectangleAMaximum) { return(true); } else if (aRectangleAMinimum <= aRectangleBMaximum && aRectangleAMaximum >= aRectangleBMaximum) { return(true); } return(false); }
public void Update(ContentManager Content, Level level) { sprite.setX(player.sprite.getX()); sprite.setY(player.sprite.getY()); rotation = player.playerRotation; HitBoxRot = new RotatedRectangle(new Rectangle((int)sprite.getX(), (int)sprite.getY(), sprite.getTexture().Width, sprite.getTexture().Height / 4 * 3), rotation, originNew); Matrix hitBoxTransform = Matrix.CreateTranslation(new Vector3(-(originNew), 0.0f)) * Matrix.CreateRotationZ(rotation) * Matrix.CreateTranslation(new Vector3(sprite.vector, 0.0f)); HitBox = CalculateBoundingRectangle(new Rectangle(0, 0, sprite.getTexture().Width, sprite.getTexture().Height / 4 * 3), hitBoxTransform); if (Attacking > 0) { sprite.setTexture(attackTexture); foreach (Zombie zombie in level.zombies) { Rectangle zombieRectangle = new Rectangle((int)zombie.sprite.vector.X - zombie.sprite.getTexture().Width / 2, (int)zombie.sprite.vector.Y - zombie.sprite.getTexture().Height / 2, zombie.sprite.getTexture().Width, zombie.sprite.getTexture().Height); if (HitBox.Intersects(zombieRectangle)) { zombie.health -= 100; level.bloodParticles = level.GenerateBurst(level.bloodParticles, CHZ.options.bldCol, new Vector3(zombie.sprite.vector, 0), Content, 60, 360, Options.GetInstance().minLParticles, Options.GetInstance().maxLParticles, 0.1f, 2.7f); } } Attacking -= 1; } else { sprite.setTexture(stillTexture); } if (Attacking == 19) { Vector2 location = player.sprite.vector; location.X += sprite.getTexture().Height / 2 * (float)Math.Cos(rotation - Math.PI / 2); location.Y += sprite.getTexture().Height / 2 * (float)Math.Sin(rotation - Math.PI / 2); level.bloodParticles = level.GenerateBurst(level.bloodParticles, Color.Yellow, new Vector3(location, 0), Content, 60, 360, 230, 600, 2.6f, 2.7f); } }