Monthly Archives: May 2014

Alice 3.1 – Movimiento de caida libre con rebote

En esta ocasión he intentado simular el movimiento en caida libre de un objeto utilizando las ecuaciones para la caida libre y el tiro vertical (la imagen ha sido tomada de esta página de la web fatela.com.ar

CaidaLibre2

El resultado es un proyecto en el que se deja caer y rebotar un objeto volleiball, tratando que la simulación se vea lo más fluida posible.

CaidaLibre1

Solamente se deja caer la pelota desde una altura de 5m y se mira como rebota. El proyecto es este:

MovimientoCaidaLibre.a3p

 

Descripción del proyecto

Consta de los objetos volleiball, axes y textModel, y lo único que hace es llamar a un procedimiento llamado CaidaLibre:

CaidaLibre3

NRebotes es el número de rebotes que va a dar la pelota

NIntervalosPorCaida es el número de sucesivas posiciones en las que se va a diburar la pelota para dar el efecto de movimiento

AlturaInicial: la he fijado a 5m.

Rapidez: un valor para el parámetro duración de las sentencias MOVE

 

El procedimiento CaidaLibre es el que dibuja la pelota en las distintas posiciones para simular el movimiento. La parte principal es un bucle hecho con una instrucción COUNT (que cuenta NRebotes) donde cada recorrido se compone de dos partes: una de caida libre y otra del movimiento de rebote, que viene a ser un tiro vertical. A su vez, cada una de ellas es otro bucle COUNT que cuenta NIntervalosPorCaida) donde está situada la instrucción MOVE que va simulando el movimiento.

Al principio probé dejando todo el cálculo de las magnitudes (tiempos, velocidades y alturas) dentro de esos bucles, pero el resultado no era del todo fluido ya que, sobretodo al comienzo de la caida libre, había un instante de ralentización cortando la continuidad del movimiento. La solución fue crear un array donde ir almacenando los cálculos (con otro bucle COUNT) y recuperarlos posteriormente al realizar los bucles descritos antes. Al tener que utilizar un array me encontré con el problema de que Alice no tiene (o al menos no la he encotrado) una manera dinámica de dimensionar el array, de tal forma que hay que definir previamente todos los valores antes de poder comenzar a utilizarlo.

Merece la pena explicarlo con detenimiento: Al crear un array, cuando pulsamos en el Initializer se abre la ventana Custom Array para que metamos los valores en el array. En este caso 0,1, y 2.

CaidaLibre4

Al darle OK el resultado es el siguiente

CaidaLibre5

También es posible crear el Array vacío dandolo a OK en la ventana CustomArray sin haber introducido previemente los valores 0,1, y 2

CaidaLibre6

Ha creado el array sin inicializar los valores, pero no ha dejado que podamos dimensionarlo introduciendo algún valor entre los corchetes (los corchetes, no las llaves). Cada vez que se intente introducir un valor en el array mediante alguna sentencia nos dará error.

CaidaLibre7

 

 

 

CaidaLibre8

 

 

 

 

 

 

 

 

 

Lo ideal sería que el array se pudiese dimensionar de manera dinámica según los valores de los parámetros NRebotes y NIntervalosPorCaida y del procedimiento CaidaLibre, pero parece que desde Alice no es posible. La solución es bastante trabajosa y consiste en inicializar a mano todos los valores del array que se necesiten, pero estamos hablando de más de un centenar.

Siguiendo con la descripción del procedimiento CaidaLibre, éste también utiliza varias funciones construidas previamente para hacer los cálculos:

CaidaLibre_CalculaTiempoParcial

 

 

 

 

 

 

CalculaVelocidadFinal

 

 

 

CaidaLibre_CalculaAltura

 

 

 

 

 

 

 

CalculaTiempoParcial es utilizada para saber cuanto tiempo va a llevar la siguiente caida libre o tiro vertical con objeto de dividirlo posteriormente entre el parámetro NIntervalosPorCaida y calcular el tiempo que pasa entre cada “fotograma” dibujado con  MOVE.

