/** * 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(); }
/** * 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; }
/** * 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); }