MIT OpenCourseWare


6.170 Curso práctico en Ingeniería de Software.

Página principal
¿Qué es OCW?
Ayuda
Feedback
Preguntas frecuentes
Glosario
 
 
Página principal del curso
Programa
Calendario
Material de clase
Trabajos
Exámenes
  Lecturas obligatorias
  Otras fuentes
  Prácticas
  Clases de repaso
  Herramientas
Proyectos

   MIT

   
 

Projectos

Puede consultar as correcciones de este documento aquí

Boletín sobre GB

Contenido:

Introducción

Su proyecto final consiste en diseñar, documentar, construir y testear un programa que juegue a Gizmoball. Gizmoballes una versión de pinball, un videojuego cuyo objetivo es hacer que una bola se mueva por todo el juego, sin que se caiga en la la parte inferior del área del mismo. El jugador controla un conjunto de impulsores que pueden batear la bola cuando ésta va a caer.

La ventaja de Gizmoball con respecto a una máquina de pinball tradicional es que Gizmoball permite que los usuarios puedan construir la propia distribución de su máquina colocando piezas (como reboteadores, impulsores y túneles espaciales) en el campo de juego. Estas distribuciones de la máquina pueden construir también complejos artefactos de "Rube Goldberg" cuyo objetivo principal es ser observados, y no servir de juego. (Si no sabe qué es una máquina de Rube Goldberg, visite http://www.anl.gov/OPA/rube/index.html o http://www.rube-goldberg.com/). A modo de ampliación opcional, (después de que haya diseñado, documentado, implementado y testeado toda la funcionalidad necesaria), puede crear una nueva diversidad de piezas que puedan colocarse en el campo de juego.


Inicio

Visión general de Gizmoball

Dado que este proyecto es en parte un ejercicio de diseño, el trabajo especifica lo que el usuario debería poder realizar y deja que usted, bajo su propio criterio, calcule qué módulos e interfaces son los adecuados. Esta sección le proporciona una visión de conjunto de Gizmoball. En el Apéndice 1 se le facilitará una especificación más detallada. Para posibilitar un testeo automático, su implementación debe contar con un formato de fichero (descrito en el Apéndice 2), además de la interfaz gráfica de usuario especificada a grosso modo.

Gizmoball posee una interfaz gráfica de usuario con dos modos, modo construcción y modo ejecución. En modo construcción, un usuario puede:

  • crear y editar reboteadores cuadrados, circulares y triangulares sobre la superficie de juego,

  • crear y editar impulsores,

  • conectar la acción de los impulsores y los reboteadores con los lanzadores, cuando, por ejemplo, se pulsa una tecla o uno de los reboteadores ha sufrido un choque, y

  • guardar y cargar la configuración del juego de usuario en un fichero.

En modo ejecución, el usuario puede comenzar a jugar.


Captura de pantalla de una implementación de Gizmoball.
Su implementación puede parecer distinta, y es posible que el movimiento de su bola no se corresponda exactamente con la animación que se le ha facilitado.

El dibujo de arriba ilustra las características más sobresalientes de Gizmoball.
  • Una herramienta en forma de paleta en el lateral, le facilita al usuario diversas operaciones (cuadrado, círculo, triángulo, impulsor) para colocar piezas en el área de juego.
  • Una barra de herramientas "modificaciones" en la parte inferior, proporciona al usuario una variedad de operaciones (mover, borrar, girar) para poder editar las piezas del área de juego.
  • La barra de herramientas "modificaciones" posee también un botón connect (conectar) que conecta el lanzador de una pieza con la acción de otra. Una vez pulsado este botón, el usuario podrá conectar piezas entre sí. Por ejemplo, el usuario podría pulsar el botón conectar, hacer clic en uno de los reboteadores circulares y luego hacer otro clic en uno de los impulsores. Como resultado, cada vez que el lanzador del reboteador se active (que ocurre cuando una bola choca con el reboteador), tendrá lugar la acción del impulsor (girar alrededor de su pivote). Otra posibilidad podría ser que el usuario pulsara el botón conectar, a continuación una tecla, que luego contestara a una pregunta sobre si el pulsado de la tecla up (arriba) o down (abajo) resulta de interés y, acto seguido, hacer clic en uno de los impulsores. En consecuencia, cada vez que el usuario pulse (o suelte) esa tecla, el impulsor se moverá. La misma pieza puede ser activada por varios lanzadores.
  • La barra púrpura que cruza la parte inferior del área de juego es la pieza túnel espacial. Cuando una bola entra en el túnel espacial, se para y queda sostenida en la esquina inferior derecha de éste. La acción que el túnel espacial debe ejecutar es disparar la bola que está sosteniendo (si hay alguna) directamente hacia la parte superior del área de juego. El conectar el túnel espacial a sí mismo, permite que el juego entre en un bucle continuo: cada vez que una bola entra en el túnel espacial, ésta vuelve a ser lanzada inmediatamente.
  • El menú de la parte superior de la ventana permite al usuario guardar o cargar las configuraciones del juego y ejecutar o detener el mismo. En la animación, el juego está en funcionamiento: la bola es el círculo azul pequeño que comenzó en la esquina inferior derecha. La bola rebota en los reboteadores rojo, verde y azul, y es golpeada por los impulsores amarillos.

Inicio

Calificación y programa

Trabajarán en grupos de tres o cuatro personas. Todos los miembros de un equipo obtendrán la misma nota, excepto en circunstancias poco comunes.
ETAPA % DE LA CALIFICACIÓN DEL PROYECTO CALIFICACIÓN BASADA EN
Diseño preliminar
10%
¿Han identificado las cuestiones?
Reuniones semanales con los ayudantes técnicos
5%
¿Han participado todos los miembros del grupo de manera constructiva?
Entrega preliminar
25%
¿Es un buen diseño? ¿Comprende toda la funcionalidad exigida?
Crítica del diseño
25%
¿Se han analizado meticulosamente las diferentes versiones y alternativas?
Implementación y testeo
35%
¿Funciona? ¿Lo han demostrado?
Debería entregar cada sección de este trabajo a su ayudante técnico en formato electrónico y/o en papel. Todo el código fuente y el compilado debería colocarse en línea el 10 de dic. de 2001, en su directorio del proyecto del grupo. Debido a las limitaciones del fin del trimestre, no aceptaremos ningún trabajo que se entregue fuera de plazo.

Inicio

Diseño preliminar

El diseño preliminar deberá entregarse en papel en la fecha señalada.

Su diseño preliminar no debería ocupar más de 15 páginas. El documento será un subconjunto de aquel descrito en el boletín Cómo documentar un sistema de software. Consistirá en una especificación revisada, un diseño (que incluya un problema del modelo de objeto), y una visión general de la implementación (que incluya un código del modelo o modelos del objeto y un diagrama de dependencia de módulos). No es necesario que adjunte información sobre su estrategia de validación.

La especificación revisada, el diseño y la visión general de la implementación deberán tratar entre otras cuestiones:

  • el editor utilizado por los usuarios para construir las consolas del juego. Por ejemplo, la especificación debería incluir dibujos o capturas de pantalla del editor y casos de uso para tareas en modo de contrucción básico.
  • su bucle de física, que describe cómo y en qué orden se han controlado el movimiento, la detección del choque y su resolución, el lanzamiento, la fricción/gravedad, el dibujo y otros factores.
  • el sistema de lanzamiento que conecta los lanzadores con las acciones.

El diseño preliminar debería incluir también un plan de proyecto, que enumere los hitos del equipo y la asignación de tareas para cada miembro del grupo. Un hito es lo que se espera que esté hecho para alguna fecha, como por ejemplo, un módulo testeado o una característica del funcionamiento, un logro que sea objetivo, fácil de evaluar y notable. Deben existir al menos dos hitos en el proyecto entre el diseño preliminar y el plazo final de entrega. La división del trabajo debería ser equitativa. (Resulta más útil combinar los hitos y la asignación de tareas dentro de una única tabla que contenga las columnas tarea, quién y cuándo, en lugar de especificar los hitos y la asignación de tareas en dos documentos distintos que no guardan relación).

El diseño preliminar será evaluado según su claridad de expresión y teniendo en cuenta si ha pensado rigurosamente en el problema, si ha identificado las cuestiones fundamentales y los retos, y si ha propuesto un diseño con sentido.

Inicio

Reuniones semanales con los ayudantes técnicos

Cada equipo se reunirá con su ayudante técnico media hora una vez por semana. El horario oficial para estás reuniones es durante la hora habitual de clase. Para obtener puntos por la participación completa:

  • Todos los miembros del grupo deben estar presentes en todas las reuniones.
  • Todos los miembros del equipo deben responder a las preguntas y participar en los coloquios de cada reunión.
  • Deberá entregarse en cada reunión semanal un documento que muestre una clara evolución del proyecto y que resulte útil para la productividad de los coloquios. Para la primera reunión, un borrador del diseño preliminar servirá como documento que indique la marcha del proyecto.

Aunque este documento debe ser claro, es breve y de carácter informal. Constituirá la base del coloquio durante la reunión, y el ayudante técnico se encargará de guardarlo en un archivo como una grabación de la evolución lograda. El equipo debería llevar varias copias a la reunión, una para cada uno de los miembros del equipo y otra para el ayudante técnico. Dicho documento debería comprender la siguiente información:

  • Una descripción de todas las cuestiones nuevas que se hayan descubierto durante el transcurso de la semana. Esto incluye tanto una lista de recientes errores descubiertos como una lista de temas de diseño pendientes.
  • Una descripción de todas las cuestiones que hayan sido resueltas durante el transcurso de la semana. Aquí se incluiría una lista de errores reparados, cómo se han reparado, y una lista de temas de diseño que se hayan resuelto, y cómo se han solucionado.
  • Una lista con todas las cuestiones de semanas anteriores que queden todavía pendientes.
  • Un esquema para la semana próxima, con acciones concretas y objetivos para cada miembro del equipo.
  • Una evaluación del éxito obtenido en el cumplimiento del plan/diseño de la semana anterior.
  • El documento puede contener también cualquier otro material que consideren pertinente para la descripción de su progreso, como por ejemplo, un modelo de objeto o fragmentos del diagrama de dependencia de módulos que muestren cambios en el diseño.

Inicio

Entrega preliminar

La entrega preliminar consta de dos partes: una descripción crítica del diseño final y una demostración de la funcionalidad básica.

Inicio

Diseño final

El documento del diseño final es una versión completa y mejorada del documento que presentó como diseño preliminar. (Por ejemplo, debería incluir una sección sobre su estrategia de validación /prueba). Su diseño final debería de ocupar menos de 20 páginas. En la sección del esquema del proyecto, exponga cualquier hito que no haya conseguido y explique por qué no fue capaz de lograrlo.

Dado que el diseño final debe entregarse como parte de los objetivos de la entrega preliminar, debería haber encontrado todos los errores fundamentales de su diseño. Por tanto, evaluaremos el diseño final teniendo en cuenta si es un buen diseño, además de su claridad de expresión.

Inicio

Funcionalidad exigida

El día de la fecha tope de la entrega preliminar le pediremos que demuestre alguna funcionalidad concreta.

Para demostrar lo que había hecho el día de la fecha de la entrega preliminar, incluso si la demostración es un poco más tarde y ha realizado modificaciones desde entonces, debe guardar una copia de su código en el estado en el que éste se encontraba antes de la fecha de entrega. Puede realizar una captura de su código fuente y/o compilado utilizando el fichero jar. A continuación, puede ejecutar la demostración ubicando el fichero jar dentro de su classpath (ruta de clase) o convirtiendo el fichero jar en ejecutable.

Se le aceptará la ejecución de hasta cuatro programas distintos de Java™ para demostrar las siguientes cuatro características:

  1. Demuestre en la pantalla el lanzamiento de un impulsor presionando una tecla. Cuando se pulsa, el impulsor debería girar 90 grados; una vez que la tecla se suelta, el impulsor debería volver a girar hacia su posición original. Usted debería ser capaz de lanzarla una segunda o tercera vez pulsando de nuevo la tecla después de que ésta haya vuelto a su posición original. (En modo construcción, no es necesario que demuestre la conexión entre la tecla y impulsor).
  2. Pruebe un túnel espacial en funcionamiento, el movimiento de la bola, la gravedad y la fricción. En modo ejecución, sin reboteadores ni impulsores en la pantalla, y con la bola colocada en el túnel espacial, debería ser capaz de pulsar una tecla, observar la bola saliendo disparada del túnel espacial, reduciendo la velocidad a medida que asciende, retrocediendo al túnel y volviendo a su posición original. Demuestre también que puede volver a hacerla salir lanzada por segunda vez. (Dése cuenta de que no necesita tener constantes configurables de gravedad o de fricción).
  3. Controle las colisiones de las bolas con los reboteadores y las barreras. En esta etapa no se exige un control adecuado de un choque entre la bola y el impulsor. Durante el modo ejecución, una bola que sale disparada del túnel debe tener un comportamiento adecuado cuando colisiona con los reboteadores o con las barreras externas.
  4. Haga una demostración de la carga de ficheros en el formato estándar. Dado un fichero de prueba, su implementación debería exhibir los elementos especificados en ese fichero en los lugares que se han precisado en la pantalla. Debería ser capaz de cargar y visualizar todos los elementos estándar.

Su animación en modo ejecución no debería presentar problemas y debería ser adecuada para hacer una demostración de las caractarísticas necesarias que se han especificado anteriormente.

Inicio

Corrección

Poco después de haber presentado la entrega preliminar, usted recibirá una corrección de la especificación del programa. En proyectos extensos de programación, los requisitos cambian normalmente durante el desarrollo. Su diseño debería ser lo suficientemente flexible como para adaptarse con facilidad a los posibles cambios de la especificación.

Inicio

Implementación y crítica

Debería ser capaz de describir su implementación y hacer una crítica de su diseño en menos de 20 páginas (excepto las especificaciones del Elemento 2, que pueden ocupar otras 5 ó 10 páginas y deberían colocarse en el apéndice). Es importante ser conciso. El equipo de trabajo que ganó la competición sobre el diseño de Gizmoball en el año 1999, presentó un informe final de 7 páginas.

Ponga su código en línea en el directorio del proyecto de su equipo. No es necesario que entregue una versión impresa de su código.

El informe final incluye una sección sobre Cambios en el diseño. Describa detalladamente qué cambios ha realizado en su diseño. Sea conciso. Es sumamente importante que su ayudante técnico tenga versiones de las partes descriptivas de la especificación corregida, de la visión global de la implementación y de la estrategia de validación que describe con exactitud el código que ha presentado y lo que hizo en realidad para testearlo o validarlo. Si la descripción no es precisa, la presentación no será calificada con exactitud.

Para las demostraciones (como se describe directamente), debe crear también un fichero jar de su implementación. Este fichero debe ser ejecutable y debe incluir tanto su código fuente como su código compilado.

Haga una demostración de su programa en funcionamiento para su ayudante técnico. Todos los miembros del equipo deben estar presentes para hacer una presentación breve y responder a preguntas relacionadas con sus responsabilidades durante el proceso de desarrollo. Tanto la presentación como la demostración no deberían durar más de 15 minutos. Esté preparado para otra media hora de preguntas y debate.

Inicio

Concurso de diseño

Cuando presente su implementación y crítica, indique en la primera página si desea que se le tenga en cuenta para alguno de los siguientes premios:

  1. Mejor diseño: concedido al proyecto con la mejor abstracción, modularidad, extensibilidad, simplicidad, etc. Se tendrá en cuenta también la calidad del informe final.
  2. Mejor juego Gizmoball: concedido al proyecto con el mejor juego. Una parte de lo que entregue para este premio debería ser un fichero de entrada que se coloca en el área de juego; el premio se concederá por las características del juego en sí, no por el kit de construcción.
  3. El más artístico: concedido al proyecto más magnífico y fascinante en términos visuales. Una parte de su entrega para este premio debería ser un fichero de entrada que se coloca en el área de juego. Cuando se ejecute con este fichero de entrada, la o las bolas deberían rebotar continuamente sin que el usuario tenga que pulsar ninguna tecla.

Cuando se esté decidiendo el premio al mejor diseño, no se tendrá en cuenta si su programa únicamente implementa la funcionalidad básica exigida o si presenta funciones adicionales. No obstante, una funcionalidad adicional que mejore el juego o la maestría de "Rube Goldberg" constituirá una ventaja a la hora de competir por los otros dos premios.

En un principio, los ayudantes técnicos serán los que emitan el primer juicio, y los profesores se encargarán de emitir los juicios finales. Un proyecto puede ganar varios premios. Los ganadores se anunciarán en la última clase.

Inicio

Lo que le facilitamos

Las animaciones de Java™ suponen un gran reto. Usará los paquetes Java.awt y Javax.swing para construir su interfaz gráfica de usuario (GUI). Le hemos facilitado un programa de demostración en Example.Java™ que muestra cómo estimular el movimiento de una bola que rebota en la ventana. También realiza una demonstración sobre cómo hacer que su programa escuche las acciones de los usuarios, como por ejemplo cuando se hace clic en un botón de la barra de herramientas, cuando se pulsa una tecla o se arrastra el ratón. Todos los miembros de su equipo deberían ser capaces de compilar y ejecutar esta GUI de demostración.

Le hemos facilitado también una librería de rutinas físicas (véase el Apéndice 3) para calcular la dinámica de las colisiones elásticas. Puedes utilizar el código tal y como está o modificarlo del modo que quiera.

Inicio

Consejos generales

General
  • Diseño
    Un diseño esmerado le ahorrará mucho tiempo a largo plazo. Es bien sabido que un error cometido al principio de un proyecto, puede convertirse en un gran problema si se detecta tarde. El diseño preliminar constituye una parte fundamental del proyecto (mucho más de lo que la proporción en relación a la calificación podría indicar). Plantéelo cuidadosamente, intentando anticipar los problemas que puedan surgir.
    De esta forma, el resto de su proyecto le resultará más claro y divertido.
  • Prototipo
    Uno de los retos más importantes para este tipo de problema de diseño es descifrar dónde están los gotchas (comentarios especiales). Si está teniendo problemas al imaginar cómo estructurar una parte del diseño, sirve de ayuda en algunas ocasiones, construir un pequeño prototipo. Planifique deshacerse de sus prototipos. Una vez que se ha calculado cómo diseñar algo de forma correcta, casi nunca tiene sentido tratar de remodelar una versión fragmentada y llena de errores.

  • Valide pronto y a menudo
    ¡La validación no debería convertirse en una idea de última hora! Es posible que elija un diseño porque su implementación sea más fácil de testear. Asegúrese de que valida su código a medida que lo implementa.
  • Documente pronto y con frecuencia
    Una documentación incompleta es preferible a ninguna. Si le surge cualquier posible problema o alguna sutileza, pero no tiene tiempo (o no es capaz) de formularlo de manera adecuada, simplemente añada en su documento unas oraciones en las que se describa el tema en cuestión. Más tarde, si tiene tiempo, vuelva a él y repárelo.

  • No se exceda en la documentación
    No incluya ningún material redundante. Por ejemplo, no es necesario que explique las diferencias entre el testeo basado en el método de la caja negra y el de la caja de cristal. Simplemente indique a qué categoría pertenece cada uno de sus casos de prueba. Del mismo modo, ser riguroso no es lo mismo que ser excesivamente meticuloso con lo que es obvio. Puede suponer que su ayudante técnico sabe qué es un set o una pila. No es necesario explicar algo partiendo de cero cuando se pueden utilizar nociones y términos estándar.

  • Diviértase formando parte del equipo
    Disfrute siendo parte del equipo. Cree nuevas ideas delante de sus compañeros y discuta los problemas con ellos. Lea y analice el código de otros. Una buen método para encontrar un error es pedir a alguien que le eche un vistazo a su código. ¡Comience pronto!

  • Comuníquese de manera eficaz
    En cada reunión con los miembros de su equipo (o con su ayudante técnico) debería tener:
    • una agenda. No se reúnan a menos que conozcan el motivo. Esto evitará que pierdan el tiempo.
    • un jefe nombrado para agilizar la reunión. Este jefe asegura que la reunión va por buen camino, anima a todos los miembros del grupo a que participen y ayuda a resolver los problemas.
    • una secretaria que tome apuntes y los reparta luego al resto del grupo. Estos apuntes deben subrayar las decisiones importantes que se hayan tomado, los asuntos resueltos (y los no resueltos), etc. Garantizan que todo el mundo está de acuerdo con las decisiones que se han tomado y que todos son conscientes de las cuestiones que han surgido en la reunión.
    Los roles de los miembros del grupo deberían ir cambiando; en el curso 6.170, ningún individuo debería desempeñar a menudo cualquier rol de forma desproporcionada.

  • Priorice
  • Nos divertimos preparando este proyecto. Nuestro objetivo era proporcionarle un proyecto que fuese todo un reto y que le ofreciese muchas oportunidades para fomentar su creatividad. Le animamos a que lo experimente. Haga una implementación de Gizmoball que sea agradable a la vista y que resulte divertida a la hora de jugar. Es decir, asegúrese de que consigue que la funcionalidad básica funcione antes de añadir piezas nuevas u otros accesorios. El mejor modo de abordar las ampliaciones del proyecto es hacer su diseño inicial flexible y extensible.

Inicio

Codificación

La sintaxis de los ficheros de Gizmoball ha sido diseñada para facilitarle la lectura al programa. El método BufferedReader.readLine() puede leer un comando. La clase StringTokenizer puede descomponer un comando en sus partes integrantes.

Debería adquirir conocimientos previos sobre Swing antes de intentar codificar su GUI. Consulte el Tutorial Swing de Sun (especialmente las secciones quick tour, overview y painting).

No trate de utilizar un reloj de tiempo real para determinar la información relativa al tiempo. En vez de hacer esto, fije la recepción de un evento temporizador cada 1/imágenes por segundo y prosiga haciendo la simulación y las actualizaciones de pantalla en respuesta a este evento. Si se queda atrás y si se le echa el tiempo encima, déjelo así. Un modo sencillo de solucionar esto consiste en utilizar la clase Javax.swing.Timer, como en el ejemplo de la GUI. La utilización de este enfoque simplificará la implementación de su código y le ahorrará la necesidad de tener que tratar cuestiones de sincronización en un programa multihilo.

Si está usando Swing y desea pintar su propio componente, algo que tendrá que hacer en realidad para dibujar el tablero, las piezas y la bola, debería ampliar Javx.swing.JComponent e implementar sus propias rutinas de pintura. Para hacer esto, es necesario que ignore el método paint de su JComponent para pintar el tablero. El pintado se lleva a cabo llamando a métodos del objeto Java.awt.Graphics proporcionado. A menos que lo apague de forma explícita, los componentes Swing están dotados automáticamente de un búfer doble para reducir el parpadeo. Si no comprende esto, no se preocupe. Además del Graphics, Java™ posee ahora otro contexto de gráficos Java.awt.Graphics2D que proporciona posibilidades más sofisticadas que el objeto Graphics tradicional. Observe que las llamadas que sus componentes reciben para paint(Graphics) tendrán siempre un Graphics2D pasado como argumento, de modo que si usted quiere trabajar con Graphics2D, puede simplemente prescindir del objeto Graphics. Puede implementar Gizmoball utilizando ambos estilos de gráficos, pero existen algunas diferencias que debería tener en cuenta:

  • El objeto Graphics funciona con valores enteros para píxeles que le permiten controlar de forma más directa qué píxeles están actualizados.
  • Graphics2D, por el contrario, acepta valores en coma flotante para definir formas geométricas que sean interpretadas y lleva a cabo su representación. Esto resulta un poco más automático, pero también dificulta el ajustar directamente los píxeles individuales.
  • La clase Graphics2D también permite la aplicación de AffineTransforms. (Una transformación afín es una transformación geométrica que mantiene las líneas paralelas).

Para responder a las acciones del ratón y del teclado que el usuario ejecuta, es necesario que cree e instale MouseListener, MouseMotionListener y KeyListener , que se encuentran en el paquete Java.awt.event . Puede encontrar información sobre los códigos clave de Java™ en la documentación para Java.awt.event.KeyEvent.

Pulsado de tecla

Las especificaciones para controlar la entrada del teclado en Gizmoball exigen que un objeto conectado a una tecla se ponga en movimiento cuando esa tecla se pulsa o se suelta. Esto proporciona un comportamiento similar al de un juego real de pinball: al pulsar el botón, el impulsor se mueve hacia arriba y al soltarlo, éste vuelve a su posición de reposo.

Eventos del teclado

Las especificaciones de Java™ para Java.awt.event.KeyEvent describen tres tipos de eventos del teclado, KEY_PRESSED, KEY_TYPED y KEY_RELEASED. La documentación sugiere que los eventos KEY_PRESSED se dan cuando el usuario pulsa realmente una tecla, y que los eventos KEY_RELEASED tienen lugar cuando se suelta esa tecla. Por tanto, sería razonable realizar un lanzamiento cuando se reciba un evento KEY_PRESSED o KEY_RELEASED que provenga de haber pulsado o soltado cualquier tecla que esté conectada a una pieza.

Lamentablemente, la mayoría de los entornos en tiempo de ejecución de Java™ lanzan múltiples eventos KEY_PRESSED y en varias ocasiones múltiples eventos KEY_RELEASED, cuando el usuario sólo ha pulsado la tecla una vez. Además, en algunos entornos es posible que nunca se reciban eventos KEY_RELEASED cuando la tecla se suelta. Esto se debe a que el comportamiento de KEY_PRESSED y KEY_RELEASED depende del sistema. Este comportamiento se da por una interacción con el control por parte del sistema operativo de las repeticiones de una tecla, que tiene lugar cuando se mantiene una tecla pulsada durante un periodo de tiempo.

En Windows

En Windows, Java™ generará múltiples eventos KEY_PRESSED cuando se mantenga pulsada la tecla y sólo un evento KEY_RELEASED en el momento que la tecla se suelte. Por ejemplo, el mantener pulsada la tecla 'A' generará los siguientes eventos:

PRESSED 'A'
PRESSED 'A'
...
RELEASED 'A'
En Unix

En Unix se reciben pares múltiples de eventos KEY_PRESSED y KEY_RELEASED cuando se mantiene pulsada una tecla:

PRESSED 'A'
RELEASED 'A'
PRESSED 'A'
RELEASED 'A'
...
PRESSED 'A'
RELEASED 'A'

Inicio

Testeo del programa

Si desea explorar el comportamiento de su ------ en su entorno,puede usar la clase KeypressTest que el personal docente le ha facilitado. La aplicación volcará todos los eventos del teclado en la consolapara su revisión.

El código fuente se encuentra disponible aquí: KeypressTest.Java

Inicio

Soluciones

No dude en manejar con toda confianza este matiz de la API de Java™ cuando lo considerase adecuado. Una solución sencilla consiste en desconectar el mecanismo automático de repetición de pulsación de tecla del sistema operativo y, de este modo, hacer que los eventos KEY_PRESSED y KEY_RELEASED se correspondan rigurosamente con las acciones reales del usuario.

  • Unix/Linux: escriba "xset -r" para desconectar el mecanismo de autorepetición. Para volver a activar el mecanismo utilice "xset r"

  • Windows: vaya al applet Accessibility Options (opciones de accesibilidad) del panel de control. Seleccione el botón Settings...(ajustes) para FilterKeys en la pestaña Keyboard. Seleccione Ignore quick keystrokes (ignore las pulsaciones rápidas de las teclas)and slow down the repear rate (reduzca la velocidad de repetición). Seleccione el botón Settings... que está al lado de esa opción. Asegúrese de que selecciona la opción No keyboard repeat (no repeticiones del teclado). Deslice la opción SlowKeys a Short (0.00). Pulse Ok dos veces. Compruebe Use FilterKeys y pulse OK. Para habilitar y desabilitar estos cambios, simplemente compruebe o desmarque el cuadro de control de UseFilterKeys.

Se admite que pida al último usuario que realice ajustes de este tipo, pero debería incluir esto en su documentación de Gizmoball.

Otra solución sería aprovechar la ayuda ofrecida por un decorador especial key listener que el personal docente les ha facilitado. La clase está disponible en formato compilado en el fichero gb-lib.jar como staffui.MagicKeyListener. Consulte la documentación de MagicKeyListener o utilice el código fuente que le han facilitado como su propio punto de partida.

Inicio

Administración del sistema y herramientas informáticas

Inicio

Control de revisión

Es muy aconsejable que utilice un paquete de control de revisión como CVS que le ayude a coordinar su trabajo, a prevenir la pérdida de código y que le permita hacer copias de seguridad de versiones anteriores.

Inicio

Make: modelo del sistema

Otra de las herramientas que puede serle de utilidad es make. Esta herramienta le permite escribir un makefile que sea un modelo de su sistema: qué ficheros contienen código, qué trabajo necesita realizarse para compilar el sistema, qué es necesario para ejecutar sus tests, qué es lo que hay que hacer para limpiar el directorio, etc. Una vez que haya escrito el makefile, puede llevar a cabo cualquiera de estas tareas escribiendo un único comando.

En Athena, escriba info make.

Inicio

Ficheros (JAR) Archive de Java™

Es necesario que cree ficheros jar para reunir todas las partes de su aplicación para entregárselas a su ayudante técnico. Los ficheros jar son útiles porque pueden guardar todo el código fuente, el código compilado y los ficheros de datos asociados (como imágenes y sonidos) en un único archivo central que se puede dividir luego fácilmente.

Para aprender más sobre los ficheros jar , examine el manual jar tool de Sun.

Como consulta rápida, le mostramos a continuación unos ejemplos de uso del comando jar:

Para crear el fichero gizmo.jar a partir de las clases de los paquetes gizmo y ball:

jar cvf gizmo.jar gizmo ball

Para enumerar los contenidos del fichero jar, utilice:

jar tf gizmo.jar

Para crear un fichero gizmo.jar ejecutable:

jar cvfm gizmo.jar JarMainManifest gizmo ball

En el ejemplo de arriba, el fichero JarMainManifest debería contener una línea individual que nombre el punto de entrada:

Main-Class: gizmo.StartGizmoball

Para ejecutar la aplicación usando el fichero jar, utilice:

Java -jar gizmo.jar

Importante:Observe que cuando se utiliza la opción -jar para ejecutar una aplicación, la variable CLASSPATH y el switch de la línea de comando -cp se ignoran. Por tanto, para incluir la librería de fichero jar del directorio actual del siguiente modo:

jar xvf /mit/6.170/lib/gb-lib.jar física en una aplicación guardada en un fichero jar ejecutable, tendrá que extraer los ficheros .class de nuestro fichero jar, y deberá incluirlos en el suyo. Puede extraer un

La utilización de un Makefile, como se explicó en la sección anterior, puede simplificar y automatizar la creación de ficheros jar. Dada la complejidad y las cuestiones de mantenimiento que se dan al combinar los ficheros de clase de física con su aplicación, le aconsejamos el uso de un Makefile para automatizar el proceso.

Inicio

Apéndice 1: requisitos detallados

General

Su implementación debe contemplar dos modos de ejecución, el modo construcción y el modo ejecución. En modo construcción, el usuario puede añadir piezas al área de juego y modificar las ya existentes. En modo ejecución, una bola se mueve por todo el área de juego e interactúa con las piezas.

Área de juego

Al describir las dimensiones del área de juego, se define L como la unidad básica de distancia, que equivale a la longitud del borde de un reboteador cuadrado. De acuerdo con el uso estándar en la comunidad gráfica, el origen se encuentra en la esquina SUPERIOR derecha con coordenadas que aumentan hacia la derecha y hacia ABAJO.

El área de juego debe tener al menos 20 L de ancho por 20 L de alto. Es decir, se podrían colocar en el área de juego 400 reboteadores cuadrados sin solaparse. La esquina superior izquierda está en la posición (0,0) y la esquina inferior derecha está en la posición (20,20). Cuando decimos que una pieza se encuentra en un lugar concreto, queremos decir que el origen de la pieza está en ese lugar. El origen de cada una de las piezas estándar está en la esquina superior izquierda de su recuadro delimitador, por lo tanto, la posición más lejana desde el origen, en la que una pieza se puede colocar es (19,19) en un tablero de 20L x 20L. El origen de una bola se encuentra en su centro.

Durante el modo construcción, las piezas deberían colocarse en una cuadrícula de 1 L por 1 L. Es decir, un usuario únicamente puede ubicar piezas en las posiciones (0,0), (0,1), (0,2), y así sucesivamente.

Durante el modo ejecución, la cuadrícula de la animaciónno puede tener un grosor superior a 0.05 L por 0.05 L. Suponga que la bola que se encuentra en la posición (1,1) se mueve hacia la dirección de (1,0), es decir, de izquierda a derecha, a una velocidad de 0.05L por recuadro trazado. Entonces,la bola debería mostrarse al menos en las posiciones (1,1), (1.05,1), (1.10,1), y podría mostrarse en más posiciones si usted desea que la animación sea más pausada. Los impulsores giratorios pueden animarse de un modo algo más brusco; véase la descripción concreta sobre los impulsores a continuación. Si la bola se mueve más deprisa que el tamaño de la cuadrícula de la animación por recuadro trazado, no es necesario que se vuelva a trazar en cada posición de la cuadrícula de la animación.

Inicio

Modo construcción

En modo construcción, el usuario puede:

  • Añadir cualquiera de los tipos de piezas disponibles al área de juego.
    • Un intento de colocar un pieza de un modo tal que solape a otra que se haya colocado anteriormente o al borde del área de juego, debería ser rechazado (es decir, no debería tener efecto).
  • Mover una pieza desde un lugar a otro del área de juego.
    • Un intento de colocar un pieza de un modo tal que solape a otra que se haya colocado anteriormente o al borde del área de juego, debería ser rechazado (es decir, no debería tener efecto).
  • Aplicar un giro de 90 grados en el sentido de las agujas del reloj a cualquier pieza.
    • El giro no tiene efecto en piezas con una simetría giratoria. Por ejemplo, los reboteadores circulares tienen el mismo aspecto y funcionan del mismo modo, sin importar cuántas veces se hayan girado a 90 grados.
  • Conectar el lanzador de un pieza concreta con la acción de otra pieza específica.
    • Las piezas estándar producen un lanzamiento cuando la bola choca contra ellas, y muestran como mucho una acción (por ejemplo, mueven un impulsor, disparan la bola hacia fuera deltúnel espacialo cambian el color de un reboteador). El lanzamiento que genera una pieza puede conectarse con las acciones de muchas piezas. Asimismo, la acción de una pieza puede activarse por muchos lanzadores. Las acciones y lanzamientos necesarios para las piezas básicas se describen a continuación.
    • Observe que los disparos no actúan "en cadena". Es decir, cuando A se conecta a B y B se conecta a C, una bola que choque con A, sólo hará que se lance la acción de B.
  • Conectar un lanzamiento al pulsar una tecla a la acción de una pieza.
    • Cada tecla del teclado produce un único lanzamiento cuando es pulsada. Al igual que los lanzamientos producidos por las piezas, los provocados al pulsar una tecla pueden conectarse también a las acciones de muchas piezas.
  • Borrar un pieza del área de juego.
  • Añadir una bola al área de juego.
    • El usuario debería ser capaz de especificar una posición y la velocidad.
    • Un intento por colocar la bola en una posición tal que solape una pieza que se haya colocado anteriormente o al borde del área de juego, debería ser rechazado (es decir, no debería tener efecto). Existe una excepción en el set de la pieza estándar: una bola que esté parada puede colocarse dentro del túnel espacial.
  • Guardar en un fichero que haya sido nombrado por el usuario.
    • Debe ser capaz de guardar un fichero en el formato estándar que se ha facilitado en el Apéndice 2. Puede, si lo desea, definir una extensión para el formato estándar que controle los rasgos especiales de su implementación. Si lo hace así, el usuario debe poder elegir entre la opción de guardar en el formato estándar o en su formato especial.
    • El fichero guardado debe incluir información relativa sobre todas las piezas que se encuentran actualmente en el área de juego, sobre todas las conexiones entre los lanzadores y las acciones y sobre la posición y velocidad actual de la bola.
  • Cargar desde un fichero que haya sido nombrado por el usuario. Debe ser capaz de cargar un juego que haya sido guardado en formato estándar.
  • Cambiar a modo ejecución.
  • Salir de la aplicación.

Inicio

Modo ejecución

En modo ejecución el usuario puede:

  • Cambiar a modo construcción en cualquier momento.
    • Si el usuario solicita cambiar a modo construcción mientras un impulsor está en movimiento, es aceptable retrasar el cambio hasta que el impulsor haya alcanzado el final de su trayectoria.
    • Se aceptan retrasos breves similares para acabar estados de transición de las piezas que cree.
  • Pulsar teclas, generando de este modo lanzamientos que pueden conectarse a las acciones de las piezas.
  • Salir de la aplicación.

En modo ejecución, Gizmoball debería:

  • Proporcionar una animación fluida del movimiento de la bola desde un punto de vista visual.
    • La bola debe tener por defecto un diámetro de 0.5L aproximadamente.
    • Las velocidades de las bolas deben oscilar al menos entre 0.01 L/seg y 200 L/seg y si lo desea, esta oscilación puede ser mayor. Una velocidad de 0 L/seg (cuando la bola está parada) debe también contemplarse.
    • Se debería utilizar una velocidad de imagen aceptable para generar una animación fluida. Hemos descubierto que a 20 imágenes por segundo suele funcionar bien en una variedad bastante amplia de plataformas.
  • Facilitar interacciones intuitivamente razonables entre la bola y las piezas del área de juego. Es decir, la bola debería rebotar en la dirección y con la velocidad resultante que se esperaría que rebotase en un juego de pinball físico.
  • Moderar continuamente la velocidad de la bola para dar cuenta de los efectos de la gravedad.
    • Debería mantener un valor estándar de gravedad a 25 L/seg2, que se semeje a un juego de pinball con una superficie de juego ligeramente inclinada.
  • Moderar continuamente la velocidad de la bola para dar cuenta de los efectos de la fricción.
    • Debería modelar la fricción escalando la velocidad de la bola al utilizar las constantes de fricción mu y mu2. Para una delta_t's lo suficientemente pequeña, usted puede modelar la fricción como Vnew = Vold * (1 - mu * delta_t - mu2 * |Vold| * delta_t).
    • El valor de mu por defecto, debería ser de 0.025 por segundo.
    • El valor de mu2 por defecto, debería ser de 0.025 por L.

Inicio

Piezas estándar

Existen siete piezas estándar que deben contemplarse: rebotadores (cuadrados, circulares y triangulares), impulsores (derecho e izquierdo), túneles espaciales y barreras externas.

Un coeficiente de 1.0 significa que la energía de la bola que sale del reboteador equivale a la energía con la que ésta golpea al mismo, pero la bola va rodando en una dirección distinta. A modo de ampliación, también puede tener reboteadores con coeficientes inferiores o superiores a 1.0.

Reboteador cuadrado

Una figura cuadrada con una longitud de arista de 1L.
Lanzamiento: generado cuando la bola choca contra él.
Acción: no se requiere ninguna.
Coeficiente de reflexión: 1.0

Inicio

Reboteador circular

Una figura circular con un diámetro de 1L.
Lanzamiento: producido cuando la bola choca contra él.
Acción: no se requiere ninguna.
Coeficiente de reflexión: 1.0

Inicio

Reboteador triangular

Una figura triangular derecha con lados de 1L e hipotenusa con una longitud de (2)Lde raiz cuadrada.
Lanzamiento: se genera cuando la bola choca contra él.
Acción: no se requiere ninguna.