CalculaVelocidadFinal se usa para saber con qué velocidad inicial comienza cada tiro vertical, que será igual a la velocidad final de la caida libre anterior multiplicada por un coeficiente de elasticidad del rebote. Este coeficiente debe tener un valor entre 0 (no rebota) y 1(rebota indefinidamente).

CalculaAltura se usa en los bucles internos que preparan cada instrucción MOVE, para saber dónde tiene que dibujar la pelota en cada momento

 

También hay dos constantes definidas como propiedades a nivel scene, que son:

CaidaLibre9

Por último, se ha añadido un objeto textModel anclado a la pelota con la propiedad vehicle para informar de la altura de la pelota en cada momento.

 

Advertisements

Alice 3.1 – Utilización de la cámara

En Alice la forma de manejar la cámara es a través del objeto camera. A continuación varios planos o movimientos que se pueden hacer con la cámara. He utilizado el procedimiento Caminar del que hablo en esta entrada, aunque valdría igual con una simple sentencia MOVE, ya que lo importante en este caso es el manejo de la cámara.

Lo que voy a contar se basa en este proyecto llamado UtilizacionCamara.a3p. Consiste únicamente en un personaje SIMS al que se ha llamado hombre, y un objeto billboard para construir el camino por el que va andando este hombre.

Camara2

Y también se han creado tres marcadores de cámara llamados cameraMarker1, cameraMarker2 y cameraMarker3:

Camara3_CameraMarker1Camara4_CameraMarker2

 

 

 

 

 

 

 

 

 

 

Camara5_CameraMarker3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

En primer lugar colocamos la llamada al procedimiento que hace que el personaje camine 50 pasos

Camara1

Y en el evento keyPressListener es donde vamos a asociar el código de cada movimiento de cámara:

 

Travelling lateral

La cámara se desplaza con el hombre, acompañándolo en su movimiento. Esto se logra colocando la cámara en un punto lateral (en nuestro caso el cameraMarker1), enfocarla hacia el personaje y anclándola a él con la propiedad vehicle.

Camara6

Sin embargo estas líneas de código no siempre sirven. En nuestro caso la intención es que el hombre vaya caminando y el usuario pueda alternar de una posición de cámara a otra con pulsaciones de teclas.

Como el hombre comienza a caminar desde una posición cercana al cameraMarker1, estas sentencias sólo funcionarán correctamente si se ejecutan al principio. Si dejamos pasar unos segundos antes de ejecutarlas, el hombre ya se habrá alejado de cameraMarker1 y habrá salido de nuestra vista.

La manera de que podamos entrar y salir del travelling lateral en cualquier momento será anclando la cámara no a un punto fijo del espacio, sino a un objeto que a su vez esté anclado al hombre y se mueva con él. Ese objeto auxiliar puede ser cualquier objeto de tamaño pequeño, por ejemplo una pelota, y puede hacerse invisible poniendo su propiedad Opacity a cero. Eso es lo que se ha hecho creando un objeto Volleiball renombrado como ObjetoAuxiliar1, situándolo en cameraMerker1 y anclándolo al hombre, todo desde el Scene Editor. El código para entrar y salir del travelling lateral será entonces:

Camara7

El ObjetoAuxiliar1 siempre va a estar en la posición adecuada moviéndose con el objeto hombre. Así cada vez que se quiera volver al travelling lateral habrá que llevar la cámara con moveTo al ObjetoAuxiliar1, apuntar hacia nuestro objetivo y anclarla al hombre (aunque también se podría anclarla al ObjetoAuxiliar1). En el proyecto se ha asociado este código a la pulsación de la tecla “1”.

 Plano fijo

Para dejar la cámara en un plano fijo sólo hay que llevarla al punto desde donde vamos a tomar el plano, apuntar al objetivo, y anclar la cámara a la escena (this)

Camara8

Según el caso, a veces es conveniente apuntar con la cámara a la cabeza del hombre en lugar de apuntarla al objeto hombre, ya que el pivot point (el punto sobre el que se hacen las rotaciones), que es a donde se apunta, está en la base de los objetos.

Rotación de la cámara mientras sigue al objetivo

