Tag Archives: performCustomSetup

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

 

Advertisements

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