/// <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);
        }
示例#2
0
        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);
            }
        }
示例#3
0
 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);
        }
示例#5
0
        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);
            }
        }