Un efecto  interesante es cuando la cámara es capaz de seguir al objetivo, en este caso al hombre que camina, girando su orientación si es necesario.

Camara9

Para conseguir este efecto es necesario crear una variable como propiedad del objeto Scene y utilizar el evento TimeListener.

1. Crear la variable: Desde la pestaña Scene se le da al botón Add Scene Property y se crea una variable de tipo WholeNumber. Le hemos llamado SeguirObjeto, inicializándola con al valor 0.

2. Crear un TimeListener: en la pestaña InitizlizeEventListeners,  y en el procedimiento timeElapsed se mete este código, que se ejecutará de manera contínua varias veces por segundo

Camara10

Lo que hace es comprobar si la variable SeguirObjeto tiene valor 1, en cuyo caso actualiza la orientación de la cámara hacia el objetivo. En nuestro proyecto se cambia alternativamente el valor de esta variable pulsanto la tecla correspondiente al número “0”.

No queda mucho más que contar. El resumen de teclas es entonces:

“0” –> modifica el valor de la variable SeguirObjeto, para que la cámara siga al hombre o se quede fija

“1” –> travelling lateral, utilizando el ObjetoAuxiliar1

“2” –> plano fijo desde el punto cameraMarker2. Si pulsamos “0” la cámara comenzará a rotar siguiendo al hombre

“3” –> vista panorámica de seguimiento desde cameraMarker3 con la variable SeguirObjeto activada.

Al pulsar run la cámara está fija en cameraMarket1. Pulsando las teclas de 0 a 3 se puede ir testando los planos descritos en esta entrada.

 

 

 

 

 

 

Alice 3.1 – Movimiento simultáneo a la ejecución de nuestro programa

Esta práctica va a consistir en hacer que varios personajes se muevan por la escena por sí mismos en un bucle infinito y sin ocupar espacio en MyFirstMethod, para que paralelamente podamos crear la historia que deseemos. Para esta práctica vamos a utilizar el procedimiento ColocacionAleatoria, tratado en una entrada anterior (que conviene repasar), y que consiste en posicionar varios personajes de manera aleatoria con anterioridad a la ejecución del programa.

DistribucionAleatoria13

Como punto de partida vamos a utilizar este proyecto que contiene la colocación aleatoria de cinco objetos alien. Como vimos, consistía únicamente en una línea de código en el performCustomSetup llamando al procedimiento que sirve para situar de manera aleatoria los personajes en un radio definido por el usuario.

MovimientoSimultaneo1DistribucionAleatoria7

Con la escena ya preparada, lo siguiente es construir un procedimiento de clase scene que mueva estos alien simultáneamente. Lo llamamos MovimientoSimultaneo y lo colocamos en un do together junto con MyFirstMethod

MovimientoSimultaneo2MovimientoSimultaneo3

Antes de darle a Run alejamos un poco la cámara para que abarque más terreno, y el resultado es un tosco movimiento aleatorio de los alien en un bucle infinito. Mientras, el procedimiento MyFirstMethod está vacío para que podamos utilizarlo en nuestra historia sin preocuparnos del movimiento de los alien.

Lo que se pretendía con este ejercicio es mostrar de qué manera se puede separar los movimientos que pertenecen a la escena de los que se quieran programar a mayores.

A continuación el proyecto: MovimientoSimultaneo.a3p

 

Alice 3.1 – Como hacer el movimiento de caminar

En Alice es posible crear un procedimiento que permita que en general cualquier objeto tipo Biped pueda caminar, aunque seguramente los objetos idóneos para esto sean los de tipo SIMS.

Vamos a crear un procedimiento en la clase Biped que pueda ser llamado por cualquier objeto que descienda de dicha clase.

Desde el botón de clases se busca la clase Biped y se pulsa en “Add procedure”. Le llamamos Caminar, y le añadimos tres parámetros para aportarle flexibilidad, que son:

Pasos (WholeNumber): el número de pasos que va a dar el objeto. Por paso se entiende la sucesión de las seis fases de que consta el moviemiento codificado.

