Java. Clases y Objetos

Antes de empezar la lección de hoy, en este enlace puedes descargar la solución al objeto anterior. Puedes comprobar como funciona de la manera esperada.

Volviendo al tema que nos trata. Como hemos podido observar en estos días, según los programas van creciendo en complejidad, va aumentando las líneas de código. Aunque el uso de variables, constantes y funciones ayuda (programación estructurada) cada vez resulta más difícil entender lo que hace el programa solo echando un vistazo a su código. Imagínate lo que puede ser esto en un entorno profesional donde 10 o 12 programadores trabajan diariamente en el mismo proyecto.

En este contexto de creciente complejidad, surge la idea de la programación orientada a objetos. La idea que subyace es la siguiente: En lugar de crear y utilizar funciones para mover, cambiar de color, pintar,... un Mickey, ¿qué tal si tenemos un objeto Mickey que se pinta, cambia de color o mueve cuando se lo ordene?

En programación orientada a objetos, cada objeto es una entidad software independiente que tiene:
  • Atributos: Son variables del objeto que contienen el estado del mismo.
  • Métodos: Son funciones que podremos utilizar que determinan el comportamiento del objeto

En la programación orientada a objetos tendremos dos elementos relacionados:
  • Clase: Define los atributos y los métodos del objeto. El equivalente con las funciones es cuando defino y programo una función.
  • Objeto: Es una "instancia" de una clase. El símil con las funciones es cuando llamo o utilizo una función que previamente me he creado.

La sintaxis básica de una clase es la siguiente:

class NombreClase {
   //Zona para los atributos

  //Zona para los constructores

  //Zona para los métodos

Aunque está permitido poner una clase dentro del fichero principal, lo normal ponerlo en ficheros independientes con el fin de que el código sea más claro.

Veamos un ejemplo. La clase Ball. Aquí puedes obtener el código. Crea una nueva pestaña llamada Ball en un sketch de Processing y copia el código en ella.


Y su utilización en un programa (o sketch). Pincha en este enlace para obtener el código y copialo en la primera pestaña.


Modifica el código del sketch anterior para que:
  • La bola aumente de tamaño (radio = 30) cuando tenemos el ratón encima.
  • La bola 2 haga lo mismo que la bola 1.


Vídeotutorial de Processing

En la web tienes muchos tutoriales y videotutoriales muy prácticos de Processing.

Yo he recopilado (reduciendo algún vídeo que me parecía demasiado extenso) un taller sobre Processing realizado por el profesor José León que, aunque inconcluso, me parece tiene bastante calidad. Está ubicado en la pestaña Processing

Evidentemente, no se ajusta 100% al temario del curso, pero viene muy bien como aporte complementario.

Os recuerdo que Processing es totalmente gratuito. Te lo puedes descargar desde su página web.

Espero que sea de vuestro interés.

Resultados control

Más allá de los resultados de la prueba, lo interesante es conocer como va a ser parte de las preguntas del examen de la tercera evaluación y haber comprendido el porqué de las respuestas correctas.

YARA 0,000,00
JOSE RAMÓN 0,000,00
MARCOS0,000,00
MARIO 2,500,50
DERLY 4,000,80
MARINA4,000,80
LUCÍA3,500,70
CARLOTA0,000,00
ENRIQUE 0,000,00
PAULA1,000,20
BLANCA 5,001,00
SARA0,000,00
MARCOS 0,000,00
MÓNIKA5,501,10
VÍCTOR1,000,20
RUBÉN4,000,80
ANDREA 0,000,00
NEREA3,500,70
JAVIER2,500,50
ARKAITZ 0,000,00
NOA1,500,30
LAURA 6,001,20
SERGIO1,000,20



Processing. Control del teclado

En Processing la variable predefinida keyPressed, de tipo boolean, nos informa si hay una tecla pulsada. Además, la variable especial key indica la última tecla que ha sido presionada (o soltada). Dicha variable es de un tipo nuevo para nosotros, el tipo de datos char.

Pulsa aquí para obtener este código.

Processing nos permite también controlar el teclado mediante eventos (de forma asíncrona). Observa como este código realiza una función similar. Processing llama de manera automática a la función keyPressed() cuando se pulsa una tecla. Es importante que te fijes como funciona de forma ligeramente diferente.


Pulsa aquí para obtener este código.

En esta práctica moveremos el Mickey pulsado distintas teclas del teclado. El siguiente programa controla el Mickey de la siguiente forma:
  • Con las teclas de las flechas se controla la dirección
  • Con la tecla 'a' se pone en movimiento el Mickey
  • Con la tecla 's' se para el Mickey
En esta práctica tienes que modificar el código para que:
  1. Sea un programa controlado por eventos: Para ello mueve la parte del código que controla el teclado dentro de la función keyPressed() que, previamente, habrás de definir.
  2. Cuando se pulse la tecla 'c' (constante CENTRAR) el Mickey vuelva al centro de la pantalla.
  3. Cada vez que se pulsa la letra 'a' (constante ANDAR) se incremente la velocidad con la que se mueve el Mickey.






Java. Sentencia if

En esta ocasión, vamos a crear y utilizar funciones que devuelvan datos.

En esta práctica pintaremos una única cara de color negro, pero cuando se pase el ratón por encima de ella cambiará el color a azul.


Utilizaremos dos tipos de datos nuevos de Java:

