Example #1
0
        /**
         * Initialise le Level.
         */
        public Level(GLControl _glControl, int playerCount)
        {
            //Enregistrer le composant OpenGl à utiliser pour le dessin 3D
            glControl = _glControl;

            //Initialise le joueur contneant les données Kinect
            player = new Player(playerCount);

            //Crée l'objet mur, en lui indiquant le nombre de joueurs afin de pouvoir charger les images appropriées.
            wall = new Wall(playerCount);

            //Définit le nombre total de murs, qui sera affiché sur le HUD.
            totalWall = wall.getNumberOfWalls();

            //Initialise OpenGL.
            initStage();
        }
Example #2
0
        /**
         * Détermine le pourcentage de réussite du mur.
         * Pour cela, deux valeurs sont retournées :
         * - la première correspond au pourcentage du joueur à l'intérieur du trou : le plus est le mieux
         * - la seconde correspond au pourcentage du joueur en dehors du trou : le moins est le mieux
         * Le score idéal est donc de 100 / 0.
         * Une unique valeur ne permet pas de juger de la précision. Par exemple, on peut avoir 100 sur la valeur intérieure en occupant tous les pixels de l'image.
         *
         * @note les deux pourcentages n'étant pas définis de la même façon, il est tout à fait normal que leur somme ne donne pas 100
         */
        public int[] percentValues(Wall wall)
        {
            //Pourcentage in et pourcentage out
            int[] percent = new int[2];

            Bitmap bmp = lastBitmap;

            //Si le Kinect n'est pas connecté (ou n'a pas encore envoyé de données), il faut renvoyer 0 / 100 pour éviter le crash.
            if (bmp == null)
            {
                percent[0] = 0;
                percent[1] = 100;
                return percent;
            }

            //Récupérer les données de pixel afin de pouvoir les exploiter rapidement.
            BitmapData bmpd = bmp.LockBits(
                new Rectangle(0, 0, bmp.Width, bmp.Height),
                ImageLockMode.ReadOnly,
                bmp.PixelFormat
            );

            //Copier les données basiques et traduire / convertir pour un accès facile aux données de l'image
            IntPtr ptr = bmpd.Scan0;
            int bytes = Math.Abs(bmpd.Stride) * bmp.Height;
            byte[] playerValues = new byte[bytes];
            System.Runtime.InteropServices.Marshal.Copy(ptr, playerValues, 0, bytes);

            byte[] wallValues = wall.getCurrentWallByteArray();

            //Nombre de pixels correspondant au joueur à l'intérieur du trou
            int playerPixelsInTheWall = 0;

            //Nombre de pixels correspondant au joueur à l'extérieur du troi
            int playerPixelsOutTheWall = 1;

            //Nombre de pixels de trou dans le mur
            int emptyPixelsInTheWall = 0;

            //Parcourir chacun des pixels de l'image et remplir les variables nécessaires
            for (int counter = 3; counter < playerValues.Length; counter += 4)
            {
                byte wallValue = wallValues[counter];
                byte playerValue = playerValues[counter];

                if (wallValue == 0)
                {
                    emptyPixelsInTheWall++;

                    if (playerValue == playerAlpha)
                        playerPixelsInTheWall++;
                }
                else
                {
                    if (playerValue == playerAlpha)
                        playerPixelsOutTheWall++;
                }
            }

            //Pourcentage à l'intérieur du mur : nombre de pixels du joueur dans le trou / nombre de pixels de trou
            percent[0] = 100 * playerPixelsInTheWall / emptyPixelsInTheWall;
            //Pourcentage à l'extérieur du mur : nombre de pixels du joueurs hors du trou / (nombre total de pixels du joueur)
            percent[1] = 100 * playerPixelsOutTheWall / (playerPixelsOutTheWall + playerPixelsInTheWall);

            bmp.UnlockBits(bmpd);

            return percent;
        }
Example #3
0
        /**
         * Détermine le pourcentage de réussite du mur.
         * Pour cela, deux valeurs sont retournées :
         * - la première correspond au pourcentage du joueur à l'intérieur du trou : le plus est le mieux
         * - la seconde correspond au pourcentage du joueur en dehors du trou : le moins est le mieux
         * Le score idéal est donc de 100 / 0.
         * Une unique valeur ne permet pas de juger de la précision. Par exemple, on peut avoir 100 sur la valeur intérieure en occupant tous les pixels de l'image.
         *
         * @note les deux pourcentages n'étant pas définis de la même façon, il est tout à fait normal que leur somme ne donne pas 100
         */
        public int[] percentValues(Wall wall)
        {
            //Pourcentage in et pourcentage out
            int[] percent = new int[2];

            Bitmap bmp = lastBitmap;

            //Si le Kinect n'est pas connecté (ou n'a pas encore envoyé de données), il faut renvoyer 0 / 100 pour éviter le crash.
            if (bmp == null)
            {
                percent[0] = 0;
                percent[1] = 100;
                return(percent);
            }

            //Récupérer les données de pixel afin de pouvoir les exploiter rapidement.
            BitmapData bmpd = bmp.LockBits(
                new Rectangle(0, 0, bmp.Width, bmp.Height),
                ImageLockMode.ReadOnly,
                bmp.PixelFormat
                );

            //Copier les données basiques et traduire / convertir pour un accès facile aux données de l'image
            IntPtr ptr   = bmpd.Scan0;
            int    bytes = Math.Abs(bmpd.Stride) * bmp.Height;

            byte[] playerValues = new byte[bytes];
            System.Runtime.InteropServices.Marshal.Copy(ptr, playerValues, 0, bytes);

            byte[] wallValues = wall.getCurrentWallByteArray();

            //Nombre de pixels correspondant au joueur à l'intérieur du trou
            int playerPixelsInTheWall = 0;

            //Nombre de pixels correspondant au joueur à l'extérieur du troi
            int playerPixelsOutTheWall = 1;

            //Nombre de pixels de trou dans le mur
            int emptyPixelsInTheWall = 0;

            //Parcourir chacun des pixels de l'image et remplir les variables nécessaires
            for (int counter = 3; counter < playerValues.Length; counter += 4)
            {
                byte wallValue   = wallValues[counter];
                byte playerValue = playerValues[counter];

                if (wallValue == 0)
                {
                    emptyPixelsInTheWall++;

                    if (playerValue == playerAlpha)
                    {
                        playerPixelsInTheWall++;
                    }
                }
                else
                {
                    if (playerValue == playerAlpha)
                    {
                        playerPixelsOutTheWall++;
                    }
                }
            }

            //Pourcentage à l'intérieur du mur : nombre de pixels du joueur dans le trou / nombre de pixels de trou
            percent[0] = 100 * playerPixelsInTheWall / emptyPixelsInTheWall;
            //Pourcentage à l'extérieur du mur : nombre de pixels du joueurs hors du trou / (nombre total de pixels du joueur)
            percent[1] = 100 * playerPixelsOutTheWall / (playerPixelsOutTheWall + playerPixelsInTheWall);

            bmp.UnlockBits(bmpd);

            return(percent);
        }