Velocidad (DecimalNumber): para regular la rapidez con que anda el objeto

Brazo (DecimalNumber): que regula la amplitud con la que se moverán los brazos al andar.

ProcedimientoCaminar1

El código va a tratar de imitar la forma humana de caminar. Lo que se conoce como gait cycle o ciclo de la marcha.

ProcedimientoCaminar2

He utilizado fundamentalmente las siguientes articulaciones (joints): hip (cadera), foot (pie), shoulder (hombro) y knee (rodilla)

ProcedimientoCaminar3

Este movimiento para caminar consta en primer lugar de una fase de adaptación para comenzar el movimiento en la que el personaje se coloca en posición de comenzar a andar. A continuación va un bucle con las seis fases que conforman el ciclo de la marcha y que están asociadas al parámetro Pasos.  El bucle se repite tantas veces como indique el parámetro Pasos. Una vez terminado el bucle hay otra fase para terminar el movimiento y volver a la posición de reposo.

ProcedimientoCaminar5

El procedimiento Caminar puede ser llamado desde MyFirstMethod o desde cualquier Event Listener.

ProcedimientoCaminar4

A continuación un enlace al proyecto de Alice 3.1 con un ejemplo del procedimiento Caminar:

Caminar.a3p

Si te animas a hacer una animación más realista que esta puede ayudar este enlace.

 

Alice 3.1 – Distribución aleatoria de objetos previa al programa

Este es un ejemplo para las ocasiones en las cuales nos interesa que algunos objetos se distribuyan al azar por la escena  los pasos son los siguientes:

1. Creación de los objetos que se van a distribuir de manera aleatoria

Creamos cinco objetos alien uno detrás de otro y dejando los nobres que llevan por defecto (alien, alien2, alien3, alien5 y alien5). Van quedando situados uno encima de otro de manera que se van a superponer en el mismo punto.

DistribucionAleatoria1

2. Creación del procedimiento

Vamos al panel de edición de código (Code Editor Panel) y creamos un procedimiento para la clase Scene. Pare ello en la pestaña Scene pulsamos “Add Scene Procedure” y le damos el nombre ColocacionAleatoria. Al darle OK aparece una uneva pestaña con el nombre de nuestro procedimiento. En “Add Parameter” añadimos un parámetro de tipo Double y le ponemos de nombre radio (será el radio de la circunferencia dentro de la cual vamos a distribuir nuestros objetos). A continuación se arrastra una instrucción “for each in” para recorrer todos los objetos que hay en un array. Este array lo creamos sobre la marcha cubriendo la ventana que aparece.

DistribucionAleatoria2

El nombre del array será “marcianos”

El tipo (item type) lo elegimos en la opción Gallery Class del desplegable. En la nueva ventana que aparece elegimos el tipo Alien.

El array lo creamos pulsando en la opción “Custom Array” del desplegable. En la nueva ventana pulsamos “Add” y vamos metiendo cada uno de los objetos alien creados anteriormente.

DistribucionAleatoria3 DistribucionAleatoria4

 

 

 

 

 

 

 

 

 

El procedimiento creado queda así:

DistribucionAleatoria5

3. Introducción del código del procedimiento

Ahora toca introducir las sentencias del código, que se ejecutará en cada uno de los cinco aliens que hemos metido en el array “marcianos”. En el “Methods Panel” ahora se pueden seleccionar los procedimientos asociados este array.

DistribucionAleatoria6

Para cada alien tenemos que elegir al azar un ángulo de giro y una distancia hacia adelante. Lo hacemos con turn y move.  A cada una de estas sentencias se les proporciona un valor aleatorio. A turn entre 0 y 1 vueltas y a move entre 0 y el parámetro radio que serán los metros que se mueva hacia delante en la dirección marcada por turn. Para ello se elige la opción Random.

DistribucionAleatoria7

4. Llamada a nuestro procedimiento desde el performCustomSetup

El performCustomSetup es un procedimiento que es llamado después de pulsar el botón Run pero antes de ejecutar MyFirstMethod y es el lugar idóneo para introducir el código relacionado con la puesta en escena antes de que nuestro programa entre en ejecución. Accedemos a él seleccionando this en el Methods Panel