  • float: Tipo de datos para número decimal
  • boolean: Tipo de datos lógico. Admite solo dos posibles valores true y false.

Además, utilizaremos condiciones
O también

Ojo: En Java, = es el operador de asignación y == el de comparación.

Puedes utilizar este código de base. Como ves, hay una función nueva, distancia(), que calcula la distancia entre dos puntos y tocandoMickey() que utilizando la anterior ha de informarnos si tenemos el ratón encima de la cara. Termina esta última función para alcanzar el reto.


Processing. Colores y bordes

En Processing tenemos varias técnicas para el color:

  • Escala de grises
  • Modelo RGB (Red, Green y Blue)
  • Modelo HSB (Hue, Saturation y Brightness)


Si quieres saber más sobre el color puedes pulsar en este enlace.

Los más utilizado son los dos primeros. En Processing existe un tipo de datos especial para el color y una función que nos ayuda a fijar el color deseado. Por ejemplo, el siguiente código crea una variable llamada colorCara y le asigna el color rojo:


Por otra parte hemos visto la función fill() para cambiar el color de fondo de los objetos que pintamos. En Processing también hay un par de funciones que nos permiten modificar el borde:

  • stroke(): Permite poner el borde con el color deseado.
  • noStroke(): Quita los bordes.

En esta práctica cumpliremos con dos objetivos:

  • Modificar la función para que admita un color.
  • Pintar las tres caras con distintos colores.
Si no dispones del código de la práctica anterior, puedes utilizar el siguiente.

Java. Funciones

En la práctica anterior utilizamos variables para poder modificar algunos aspectos del resultado final modificando solo algunos parámetros del código.

¿Qué hacemos si queremos pintar varias caras? Podemos hacer dos cosas: Replicar el código tantas veces como caras queramos pintar o crearnos una función que pinte caras y llamarla tantas veces como queramos.

Para declarar una función en Java se utiliza la siguiente sintáxis:

tipoDevuelto nombreFunción (tipoParametro parametro1, tipoParametro parametro2,...) {

}

Entre las llaves pondremos el código que queremos que haga nuestra función.

Por ejemplo:


Pintamos dos cruces en dos posiciones diferentes.

Lo que se pide en esta práctica es modificar el código de la práctica anterior anterior para pintar varias caras en posiciones distintas de la pantalla. Para ello, podemos implementar una función como la que sigue.



Por si te perdiste en la práctica anterior, puedes emplear este código.

Processing. Modo dinámico

Hasta ahora hemos utilizado el modo estático de Processing. Realiza las acciones que le pedimos y acaba. En esta práctica vamos a utilizar el modo dinámico para poder interactuar con la aplicación.

En el modo dinámico, tenemos que "implementar" dos funciones predefenidas de Processing: setup() y draw().

En el modo dinámico lo que haya dentro de setup() es lo primero en ejecutarse y solo lo hace una vez. A continuación se ejecuta todo lo que hay dentro de la función draw() de forma repetitiva. Es decir, cuando se alcanza la última instrucción de draw(), se vuelve a la primera.

Por ejemplo:

Si observamos detenidamente el código, aparecen dos variables que no hemos definido: mouseX y mouseY. Estas variables nos las proporciona el entorno de Processing (puedes buscarlas en la referencia) y como imaginas nos dan las coordenas x e y del puntero del ratón en la pantalla.

Te animo a que pruebes este pequeño programa en Processing para que veas como se ejecuta.

Pero lo que se te pide en esta práctica, es que modifiques tu código de la cara para que siga al ratón. 

Si te perdiste en prácticas anteriores puedes utilizar el siguiente código.

Java. Variables

En la práctica anterior utilizamos 5 funciones de Processing para dibujar una cara. Por si alguien se perdió y no pudo terminar, puede utilizar el siguiente código para continuar con la práctica de hoy.


¿Que pasa si queremos dibujar la cara en otra posición de pantalla o con otro tamaño? Tenemos dos opciones: Modificar todo el programa. Poner la posición y el tamaño en función de variables, de tal forma, que solo modificando estas podamos conseguir el objetivo.

En esta práctica utilizaremos variables para "parametrizar" el código. En Java las variables tienen tipo (se dice que están tipadas). La sintaxis que utilizaremos es la siguiente.

tipo nombreVariable;
nombreVariable = valor;

Por ejemplo, a continuación se declara la variable x (se crea) de tipo numero entero (con la palabra reservada int) y a continuación se le asigna el valor 200;
Para parametrizar el anterior programa utilizaremos 3 variables, x, y, size.