Exemplo n.º 1
0
        private void HandleCollisions(List <ICollidable> levelActors)
        {
            isOnGround = false;
            int nombreDObstaclesCroises = 0;

            foreach (ICollidable actor in levelActors)
            {
                if (!actor.Crossable && actor.HitBox.Intersects(HitBox) && isOnGround == false)
                {
                    CollideType collision = Utilities.CheckCollision(this, actor); //attention, avec ce système on ignore tous les obstacles de moins de 8px

                    if (collision.collideBottom && !(collision.collideRight || collision.collideLeft))
                    {
                        this.Position = new Vector2(Position.X, actor.HitBox.Top);
                        isOnGround    = true;
                    }
                    if (collision.collideRight)
                    {
                        this.Position = new Vector2(actor.HitBox.Left - (this.HitBox.Width / 2), Position.Y);
                    }
                    if (collision.collideLeft)
                    {
                        this.Position = new Vector2(actor.HitBox.Right + (this.HitBox.Width / 2), Position.Y);
                    }

                    nombreDObstaclesCroises++;
                }
            }
            //Debug.Write(nombreDObstaclesCroises);
        }
Exemplo n.º 2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="actor1">généralement le perso</param>
        /// <param name="actor2"></param>
        /// <returns></returns>
        public static CollideType CheckCollision(ICollidable actor1, ICollidable actor2)
        {
            CollideType result = new CollideType();

            if (actor1.HitBox.Intersects(actor2.HitBox))
            {
                if (actor1.HitBox.Top > actor2.HitBox.Bottom)
                {
                    //collision par le haut
                    result.collideTop = true;
                    actor2.OnCollision(actor1);
                    result.topCollisionDepth = actor2.HitBox.Bottom - actor1.HitBox.Top;
                }
                if (actor1.HitBox.Bottom > actor2.HitBox.Top)
                {
                    //collision par le bas
                    result.collideBottom = true;
                    actor2.OnCollision(actor1);
                    result.bottomCollisionDepth = actor1.HitBox.Bottom - actor2.HitBox.Top;
                }
            }
            Rectangle xCollisionHitBox = new Rectangle(actor1.HitBox.X,
                                                       actor1.HitBox.Y,
                                                       actor1.HitBox.Width,
                                                       actor1.HitBox.Height - 8);

            if (xCollisionHitBox.Intersects(actor2.HitBox))
            {
                if ((xCollisionHitBox.Left < actor2.HitBox.Right) && (xCollisionHitBox.Center.X > actor2.HitBox.Center.X)) //!
                {
                    //collision par la gauche
                    result.collideLeft = true;
                    actor2.OnCollision(actor1);
                    result.leftCollisionDepth = actor2.HitBox.Right - xCollisionHitBox.Left;
                }
                if ((xCollisionHitBox.Right > actor2.HitBox.Left) && (xCollisionHitBox.Center.X < actor2.HitBox.Center.X))
                {
                    //collision par la droite
                    result.collideRight = true;
                    actor2.OnCollision(actor1);
                    result.rightCollisionDepth = xCollisionHitBox.Right - actor2.HitBox.Left;
                }
            }
            return(result);
        }