![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_26D7E1B5.jpg)
En principio ésta sería la última entrada de la serie correspondiente al análisis del código que se encuentra detrás de la aplicación “Simon Dice Renewed”, disponible desde hace poco mas de 2 semanas en el canal “windows7multitouch” en el repositorio de “codeplex”, y que en este corto periodo de tiempo ha sido descargado en mas de 50 ocasiones entre sus versiones:
Sin embargo debido a la densidad del contenido y a la amplitud del código a desarrollar se ha decidido ampliar a un capitulo mas, con lo cual se añadirá al final de la serie un “Anexo I” correspondiente a las funciones que no queden analizadas en esta entrada, y a una visión general del funcionamiento del juego.
Como se comento en la entrada anterior se proseguirá con la descripción de las funciones incluidas en la clase “MainWindow”:
· Btn_MouseLeftButtonDown y Btn_touchDown
Para la realización del juego es necesario guardar las pulsaciones de botones que se realizan en cada nivel. Por ello se añadirá a la lista “jugadas” un número que corresponda con el botón sobre el cual se ha hecho clic (o se ha pulsado según el caso), después se deberá asignar el sonido a reproducir y cambiar la apariencia del botón pulsado. Como último paso se reproducirá el sonido que ha sido establecido previamente.
Una observación que se ha querido hacer es que cuando se realiza una pulsación sobre la pantalla táctil se genera el evento “onTouch” correspondiente, al finalizar dicho evento se genera un segundo evento relacionado con el “hacer clic” sobre las coordenadas de la pulsación, es decir, se desencadena un evento “onLeftButtonClick”, con lo cual, si esta situación no es controlada podría generar el error.
Una de las formas de controlar si estamos accediendo a la aplicación mediante una tecnología táctil o mediante el uso de un ratón seria haciendo uso de una función contenida en la librería “Windows7.Multitouch”.Se comentara el código para una mejor visión del desarrollo realizado.
private void btn_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
// Si el equipo consta de capacidades digitales y está preparado para “Multitouch”
// se ejecuta el contenido de esta función, en caso contrario no se ejecuta nada.
if (!Windows7.Multitouch.TouchHandler.DigitizerCapabilities.IsMultiTouchReady)
{
// Se añade el botón pulsado a la lista “jugadas”
switch (((Image)(sender)).Name)
{
case "btn1": jugadas.Add(0); break;
case "btn2": jugadas.Add(1); break;
case "btn3": jugadas.Add(2); break;
case "btn4": jugadas.Add(3); break;
case "btn5": jugadas.Add(4); break;
case "btn6": jugadas.Add(5); break;
}
// Se establece el sonido que será reproducido
switch (((Image)(sender)).Name)
{
case "btn1": son = sonidobtn[0]; break;
case "btn2": son = sonidobtn[1]; break;
case "btn3": son = sonidobtn[2]; break;
case "btn4": son = sonidobtn[3]; break;
case "btn5": son = sonidobtn[4]; break;
case "btn6": son = sonidobtn[5]; break;
}
// Se cambia la apariencia de la imagen, simulando una pulsación.
switch (((Image)(sender)).Name)
{
case "btn1": btn1.Source = new BitmapImage(new Uri(@"pack://application:,,,/SimonDice;component/Img/" + "azul2.png"));
break;
case "btn2": btn2.Source = new BitmapImage(new Uri(@"pack://application:,,,/SimonDice;component/Img/" + "morado2.png")); break;
case "btn3": btn3.Source = new BitmapImage(new Uri(@"pack://application:,,,/SimonDice;component/Img/" + "rojo2.png")); break;
case "btn4": btn4.Source = new BitmapImage(new Uri(@"pack://application:,,,/SimonDice;component/Img/" + "verde2.png")); break;
case "btn5": btn5.Source = new BitmapImage(new Uri(@"pack://application:,,,/SimonDice;component/Img/" + "verdemar2.png")); break;
case "btn6": btn6.Source = new BitmapImage(new Uri(@"pack://application:,,,/SimonDice;component/Img/" + "naranja2.png")); break;
}
// Se reproduce el sonido guardado en la variable “son”.
Player.URL = System.IO.Directory.GetCurrentDirectory() + son;
Player.controls.play();
}
}
· Btn_MouseButtonUp y Btn_touchUp
Se describirá el funcionamiento de estas funciones por medio de los comentarios en el código.
private void btn_TouchUp(object sender, TouchEventArgs e)
{
// Se oculta la imagen de estado(el cual indica si ha habido error
// o si se ha completado el nivel con éxito
estado.Visibility = Visibility.Hidden;
// De vuelve a colocar su imagen del botón a su estado inicial.
switch (((Image)(sender)).Name)
{
case "btn1": btn1.Source = new BitmapImage(
new Uri(Environment.CurrentDirectory + "\\Img\\azul.png"));
break;
case "btn2": btn2.Source = new BitmapImage(
new Uri(@"pack://application:,,,/SimonDice;component/Img/" + "morado.png"));
break;
case "btn3": btn3.Source = new BitmapImage(
new Uri(@"pack://application:,,,/SimonDice;component/Img/" + "rojo.png"));
break;
case "btn4": btn4.Source = new BitmapImage(
new Uri(@"pack://application:,,,/SimonDice;component/Img/" + "verde.png")); break;
case "btn5": btn5.Source = new BitmapImage(
new Uri(@"pack://application:,,,/SimonDice;component/Img/" + "verdemar.png")); break;
case "btn6": btn6.Source = new BitmapImage(
new Uri(@"pack://application:,,,/SimonDice;component/Img/" + "naranja.png")); break;
}
// Se realiza la comprobación de si se ha cometido un error, la secuencia
// sigue correctamente, o si se ha alcanzado a completar la secuencia
// exitosamente por medio del método “comprobar” que será descrito a continuación.
int cmp = comprobar();
// Si la secuencia de pulsaciones aun no completa la lista de juego, y está siendo
// correcta nos saltaríamos este paso. En caso contrario, si hay error o se completa
// correctamente la secuencia de juego.
if (cmp != 1)
{
if (cmp == 0)
{
jugadas = new List<int>();// Reinicia la lista de jugadas.
// se hace visible el estado, y se cambia la imagen a mostrar
estado.Visibility = Visibility.Visible;
estado.Source = new BitmapImage(new
Uri(@"pack://application:,,,/SimonDice;component/Img/" + "vuelveAempezar.png"));
// Damos un tamaño al cuadro de estado.
estado.Height = 60;
estado.Width = 500;
// Posicionamos el cuadro de estado(imagen).
estado.SetValue(Canvas.LeftProperty, 95.0);//231 original
error();//Se lanza el método de error.
}else{
if (cmp == 2){
// se hace visible el estado, y se cambia la imagen a mostrar
estado.Visibility = Visibility.Visible;
estado.Source = new BitmapImage(
new Uri(@"pack://application:,,,/SimonDice;component/Img/" + "textomuybien.png"));
// Damos un tamaño al cuadro de estado.
estado.Height = 49;
estado.Width = 201;
// Posicionamos el cuadro de estado(imagen).
estado.SetValue(Canvas.LeftProperty, 231.0);//231 original
ganar();// Se lanza el método de ganar.
deshabilitarBotones();// Se deshabilitan los botones
jugadas = new List<int>();// Reinicia la lista de jugadas.
}
}
}
}
· Comprobar
La función comprobar como su propio nombre anuncia realiza la comprobación de si la secuencia de pulsaciones realizadas es correcta, si se ha completado con éxito, o si se ha cometido un error en el orden correcto de pulsaciones.
La llamada a dicha función devuelve uno de los siguientes valores:
-
0: Cuando se introduce erróneamente una pulsación en la secuencia.
-
1: Cuando la secuencia de pulsaciones lleva un orden correcto.
-
2: Cuando se ha finalizado la secuencia de forma correcta.
private int comprobar()
{
int retorno = 0;
// Si la lista de jugadas es mas pequeña que la lista de juego
if (jugadas.Count < lista.Count)
{
// Recorremos la lista de juego, y si coincide con los valores en las mismas
// posiciones es que la lista de juego esta siguiendo el orden correcto.
for (int i = 0; i < jugadas.Count; i++)
{
if (jugadas.ElementAt(i) == lista.ElementAt(i))
{
retorno = 1; // Sigue el orden correcto
}
else
{
retorno = 0; // Se ha cometido un error en la secuencia de pulsaciones.
i = jugadas.Count; //Se modifica el índice de iteración para salir del “for”
}
}
}
else
{
// Si la lista de botones jugados tiene el mismo tamaño que la lista de jugadas,
// solo pueden haber dos opciones, que se haya introducido mal el ultimo elemento
// o que la secuencia sea correcta.
if (jugadas.Count > lista.Count)
{
// Si por alguna extraña razón, la lista de pulsaciones es mas grande que la
// lista de juego, se deberá comprobar en función de la lista de juego si la
// secuencia de pulsaciones ha sido introducido correctamente, sin tomar en
// cuenta el excedente.
for (int i = 0; i < lista.Count; i++)
{
if (jugadas.ElementAt(i) == lista.ElementAt(i))
{
retorno = 2; // Todo ha sido correcto
}
else
{
retorno = 0; // Error
i = jugadas.Count; // Salida del bucle.
}
}
}
else
{
//Este es el caso antes mencionado, si ambas listas poseen el mismo tamaño.
for (int i = 0; i < jugadas.Count; i++)
{
if (jugadas.ElementAt(i) == lista.ElementAt(i))
{
retorno = 2;
}
else
{
retorno = 0; // Error.
i = jugadas.Count; // Salida del bucle.
}
}
}
}
return retorno;
}
· Error
private void error()
{
// Se detiene la reproducción de sonidos en el caso de que estuviera reproduciéndose
// algún sonido correspondiente a algún botón, se establece el sonido de error en la
// salida de audio y posteriormente se procede a reproducirse el sonido.
Player.controls.stop();
Player.URL = System.IO.Directory.GetCurrentDirectory() + sonidoError;
Player.controls.play();
deshabilitarBotones();// Se deshabilitan los botones hasta que se pulse en “Play”
// Se habilita el botón “play” y se cambia a la apariencia normal, es decir, listo
// para jugar.
btnJugar.IsEnabled = true;
btnJugar.Source = new BitmapImage(new
Uri(@"pack://application:,,,/SimonDice;component/Img/" + "btnJugar.png"));
// En el caso de que se cometa un error el número de intentos debería bajar una
// unidad y en el caso de que llegue a 0, se emitirá un panel de dialogo en el que se
// muestra el resultado final de la ejecución de juego, volviendo al lienzo de
// inicio, reiniciándose el ciclo del juego.
txtIntentos.Text = Convert.ToString(Convert.ToInt32(txtIntentos.Text) - 1);
bajarNivel();
if (Convert.ToInt32(txtIntentos.Text) == 0) {
Resultado res = new Resultado();
res.lblResultado.Content = txtPuntuacion.Text;
res.WindowStartupLocation = WindowStartupLocation.CenterScreen;
res.ShowDialog();
res.WindowState = WindowState.Maximized;
cancelarEjecucion();
inicializarJuego();
juego.Visibility = Visibility.Hidden;
Inicio.Visibility = Visibility.Visible;
}
}
· ganar
// Cuando se termine correctamente la secuencia de pulsaciones, se lanzará este método.
private void ganar()
{
// Se establece como sonido para ser reproducido un sonido de vítores , se sube de nivel
// y se sube la puntuación 5 veces el nivel que se haya superado
Player.URL = System.IO.Directory.GetCurrentDirectory() + sonidofinal;
Player.controls.play();
txtPuntuacion.Text = Convert.ToString(Convert.ToInt32(txtPuntuacion.Text) + nivel * 5);
subirNivel();
btnJugar.IsEnabled = true;
btnJugar.Source = new BitmapImage(new
Uri(@"pack://application:,,,/SimonDice;component/Img/" + "btnJugar.png"));
}
En el próximo post y ultimo de la serie de procederá finalizará la descripción de los métodos incluidos en la clase “MainWindow”, y se hará la tan comentada visión general de la aplicación.
![clip_image003[4] clip_image003[4]](http://www.windowstecnico.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image0034_5F00_65C96250.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 13 2011, 06:24
por
Jhonattan Fiestas