ProcedimientosClaseScene

Hacemos clic derecho en el performCustomSetup y elegimos dicha opción en el desplegable que se abre. Aparecerá una nueva pestaña con este procedimiento.

DistribucionAleatoria8

Así es como queda una vez invocado el nuestro procedimiento

DistribucionAleatoria9

Y este es el resultado:

DistribucionAleatoria10DistribucionAleatoria11DistribucionAleatoria12DistribucionAleatoria13

 

 

 

 

 

 

El proyecto con el ejemplo en el sigiente enlace:

ColocacionAleatoria.a3p

 

Alice 3.1 – Como transformar la postura de un objeto en el Scene Editor en código

En Alice no está previsto que a partir de una determinada postura de un objeto en el Scene Editor se pueda extraer de manera cómoda su equivalente en código. Si el usuario quiere reproducir esa postura en el programa, debe codificar todos los movimientos que fueron necesarios para lograrla e introducir esas sentencias.

Parece que esa “carencia” fue establecida de manera intencionada por el equipo de Alice con el fin de que los usuarios tuvieran que pensar por ellos mismos cómo conseguir los movimientos de los objetos. Sin embargo, por lo menos en la versión 3.1, hay una forma de conseguir transformar de manera sencilla una posición de un objeto en el Scene Editor en código. Es un tanto rudimentaria pero efectiva.

PosicionEnEditCodeUna vez que colocamos el objeto en una determinada posición en la escena y queremos repetirla en nuestro programa, nos encontramos con el problema de definir en forma de sentencias los movimientos efectuados con los controles Default, Rotation, Traslation y Resize. Nos vemos obligados a tratar de reproducir cada giro o movimiento mediante los procedimientos “one shots” y simultaneamente ir transportándolo al código.

Hay una manera que en algunos casos nos puede ayudar a ganar tiempo, sobretodo cuando queremos reproducir una postura muy elaborada. Tiene que ver con uno de los procedimientos que ejecuta Alice para preparar la escena con anterioridad a ejecutar el código del usuario.

Al pulsar Run, Alice crea todos los objetos que el usuario puso en la escena y además establece para cada uno de ellos una posición y una orientación respecto al objeto en que está anclado (propiedad vehicle) que por defecto es la propia escena (this).

El procedimiento al que me estoy refiriendo es el performGeneratedSetup. Por defecto no está a la vista, pero es posible acceder a él, En esta otra entrada está se muestra como añadir una pestaña con el performGeneratedSetup en el Code Editor

Con nuestro objeto en la posición y postura deseada en el Scene Editor, el performGeneratedSetup en una pestaña del Code Editor (y a ser posible que no haya ningún código en MyFirstMethod o esté desactivado) pulsamos el botón Run, lo que hará que el código del performGeneratedSetup se genere de nuevo. Vamos a la parte final, y después de las sentencias que inicializan los objetos ground y camera encontramos las de nuestro objeto, en este caso un objeto teenPerson de los SIMS.

CodigoperformGeneratedSetup

Ahora nos vamos a fijar en tres tipos de sentencias:

setPositionRelativeToVehicle: permite colocar un objeto en una posición determinada por sus tres coordenadas espaciales (x=right, y=up, z=backward), que coinciden con las mostradas en el Scene Editor

SetPositionRelativeToVehicle

 

setOrientationRelativeToVehicle: orienta un objeto en base a cuatro coordenadas llamadas x,y,z,w. Son los cuaterniones y es una manera de experesar la orientación y la rotación de un objeto.

Con estos dos procedimientos, que pueden ser aplicados tanto a un objeto como a cada una de sus articulaciones (joints) es posible fijar en pocas líneas de código la posición y postura de cualquier objeto. Sin embargo no están accesibles para el usuario en el Methods Panel.

Utilizando el clipboard (el cuadrado blanco arriba a la derecha) podemos copiarlas en él (botón derecho, Copy to clipboard) y pasarlas posteriormente a cualquier procedimiento nuestro. En este ejemplo se ha creado el procedimiento MiPostura. Cada vez que es llamado, el teenPerson se coloará en esta postura, independientemente de la posición en que se encuentre.

