Greenfoot & Kinect
-
Upload
eduardo-calvillo -
Category
Education
-
view
1.496 -
download
2
description
Transcript of Greenfoot & Kinect
Greenfoot & KinectEduardo H. Calvillo Gámez
Primeros Pasos
Configurar Greenfoot para que se comunique con Kinect http://www.greenfoot.org/doc/kinect/index.html
Ejecutar kinectserver y dejarlo corriendo mientras se compila y ejecuta el programa
Primeros Pasos
Obtener el escenario básico para Kinect Clase KinectWorld – subclase de World Clases
Joint KinectClient Point3D UserData
ZIP en página web del curso
O agregar manualmente cada clase
Clases
Revisar API Doble clic sobre clase Cambiar a ver documentación
KinectWorld Métodos para que nuestro mundo pueda interactuar con Kinect
Joint Clase para identificar coyunturas del esqueleto
KinectClient Realiza la interacción entre Kinect y Greenfoot
Point3D Un punto en 3D
UserData Clase que almanacena los datos del usuario frente a la cámara
Ejercicio 1Utilizando la cámara
Lo Básico
Necesitamos obtener lo que este monitoreando la cámara y desplegarlo en el mundo
Revisando la API de Greenfoot básica, necesitamos una imagen para desplegar en el mundo.
Clase KinectWorld Método getThumbnail()
Instrucciones
Crear un escenario nuevo Kinect1
Crear una subclase de Actor que se llame “Foto” Las clases de tipo Actor son los que aparecen e interactúan en el mundo Sin imagen
Cuando la clase actúe Nos traemos la imagen que este captando la cámara
getWorld().getThumbnail() Necesitamos hacer un casting para que el mundo que nos traigamos
reconozca los métodos de la subclase y no de la clase padre ((KinectWorld)getWorld).getThumbnail() Y se lo asignamos a una imagen de tipo GreenfootImage
La asignamos a la clase al Actor
Código
public void act()
{
GreenfootImage img = ((KinectWorld)getWorld()).getThumbnail();
setImage(img);
}
Instrucciones (2)
No interactuamos directamente con la clase KinectWorld
Creamos una subclase Kinect1World
Sin imagen Creamos un objeto de tipo Foto Agregamos el objeto al centro del mundo
Código (2)
public Kinect1World()
{
Foto f = new Foto();
addObject(f,getWidth()/2,getHeight()/2);
}
Ejercicio 2Agregando más actores
Clase Etiqueta (Label)
Todo lo que aparece en el mundo de greenfoot debe de ser una imagen
El texto lo debemos convertir a una imagen
La clase Etiqueta, que nosotros tenemos que implementar, hace el trabajo Disponible por comunidad
Revisar API de GreenfootImage Constructor
Instrucciones
Crear una subclase de Actor Label
Copiar el código que se muestra a continuación Modificar al gusto
Código (3)
public Label(String text){
setText(text, 20);
}
public void setText(String text, int size){
setImage(new GreenfootImage( text, size, java.awt.Color.BLACK, new java.awt.Color(0,0,0)));}
Instrucciones (4)
En el mundo Kinect1World Agregar un objeto de tipo Etiqueta
Los objetos tienen precedencia en el orden que los ponemos en la pantalla como una Pila El que ponemos primero, se queda atrás.
Código (4)
Label l = new Label("Hecho por EHCG");
addObject(l, 100,100);
Instrucciones (5)
Crear una nueva subclase de Actor Pingu con la imagen de Tux Su única acción es dar vueltas
Quitar el objeto de tipo Foto del mundo
Implementar el método act() en Kinect1World
La primera línea tiene que ser super.act();
para que se actualice el mundo de Kinect
Instrucciones (5.2)
Cambiar el fondo a negro getBackground().setColor(java.awt.Color.BLACK); getBackground().fill();
Agregar objetos de tipo Pingu en posiciones al azar int x // contiene un número al azar del tamaño del
fondo; addObject (new Pingu(), x, 100);
Agregar la silueta del usuario de Kinect getCombinedUserImage();
Código (5)
GreenfootImage userImage = getCombinedUserImage();
userImage.scale(getWidth(), getHeight());
getBackground().drawImage(userImage, 0, 0);
Instrucciones (6)
Editar Pingu para que se mueva por el mundo
Agregar una propiedad a Pingu, si es 1 esta vivo, si es 0, esta muerto y no se mueve.
En el Mundo Kinect1World Agregar una propiedad privada de tipo imagen,
donde vamos a guardar la imagen que esta detectando el Kinect.
Asignar un método para obtener la imagen
Instrucciones (6.2)
Checar si los Pingus chocan con el usuario, si chocan, borrarlos.
El usuario es una imagen, entonces únicamente se checa si tenemos alguna intersección
Y tenemos que checar el alfa del color sea mayor a 0.
Código (6)
En act() if (!colision(x,y)){ getWorld().removeObject(this); }
Código (6.2)
Kinect1World mundo = (Kinect1World)getWorld();
GreenfootImage imagenUsuario = mundo.getImagenGuardada();
if (imagenUsuario!=null){
if (
ix < imagenUsuario.getWidth() &&
iy < imagenUsuario.getHeight() &&
imagenUsuario.getColorAt(ix, iy).getAlpha() > 0 )