viernes, 4 de diciembre de 2015

Reto 2: Lanzar aplicaciones c#

Lanzar una aplicacion dentro de otra usando C#

Realizando una rápida busqueda por internet entontramos como hacerlo, primero necesitas incluir las librerias necesarias

using System;
using System.Diagnostics;

Una vez incluidas, ya podemos llamar a un proceso desde nuestra aplicación, para ello es necesario declarar un proceso:
 ProcessStartInfo startInfo = new ProcessStartInfo();
Le añadimos las opciones que vemos a continuacion para que ejecute una ventana nueva y que no lo haga des del shell de windows:
startInfo.CreateNoWindow = false;
                startInfo.UseShellExecute = false;
Y añadirle el path del proceso que desees lanzar, así como sus argumentos si los requiere:
 startInfo.FileName = path;
startInfo.Arguments = " " + args;
Una vez hecho esto ya esta todo declarado, solo es necesario llamarlo y ejecutarlo, para ello lo meteremos en un "Try-catch" con el fin de que si se produce una excepcion durante la ejecución captarla:
                try
                {
                   //Empieza el proceso con toda la información puesta anteriormente.
                    using (Process execProcess = Process.Start(startInfo))
                    {

                    }
                }
                catch
                {
                    Console.WriteLine("Error");
                }
Una vez hemos aprendido como lanzar procesos, añadir esto a nuestros botones lanzadores resulta fácil, solo necesitamos que al hacer click en cada botón de icono de cada juego cambie el path a la dirección en la que se encuentra dicho juego y los argumentos. Y en el botón lanzar juego que lanze el proceso con los argumentos posteriormente asignados al seleccionar el juego.

Reto 2: Desarrollo

Empezamos


Vamos a crear un menú de juegos, llamado Game Menu, así que para ello necesitamos crear una interfaz que interactue con el usuario. Para ello vamos a modificar el archivo MainWindow.xaml, en dicho archivo vamos a crear una ventana de 1030 por 730 pixeles, empleando la herramienta Blend de Visual Studio:



La ventana en xaml tiene el siguiente codigo:

<Window x:Name="mainW"
WindowStartupLocation="CenterScreen"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Class="Microsoft.Samples.Kinect.BodyBasics.MainWindow"
 Title="Game Menu" 
 Visibility="Visible"
 Height="730" Width="1030" 

Una vez creada la ventana le vamos a añadir los botones de jugar y exit, los iconos de los juegos y un pequeño display que te diga el juego que tienes seleccionado actualmente.

Empezaremos creando los botones de jugar, para ello con blend añadimos dos botones utilizando la interfaz gráfica quedando de esta manera:

<Button Visibility="Visible" x:Name="jugar" Content="Jugar" HorizontalAlignment="Left" Height="100" Margin="27,555.2,0,0" VerticalAlignment="Top" Width="444" FontSize="40" Click="Button_Launch" FontWeight="Bold">
            <Button.Background>
                <ImageBrush ImageSource="button.png"/>
            </Button.Background>
        </Button>

Así para cada botón que añadimos, como podemos ver con ImageBrush añadimos una imagen al botón, para darle textura, en este caso en Background, aunque también dispone de otras opciones, en este caso la pondremos en background para que así al pulsar el botón no desaparezca la textura.

Una vez creados estos botones añadimos tres botones más, cuya función sera la elección del juego a lanzar. Para ello creamos tres botones con las herramientas mencionadas anteriormente y le añadiremos una foto que contenga el icono del juego en cuestión de background. En nuestro caso hemos elegido el Hearthstone, League of legends y Mario Kart.

Como toda aplicación tiene que tener también unas instrucciones de uso para el usuario final, así que decidimos añadir dos diapositivas que contengan las instrucciones a modo de carta de presentación.
Para ello crearemos dos botones que se muestren al tamaño de la ventana y le añadiremos las texturas de las diapositivas, que previamente hemos exportado como jpeg o png.

Una vez hecho esto solo queda añadirle la funcionalidad a los botones y crear la secuencia para que se muestren los botones según corresponde.

Para ello en cada botón escribiremos el evento click que realiza, que se corresponde con una función. Ej:

 Click="Button_Launch"

Y creamos la funcion con el mismo nombre:

 private void Button_Launch(object sender, RoutedEventArgs e)
        {

Y en la función le añadimos toda la funcionalidad que le queramos dar al botón, por ejemplo cambiar la visibilidad de otro botón etc.

En los botones de los juegos y en lanzar exit añadiremos funcionalidad extra, destinada a lanzar cada aplicación, pero esto lo veremos en el siguiente apartado.

Reto 2 Kinect

Motivación


Con motivo de la segunda práctica de la asignatura de 4º GI de la UGR, NPI (Nuevos Paradigmas de Interacción) se nos propone el siguiente reto:

En esta práctica debéis crear una aplicación que utilice interacción gestual. El tema es libre pero se recomienda consultar con el profesor antes de comenzar la aplicación.

El objetivo principal, y por tanto el que se va a evaluar, es la inclusión de elementos interactivos en la aplicación. El resto de la misma puede ser reutilizado de otro desarrollo anterior o de alguna aplicación de la que se tenga acceso al código fuente.






Ejemplo de elementos interactivos.


Las actividades a realizar son las mismas que se pedían en la práctica anterior:

- Desarrollar la aplicación como tal.

- Escribir la documentación, un tutorial detallado.

¿Qué hacemos?


He aquí la pregunta. Nuestra primera idea fue ejecutar un emulador de la GameBoy Advance en windows con el juego Mario Kart, y utilizar Kinect para manejarlo. 

Emular un volante con las manos exactamente así

Pero en el desarrollo de esta aplicación tuvimos problemas, pues al enviar eventos desde teclado hacia el emulador, la cantidad de veces que puedes enviar una tecla es inferior al numero de veces que se envia una letra al pulsarla directamente desde teclado, es decir el flujo era insuficiente.

Por lo que el coche no se movía y nos vimos obligados a cambiar de idea.

Segunda idea


Nuestra segunda idea propuesta consiste en realizar un menú lanzador de juegos, utilizando tu mano como ratón para seleccionar las opciones o juego que quieres jugar y poder jugarlo utilizando tu mano o el teclado/ratón. Como por ejemplo jugar a Hearthstone Link Hearthstone utilizando tu mano para jugar, seleccionar las cartas y etc. 

Captura Hearthstone

Una vez nos dimos cuenta de que la primera idea no la podíamos realizar por el problema mencionado anteriormente, nos pusimos en marcha con la segunda. Cuyo desarrollo será contado a continuación