Al arrastrar las sentencias a nuestro procedimiento vemos que la parte del objeto queda en rojo. Hay que cambiarlo a this en cada una de ellas.

MiPostura1

MiPostura3

Y también meter todas las sentencias en un do together para que se ejecuten juntas

MiPostura6

Ahora si pulsamos en el Botón de Clases y miramos en TeenPerson ya vemos nuestro procedimiento MiPostura listo para ser utilizado cuando queramos

MiPostura5

 

Alice 3.1 – ¿En qué lugares podemos poner nuestro código?

Cuando pulsamos el botón “Run” de Alice el programa comienza a ejecutar el código que hemos metido en el procedimiento “MyFirstMethod”. Esta es una de las primeras cosas que se aprenden al programar en Alice. Sin embargo, hay otros lugares donde se puede introducir código además de “MyFirstMethod”.

Alice funciona como lo hace un programa en java. Al pulsar “Run” el primer procedimiento que se ejecuta es el “main“, que está en la clase “Program”

ClaseProgram

El “main” crea una instancia de la clase “Program” , la llama “story” y a continuación la inicializa. Con otro procedimiento llamado SetActiveScene se activa el objeto de clase Scene, que es el que proporciona el escenario y los actores para la animación.

ProcedimientoMain1

El objeto Scene necesita procedimientos especiales (Unique Procedures) para la tarea de crear la escena y gestionar la animación. El “handleActiveChanged” gestiona las llamadas a estos procedimientos.

handleActiveChanged

Primero es llamado el performGeneratedSetup. Todos los objetos que creamos en el “Scene Editor” y las acciones que realizamos sobre ellos antes de pulsar el boton “Run”, son almacenados en forma de código en el performGenerateSetup. En el momento que es invocado, este procedimiento ejecuta ese código (que permanece oculto para el usuario) de tal forma que antes de comenzar a ejecutarse las sentencias programadas por el usuario, la escena quede recreada en la “runtime window” de la misma manera que en el “Scene Editor”.

performGeneratedSetup

En la imagen se pueden ver las sentencias utilizadas para crear el ambiente inicial de la escena, creando los objetos “ground” y “camera”. A continuación vendría el código correspondiente a los objetos creados en el “Scene Editor” por el usuario. Desde Netbeans se puede acceder a este código y modificarlo.

En segundo lugar es llamado el “performCustomSetup“, cuya función es contener el código que pueda necesitarse para efectuar en la escena ajustes difíciles o imposibles de  hacer desde el “Scene Editor” y solo se puedan llevar a cabo mediante sentencias. Un ejemplo del uso de este procedimiento es para posicionar objetos en la escena. En el libro “Alice 3 in Action: Computing Through Animation” de Joel Adams viene el siguiente ejemplo:

EjemploperformCustomSetup

En este caso el performCustomSetup se utiliza para para colocar de manera aleatoria en la escena los objetos previamente creados en el “Scene Editor”.

El tercer y último procedimiento llamado desde el handleActiveChanged es el “initializeEventListeners“, que inicializa los escuchadores de eventos (event listeners). Cuando durante la ejecución del programa detectan que se ha producido el evento le dan paso al código introducido por el usuario para el caso de que produzca dicho evento. Hay event listeners para diferentes tipos de evento, como pulsaciones de teclado, clics de ratón, colisiones entre objetos, etc.

EventListeners

Cuando termina el procedimiento handleActiveChanged es detectado el primero de los eventos (la activación de la escena) por el addSceneActivationListener y pasa a ejecutarse el código asociado, que no es otro que el conocido procedimiento “MyFirstMethodaddSceneActivationListener

Por tanto, desde que pulsamos el botón “Run” hasta que comienza a ejecutarse myFirstMethod son invocados los siguientes procedimientos:

 

1. main

Para acceder a este procedimiento tiene que estar activada en Preferences la opción “Main Program Class (available)”. Vamos al Botón de clases. En el desplegable elegimos la clase Program y en el siguiente desplegable elegimos el procedimiento main.

