Examen Curso 2001-2002. Convocatoria de Febrero Página 1 Ejercicio 1. Desarrollar un pequeño juego de tiro al blanco. Este ejercicio se divide en dos partes con el fin de que el alumno no intente afrontarlo en su totalidad ya que podría entrañar bastante dificultad. De esta manera la primera parte sirve como base de la segunda y con la primera completada el alumno conseguiría un notable en este ejercicio. Si se quiere conseguir la máxima nota, se tendrá que realizar la segunda parte (cosa no muy difícil ya que sólo hay que añadir ciertos detalles a lo ya implementado). Si se intenta hacer la segunda parte sin acabar la primera, el ejercicio resultará mucho más difícil de realizar. Paso 1. Introducción (Primera Parte) Este juego consiste en acertar con el ratón a una serie de “proyectiles” que van cayendo desde arriba y evitar así que los proyectiles alcancen su “objetivo” (representado con una línea recta dibujada debajo). Para interceptar a los proyectiles, bastará con situar el ratón encima de ellos, entonces el cursor del ratón cambiará indicando que se puede hacer blanco pulsando el botón del ratón. En la Figura 1 se muestra una imagen de la ventana de la aplicación que hay que realizar en la primera parte. Se aconseja a los alumnos que practiquen con el fichero Proyectil_1.exe que se les proporciona. Hay que ejecutarlo las veces que haga falta hasta que se esté seguro de saber que tiene que hacer el programa. Eso significa jugar con la aplicación probando todos los posibles casos. Figura 1. Ventana de Proyectil_1 Cuando el alumno se haya familiarizado con el funcionamiento del programa, debería abrir el Visual Basic y crear un proyecto Proyectil.vsp. Se recomienda encarecidamente que cada vez que el alumno consiga algo nuevo (creación de la interfaz, conseguir que se mueva el proyectil, etc), haga una copia de seguridad en otro directorio. El ejercicio puede parecer complicado si se trata de abordar en su conjunto sin tener una idea clara de los pasos a seguir. Para evitar este problema se van a enumerar una serie de pasos que facilitan la resolución del ejercicio. Evidentemente no es imprescindible seguirlos, pero es la manera más rápida y más directa de hacerlo, porque tiene separados todos los problemas que presenta el ejercicio. Esto hace que en cada paso haya que solventar problemas muy sencillos. Además se debe tener en cuenta que el criterio de corrección está basado en estos pasos. Examen Curso 2001-2002. Convocatoria de Febrero Página 2 Paso 2. Creación de la interfaz gráfica En este apartado el alumno SÓLO tiene que preocuparse de conseguir una interfaz gráfica con el mismo aspecto que la dada en la Figura 1 (no hace falta programar todavía ningún evento). Los elementos de los que consta son los siguientes: - Un pictureBox en el que se dibujarán los proyectiles y la línea que representa el límite. Los proyectiles hay que representarlos como shapes con forma circular. - Una caja de texto indicando cuántos proyectiles se han alcanzado. - Otra caja de texto en la que hay que ir poniendo los proyectiles que han llegado a la línea del límite permitido. - Varios etiquetas explicando el significado de cada caja de texto. - Tres botones: uno para empezar/parar, otro para resetear el juego y que todo vuelva al inicio, y otro para salir de la aplicación. - Por supuesto para conseguir el movimiento de los proyectiles hace falta un timer. Paso 3. Inicialización En este paso hay que empezar a inicializar ciertos objetos. Lo principal que tiene que conseguir el alumno es poder mover el proyectil. De momento sin ninguna lógica, simplemente que se mueva en la dirección correcta. Para conseguir esto hay que inicializar antes ciertos controles: - El pictureBox hay que escalarlo desde el código y las coordenadas irán desde el (0, 0) hasta el (100, 100) - El intervalo del timer será de 200 milisegundos. A continuación sólo queda mover el proyectil (usar un valor de 2 unidades para ir incrementado la posición). Antes de pasar a los siguientes apartados el alumno debería haber conseguido esto último. Es mejor realizarlo ahora cuando el ejercicio acaba de comenzar. Paso 4. Botones Aquí se describe la funcionalidad de los botones: - Start/End: este botón simplemente activará o parará el timer del juego. Hay que tener en cuenta que el texto del botón también cambia según esté parado o no el juego. - Salir: terminar la aplicación. - Reset: empezar de nuevo el juego. Esto implica poner a 0 las cajas de texto que llevan los contadores, poner el timer otra vez a 200 ms y llamar a una función que calcule una nueva posición para el proyectil. Esta función nuevaPosicion() tiene que posicionar el proyectil otra vez en la parte superior del pictureBox. La coordenada ‘Y’ la conocemos gracias al margen del pictureBox pero la coordenada ‘X’ hay que sacarla aleatoriamente (para que el proyectil no salga siempre en la misma posición). Sabiendo que el pictureBox mide 100 y la función Rnd() te devuelve un número aleatorio entre 0 y 1, se puede calcular la nueva coordenada ‘X’ (hay que tener en cuenta la anchura del proyectil). IMPORTANTE: siempre que se use Rnd(), en la línea anterior hay que poner la instrucción Randomize. Examen Curso 2001-2002. Convocatoria de Febrero Página 3 Paso 5. Detección de la línea límite Cada vez que se mueve el proyectil hay que mirar a ver si ha alcanzado la línea límite. Para eso habrá que hacer una función detectLine() en la cuál se compara la posición del proyectil con la coordenada ‘Y’ de la recta. Si se detecta impacto, entonces hay que incrementar la caja de texto que lleva la cuenta de impactos. Además, el juego sólo tiene 3 oportunidades, por lo que si se detecta que han ocurrido 3 impactos hay que parar el juego y sacar unos mensajes por pantalla (mirar el fichero Proyectil_1.exe para ver los mensajes). Paso 6. Control del Timer El juego tiene nivel de dificultad, así que cada 5 segundos hay que acelerar la velocidad del juego. Para ello se usará un segundo timer el cual tendrá que ser inicializado a 5000 milisegundos. Para acelerar el juego, sólo habrá que decrementar el timer de movimiento en el evento de este segundo timer. Por ejemplo, decrementar en 20 milisegundos el timer del movimiento. Cuidado con que el timer del movimiento no llegue a 0 porque en ese caso el juego se pararía, para arreglarlo se puede dejar de decrementar cuando el timer llegue a un valor mínimo de 20. Paso 7. Eventos del ratón Para terminar de desarrollar el juego sólo queda por gestionar los eventos del ratón para la interceptación de los proyectiles. Hace falta programar 2 eventos de ratón: el de posición (MouseMove) y el de botón pulsado (Click). - MouseMove: con este evento hay que testear si las coordenadas del ratón coinciden con las coordenadas del proyectil (hay que usar las propiedades Top, Left, Height y Width del shape). En ese caso hay que cambiar el cursor del ratón (el puntero de cruz es el número 2). - Click: si se pulsa el botón del ratón (y además se ha detectado que el ratón está encima del proyectil) entonces hay que incrementar la caja de texto que lleva la cuenta del número de proyectiles alcanzados y llamar a la función que calcula una nueva posición del proyectil. Paso 8. Introducción (Segunda Parte) Si el alumno ha conseguido realizar todo lo que se pedía en la primera parte, entonces está en condiciones de hacer esta segunda parte que no es más que una ampliación del juego para que aparezcan más proyectiles. Tal y como aparece en la Figura 2, el aspecto de la interfaz es el mismo salvo que en lugar de un proyectil, ahora aparecen tres proyectiles. Examen Curso 2001-2002. Convocatoria de Febrero Página 4 Figura 2. Ventana de Proyectil_2 Para ver cómo funciona el programa, el alumno puede ejecutar el archivo Proyectil_2.exe que se facilita. Como se puede comprobar rápidamente, el funcionamiento es exactamente el mismo pero con tres proyectiles. Entonces, lo que antes se hacía con un solo shape (por ejemplo la función detectLine()) ahora hay que hacerlo para los tres shapes. De todas formas, no todo es tan simple como copiar tres veces lo que ya se hacía antes. Aquí se dan unas pistas para orientar al alumno hacia una posible solución (se puede hacer con matriz de controles o con controles independientes, a elección del alumno): - La función nuevaPosicion() cambia un poco y ahora necesita un argumento de entrada en el que se le indica el proyectil (1, 2 ó 3) que hay que cambiar de posición. nuevaPosicion (numero As Integer) - Ahora cuándo se pulsa el botón del ratón, no se sabe sobre qué proyectil está situado el cursor. Para ello habrá que crear una variable global (de nombre marcado por ejemplo) en la que se guardará el proyectil (1, 2 ó 3) que se está apuntando. Gracias a esta variable al pulsar el botón se puede llamar a la función de forma: nuevaPosicion(marcado).