3er paso: Interacción entre objetos (final)

"De lo simple a lo complejo". Cuan sabias palabras enunciamos en su momento. Si volvés la mirada hacia el camino recorrido creo que vas a coincidir conmigo en este postulado.
Y precisamente estamos "en lo complejo". Ya en el paso anterior probamos con una solución, y vimos que se le pueden hacer mejoras. Y en nuestro primer intento no fueron del todo satisfactorias —por lo menos para mí—.
Quedamos en dar una solución al uso del bloque de diálogo sin que este afecte el vuelo de Murci y anticipamos que íbamos a recurrir al auxilio de la programación multi-hilo… y como lo prometido es deuda, avanti que ya alcanzamos nuestra meta. 

Programación Multi-hilo is back

En la programación "tradicional" el razonamiento y posterior implementación de un programa está enfocado en la idea de una instrucción por vez, es decir, en un encadenamiento de acciones que se suceden unas a las otras.
Pero nuestro cerebro no funciona así: normalmente estamos atendiendo a más de una cosa al mismo tiempo (eso de caminar y masticar chicle al mismo tiempo).
¿Podríamos conseguir algo similar en el comportamiento de Murci?   SI, es posible gracias a que Scratch soporta programación multi-hilo. Recordemos algo ya dicho sobre esto:
…Para explicarlo suscintamente, la programación multi-hilo permite correr múltiples programas "virtualmente" al mismo tiempo…
En nuestro caso, cuando hablamos de scripts estamos hablando de hilos de programa ejecutándose en forma paralela (esto es, distinto al modelo de cadena única de la programación tradicional).

La solución que propusimos antes se basaba en el uso de un sólo script que controlaba tanto el movimiento como las reacciones de Murci: esto puede ser visto como una cadena única de instrucciones. Por ello si Murci tiene que pensar por 2 segundos no puede hacer otra cosa hasta que ese tiempo se cumpla.

A esta altura debería ser evidente lo que haremos: será añadir todo lo que analizamos en la página anterior —respecto a la interacción Murci-árbol— en un nuevo script, y por ende, trabajando en forma paralela al principalhacia allí vamos.

Sensando 2 cosas en scripts separados

Vamos a reintentar ahora integrar el conjunto de bloques dedicados a la interacción —propuesto en la página anterior— con nuestra programación previa, pero sin "tocar" el script principal. De acuerdo a nuestro último análisis, usaremos un script nuevo dedicado sólo a detectar el árbol y reaccionar a esta circunstancia, trabajando al mismo tiempo (y por su lado) a lo ya existente.

LEE CON ATENCIÓN

Aquí estás viendo 2 posibles soluciones para el nuevo script: sólo deberíamos usar una de ellas.
solución 2
La novedad aquí es que al ser presionada la "bandera verde" en la zona de comandos también se accionará nuestro nuevo script ; de esta manera además de "volar" Murci prestará atención a un posible contacto con el árbol, y podrá así actuar en consecuencia.
Los bloques que están dentro del bucle ya fueron analizados lo suficiente, así que voy a obviar cualquier comentario.
Notemos sí que vamos a necesitar de que haya una repetición continua en la ejecución de los mismos: de otra manera Murci estaría comprobando el contacto una sola vez (cuando arranca el programa), y nosotros pretendemos que esté permanentemente atento a esa cuestión.

Los dos scripts aquí propuestos funcionan correctamente, y aún podrían plantearse otras soluciones igualmente válidas… ¿cómo decidirse?

  • Desde el punto de vista conceptual el script de arriba refleja de una manera simple y exacta lo que necesitamos: es casi una traducción de las palabras a la programación.
  • Sin embargo, desde el punto de vista del uso de los recursos del sistema donde va a correr el programa (la compu, bah…), usar el de abajo significará optar por una solución más racional.
    Esto es por la inclusión de una instrucción de espera (del mismo orden de delay que la del script  principal, que es de 0.1seg), ya que en realidad no será necesario sensar la presencia del árbol con una frecuencia mayor a la que se mueve nuestro murciélago —que lo hace unas 10 veces por segundo—.
NOTA: dar una explicación más acabada de esto último nos obligaría a discurrir sobre cosas como utilización de los ciclos de trabajo del microprocesador y algunas cosas más, muy lejos del alcance de nuestro tutorial y de mis propios conocimientos. Si está expuesto aquí es porque conviene que sepas que a veces hay otros factores que pueden incidir en una decisión, más allá de la lógica del programa.

This is the end, my friend

La validez de cualquier solución se termina demostrando empíricamente, esto es, verificando en la práctica que aquello que pensamos/analizamos/proyectamos sea realmente efectivo en los hechos.
Cuando hablé antes sobre "tener una mirada crítica" expuse dos cuestiones que —a mi parecer— se debían corregir, y las corregimos… Llegar a determinar a partir de que momento nos sentimos satisfechos con el resultado de un proyecto es hasta cierto punto una cuestión personal, y para los fines de este tutorial yo ya estoy conforme.
completo

¿Por qué se corrigieron ambos "defectos" del proyecto inicial?

Es un buen momento para el análisis, como lo es cada vez que se presenta una situación —por decir de alguna manera— inesperada.
En nuestra primera (e imperfecta) propuesta Murci solía en algunas situaciones "volver sobre sus pasos" y chocar una y otra vez con el árbol. Del análisis de ese momento dedujimos que esto se daba porque no conseguía alejarse lo suficiente como para dejar de tocar al árbol.
Mirá ahora el segundo script agregado en la nueva propuesta: al tocar el árbol Murci "grita", gira 180º y "piensa" por 2seg. Luego hay una espera de 0,1seg, y recién después vuelve a sensar si está en contacto con el árbol. Como el otro script no se detuvo, Murci tuvo exactamente 2,1 seg para alejarse del árbol, corrigiéndose así este problema a la par del problema del "congelamiento" en su vuelo…
Aquí finaliza la fase de implementación de nuestro proyecto, dejando a nuestro distraído personaje aleteando en su pequeño mundo…
Queda de aquí en adelante que imagines y aprendas lo suficiente como para enriquecerlo aún más, y que pueda enfrentarse a nuevas aventuras… pero eso ya es otra historia.  
Y a modo de cierre un poco más formal de este tutorial, te invito a leer el epílogo que sigue…
Última actualización: Febrero 22, 2014

No hay comentarios.:

Publicar un comentario

© Scratch CodeLab | D153ñ0 b454d0 3n l4 pl4n71ll4 SimpleRWD d3 Oloblogger