ProcedimientoMain2

2. handleActiveChanged

En el Panel de Métodos (Methods Panel) elegimos this en el desplegable y aparecen los cuatro procedimientos que tiene scene por defecto:

ProcedimientosClaseScene

Hacemos clic derecho en el tercer procedimiento y seleccionamos la opción handleActiveChanged. Aparece una nueva pestaña con el código.

handleActiveChanged1

3. performGeneratedSetup

Es el código generado automáticamente para recrear la escena introducida por el usuario. Se accede a él desde el procedimiento del punto anterior. Clic derecho en él y elegimos la opción performGeneratedSetup para que aparezca la pestaña con el código. Es a nivel informativo porque cualquier modificación que hagamos aquí se va a sobreescribir al pulsar Run.

performGeneratedSetup

 

4. performCustomSetup

El código de usuario para ajustes difíciles o imposibles desde el “SceneEditor”. El camino más rápido para acceder a este procedimiento es ir a la pestaña de la clase Scene y hacer clic en él.

PestañaScene

5. initializeEventListeners

Inicializa los escuchadores de eventos, en los cuales de puede introducir código. Tiene su propia pestaña por defecto.

6. addSceneActivationListener

Igual que en el punto anterior. Es el primer escuchador de eventos que se activa

 

Por otra parte, pulsando en el Boton de Clases podemos acceder a un desplegable por cada clase, a través del cual es posible añadir a una clase un procedimiento, una función o una propiedad.

 

Ahora ya podemos hacer una relación de los lugares en los que el usuario de Alice 3 puede introducir su código:

 

1. En el performCustomSetup, para ajustes en la escena previos a la ejecución del programa en sí.

2. En cada uno de los Event Listeners, para que se ejecute cada vez que se produzca el evento en cuestion

3. Aunque va incluido en el punto anterior, en particular se puede introducir también código en el addSceneActivationListener, para que se ejecute al mismo tiempo que el programa alojado en MyFirstMethod

4. En MyFirstMethod, por supuesto.

5. y para cada clase: procedimientos, funciones y propiedades

 

A continuación un cuadro extraido de http://www.alice.org que explica los procedimientos vistos anteriormente

ProceduresForthisScene

 

 

 

 

 

Alice 3 – Enlaces de interés

Alice es un software educacional para aprender a programar. Está desarrollado por un equipo de personas de la universidad Carnegie Mellon y actualmente va por la versión 3.1.

Sitios de interés

www.alice.org –> página de Alice. Aquí explican cómo bajar e instalar el programa. También tienen material para aprendizaje de la versión 3.1

http://aliceprojectcmu.blogspot.com.es/ –> blog del equipo de Alice donde van poniendo las últimas noticias

http://lists.andrew.cmu.edu/pipermail/alice-teachers/ –> lista de correo de la Carnegie Mellon donde se responden dudas de Alice 3

Tutoriales

http://www.alice.org/3.1/index.html –> material de aprendizaje de Carnegie Mellon, Colling College y Oracle Academy

http://www.alice.org/3.1/Materials/HowToGuide/HowToGuide_PDF_Complete.pdf –> una buena guía para iniciarse en Alice 3.1, dividida en cuatro partes.

http://www.sps186.org/downloads/attachments/31608/Alice%203%20Cookbook%20%5Bebook%5D.pdf  –> libro para Alice 3.0. Aunque hay algunas diferencias con la versión 3.1 enseña muchos conceptos útiles

http://ice-web.cc.gatech.edu/dl/?q=node/801 –> dos tutoriales interesantes

http://www.slideshare.net/kashifonline/alice-workshop-v1presentationslidesv11 –> Telling a story visually (Oracle Academy)

http://alice3.pbworks.com/w/page/57585609/Built-in%20Methods –> Built in methods

Otros sitios

http://alicetutorials.blogspot.com.es –> blog con algunos tutoriales

http://www.daleaceptar.gob.ar/ –> Sitio argentino dedicado a la programación en Alice (en español)