La presente entrada corresponde con el anexo anunciado en el post previo con el cual se pretende cerrar la dilatada serie “Desarrollo de aplicación de ejemplo Windows7 Multitouch: Simon Dice Renewed” sobre el comportamiento de la aplicación de ejemplo Simón Dice.
Durante el transcurso del análisis se presentaran diversas formas de ver el juego que han sido desarrollados por diversas personas, que a lo largo del tiempo han dedicado parte de su tiempo a programar este juego, cada uno con su toque personal y diferente.
![clip_image001[4] clip_image001[4]](http://www.windowstecnico.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image0014_5F00_thumb_5F00_34F524A4.png)
Como se venía comentando en la anterior entrada, en esta ocasión se centrara la atención en definir las últimas funciones pertenecientes a la clase “MainWindow”, y hacer un repaso general sobre lo aprendido a lo largo de toda la serie.
![clip_image002[4] clip_image002[4]](http://www.windowstecnico.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image0024_5F00_thumb_5F00_3685A4DE.png)
Lo primero a realizar será el análisis y descripción de las funciones por medio de enunciados y/o comentarios sobre código para facilitar de esta manera el conocimiento de la aplicación en cada uno de sus líneas de código.
· inicializarJuego
Como su propio nombre indica esta función es llamada al inicio de la partida, para colocar los valores de inicio, como son el número de intentos y la puntuación de la partida actual.
private void inicializarJuego()
{
txtIntentos.Text = "3";
txtPuntuacion.Text = "0";
estado.Visibility = Visibility.Hidden;
}
· nuevaLista
Esta función tiene como objetivo crear una lista y añadir aleatoriamente números del 0 al 6 hasta completar la longitud (“Length”), finalmente copiamos el puntero de esta lista(variable local) a la lista de juego (que es una variable global).
public void nuevaLista(int length)
{
List<int> lista2 = new List<int>();
int i = 0;
while (i < length)
{
int numero = (int)r.Next(0, 6);
lista2.Add(numero);
i++;
}
lista = lista2;
}
![clip_image003[4] clip_image003[4]](http://www.windowstecnico.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image0034_5F00_thumb_5F00_4BA384B9.png)
· establecerSonido
Esta función tiene un cometido lógico y bastante fácil de comprender. Una vez establecidos los sonidos en el array de string “sonidobtn”, según sea el botón pulsado, se establece el valor en la variable “son”, para que después sea reproducido por el objeto de la clase Windows Media Player llamado “Player”.
private void establecerSonido(int btn)
{
switch (btn)
{
case 0: son = sonidobtn[0];
break;
case 1: son = sonidobtn[1];
break;
case 2: son = sonidobtn[2];
break;
case 3: son = sonidobtn[3];
break;
case 4: son = sonidobtn[4];
break;
case 5: son = sonidobtn[5];
break;
default: son = sonidobtn[0]; break;
}
}
![clip_image004[4] clip_image004[4]](http://www.windowstecnico.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image0044_5F00_thumb_5F00_7231C56C.png)
· ImagenNormal
Tanto la función “ImagenNormal” como la función “ImagenPulsada” tienen un cometido en común, diferenciar la apariencia del botón cuando éste está siendo pulsado y cuando no. En ambos casos se indica el botón que cambiará de apariencia y porque imagen será reemplazada.
private void imagenNormal(int btn)
{
try
{
switch (btn)
{
case 0: btn1.Source = new BitmapImage(
new Uri(@"pack://application:,,,/SimonDice;
component/Img/azul.png"));
break;
case 1: btn2.Source = new BitmapImage(
new Uri(@"pack://application:,,,/SimonDice;
component/Img/morado.png"));
break;
case 2: btn3.Source = new BitmapImage(
new Uri(@"pack://application:,,,/SimonDice;
component/Img/rojo.png"));
break;
case 3: btn4.Source = new BitmapImage(
new Uri(@"pack://application:,,,/SimonDice;
component/Img/verde.png"));
break;
case 4: btn5.Source = new BitmapImage(
new Uri(@"pack://application:,,,/SimonDice;
component/Img/verdemar.png"));
break;
case 5: btn6.Source = new BitmapImage(
new Uri(@"pack://application:,,,/SimonDice;
component/Img/naranja.png"));
break;
default: System.Windows.MessageBox.Show("Boton: " + btn); break;
}
}
catch
{
imagenNormal(btn);
}
}
private void imagenpulsada(int btn)
{
switch (btn)
{
case 0: btn1.Source = new BitmapImage(
new Uri(@"pack://application:,,,/SimonDice;
component/Img/azul2.png"));
break;
case 1: btn2.Source = new BitmapImage(
new Uri(@"pack://application:,,,/SimonDice;
component/Img/morado2.png"));
break;
case 2: btn3.Source = new BitmapImage(
new Uri(@"pack://application:,,,/SimonDice;
component/Img/rojo2.png"));
break;
case 3: btn4.Source = new BitmapImage(
new Uri(@"pack://application:,,,/SimonDice;
component/Img/verde2.png"));
break;
case 4: btn5.Source = new BitmapImage(
new Uri(@"pack://application:,,,/SimonDice;
component/Img/verdemar2.png"));
break;
case 5: btn6.Source = new BitmapImage(
new Uri(@"pack://application:,,,/SimonDice;
component/Img/naranja2.png"));
break;
default: System.Windows.MessageBox.Show("Boton: " + btn);
break;
}
}
· midiOutOpen
Esta función hace llamadas a la API de Windows en relación con la apertura de dispositivos de salida, como puede ser los altavoces del equipo. Para poder hacer uso de estas funciones se tiene que agregar la referencia a la librería “winmm.dll” de Windows Media Player, como se puede apreciar en el código que la implementa.
[DllImport("winmm.dll")]
private static extern int midiOutOpen(ref int handle, int deviceID,
MidiCallback proc, int instance, int flags);
![clip_image005[4] clip_image005[4]](http://www.windowstecnico.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image0054_5F00_thumb_5F00_7E32F3F9.png)
· btnJugar_MouseLeftButtonDown y btnJugar_TouchDown
Cuando el usuario se encuentra en el lienzo de juego y pulsa sobre el botón jugar, se debe comprobar que el nivel sea superior a 0, ya que si se llega al caso de que el nivel sea cero se cambiará el valor del nivel a 1, hasta que se gasten todos los intentos disponibles. Recordad que el número de elementos de la lista de juego depende del nivel, por eso mismo, nunca debe ser cero, y como mínimo deberá bajar hasta 1.
Una vez pulsado sobre el botón “Jugar”, se reproducirá la secuencia de pulsaciones correspondiente a los elementos que se encuentran en la lista “lista”.
private void btnJugar_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
estado.Visibility = Visibility.Hidden;
nivel=nivel==0?1:nivel;
txtRonda.Text = String.Format("{0}", nivel);
btnJugar.Source = new BitmapImage(
new Uri(@"pack://application:,,,/SimonDice;component/Img/"
+ "btnJugar2.png"));
btnJugar.IsEnabled = false;
nuevaLista(nivel);
habilitarBotones();
jugarLista();
}
· btnJugar_MouseLeftButtonUp_1 y btnJugar_TouchUp
Cuando se deja de pulsar el botón debe recuperar su imagen habitual, de esta forma da una sensación de pulsado.
private void btnJugar_MouseLeftButtonUp_1(object sender, MouseButtonEventArgs e)
{
btnJugar.Source = new BitmapImage(
new Uri(@"pack://application:,,,/SimonDice;component/Img/" + "btnJugar.png"));
}
· btnSalir_MouseLeftDown y btnSalir_TouchDown
Cuando se ejecute esta función, se cambia del lienzo de juego al lienzo de inicio, cancelando la reproducción de sonidos si el caso lo requiere.
private void btnSalir_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
juego.Visibility = Visibility.Hidden;
Inicio.Visibility = Visibility.Visible;
cancelarEjecucion();
}
· btnSalirTotal_MouseLeftDown y btnSalirTotal_TouchDown
En ambos casos, la acción de este método conlleva la salida de la aplicación y el cerrado de la interfaz de usuario asociada a la aplicación.
private void btnSalirTotal_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
System.Windows.Forms.Application.Exit();
this.Close();
}
· cancelarEjecucion
Cuando se da al botón salir, desde el lienzo del juego, se debe cancelar la ejecución del reproductor de sonidos y vaciar la lista de juego, para que en la próxima entrada al juego dicha lista esté vacía y no tenga ningún valor en su contenido.
private void cancelarEjecucion()
{
lista = new List<int>();
Player.controls.stop();
}
Secuencia de juego:
Al iniciar la aplicación se lanza el evento “OnLoad” con su función “WindowsLoaded” asociada, para inicializar variables.
Luego se ejecuta “InicializarBotones” junto con “Deshabilitarbotones” para evitar que alguien pulse cuando aún no es necesario, aquí se detiene la ejecución de la aplicación a la espera de una acción del usuario.
En el caso de pulsar sobre el botón “Jugar” se lanzaría la función “btnEntrar_TouchDown”, en caso contrario si se pulsa sobre el botón de salir se ejecutaría la función “btnSalirTotal_TouchDown”, saliendo completamente del proyecto.
Si se sigue por la primera vía, se pasaría otra vez a un estado de espera hasta que el usuario pulse sobre “jugar” con lo que se desencadena la función “btnJugar_touchDown”, dentro del cual se ejecutan las funciones “nuevaLista”,”habilitarBotones” y “jugarLista”, dentro de esta última función se ejecutan las siguientes acciones: Por cada elemento de la lista de juego se genera una pulsación virtual (“imagenpulsada”), después se deshabilitan los botones hasta que termine la secuencia a reproducir(“deshabilitarBotones”), se establece un sonido (“establecerSonido”), se reproduce y por último la imagen que ha sido cambiada debe volver a su estado original.(“imagenNormal”) hasta que por último se habilitan los botones para ser pulsados(“habilitarBotones”).El siguiente paso es pulsar sobre el botón adecuado siguiendo la secuencia correcta. Al pulsar sobre cualquier botón se ejecutará la función “btn_TouchDown” y posteriormente al dejar de pulsar pasara a ejecutarse “btn_TouchUp” relativo a dejar de pulsar sobre dicha imagen.
Si la pulsación es correcta, se ira a la función “comprobar” y proseguirá con la secuencia hasta reproducirla por completo, con los cual se ejecutaría la función “ganar”; en caso contrario, si el usuario se equivoca en un paso se lanzaría la función “error” bajando un nivel del actual, hasta un mínimo de 1.
Básicamente estas serían las funciones esenciales que describen el funcionamiento de la aplicación. Si se desea una descripción más específica de cada una de ellas siempre se puede acceder a cada una de las entregas de esta serie mediante los enlaces que aparecen debajo.
Sin más que añadir, desde Windows Técnico se espera que esta serie haya servido para introducir un punto más de inquietud en los desarrolladores para la creación de aplicaciones para este tipo de dispositivos y al uso de las herramientas amigables que proporciona Microsoft a través de Visual Studio 2010 y Windows Presentation Fundation.
Para acabar, recuerda que si quieres aprender mucho más sobre los secretos de los sistemas Microsoft Windows, te recomendamos leer el libro de Sergio de los Santos "Máxima Seguridad en Windows: Secretos Técnicos" , o siempre puedes suscribirte al Canal RSS de Windows Técnico para estar al día de las novedades e información técnica de interés.
![clip_image006[4] clip_image006[4]](http://www.windowstecnico.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image0064_5F00_thumb_5F00_4FB922B2.png)
---------------------------------------------------------------------------------------------------------------------------
Desarrollo de aplicación de ejemplo Windows 7 Multitouch: “Simón Dice Renewed” I
Desarrollo de aplicación de ejemplo Windows 7 Multitouch: “Simón Dice Renewed” II
Desarrollo de aplicación de ejemplo Windows 7 Multitouch: “Simón Dice Renewed” III
Desarrollo de aplicación de ejemplo Windows 7 Multitouch: “Simón Dice Renewed” IV
Desarrollo de aplicación de ejemplo Windows 7 Multitouch: “Simón Dice Renewed” V
Desarrollo de aplicación de ejemplo Windows 7 Multitouch: “Simón Dice Renewed”. Anexo
----------------------------------------------------------------------------------------------------------------------------
Enviado
sep 15 2011, 09:06
por
Jhonattan Fiestas