Читать книгу Processing - Tomás Domínguez Mínguez - Страница 9

Оглавление

3

PROGRAMACIÓN CON PROCESSING

Aunque se hable de la programación de Arduino como si de un lenguaje específico se tratara, eso realmente no es así, ya que esta se hace en C++. Lo que sucede es que Arduino incorpora dentro de su IDE un conjunto de librerías que facilitan la programación de los pines de entrada y salida asociados a sus puertos analógicos y digitales. En Processing sucede algo similar, solo que ahora se programa en Java y el foco es el diseño gráfico, no el manejo de puertos. Además, tal como apunté anteriormente, Arduino no deja de ser un proyecto escindido de Processing, por lo que su filosofía de trabajo es similar.

Aunque Java y C++ son lenguajes diferentes, el uso de variables, estructuras de control, operadores o manejo de funciones tienen una sintaxis similar, por lo que podrá reutilizar los conocimientos de programación ya adquiridos con Arduino. Lo que sea específico de Processing se irá explicando a lo largo del libro según se vaya necesitando.

Finalmente, indicar que la referencia del lenguaje Processing se localiza en https://processing.org/reference/. Este será el sitio al que deberá acudir para conocer los detalles de cualquiera de las funciones que lo componen.

3.1 FUNCIONES SETUP() Y DRAW()

Un programa Processing se llama sketch, algo que podría traducirse como boceto o borrador. Los sketchs se almacenan en carpetas que se llaman sketch folders y, estos a su vez, en lo que se conoce como sketchbook, otra carpeta a nivel superior que se usa como ubicación predeterminada para guardar todos sus proyectos. Se puede acceder a los sketchs almacenados en el cuaderno de bocetos desde Archivo sketchbook. Naturalmente, desde Archivo Abrir... se permite abrir un sketch ubicado en cualquier otra carpeta del sistema.

Al igual que sucedía con Arduino, los sketchs o programas Processing se componen de dos grandes bloques de código: setup() y draw(). Ambos bloques, en realidad, son funciones que agrupan un conjunto de instrucciones capaces de realizar una tarea específica. En general, una función toma como entrada una serie de argumentos, que son los datos que necesita para realizar dicha tarea, y devuelve un resultado. En el caso que ocupa, setup() y draw() no toman argumentos de entrada ni tampoco devuelven ninguna salida. Por eso, se declaran de esta forma:


La palabra reservada void indica que estas funciones no devuelven ningún resultado tras su ejecución. Los paréntesis vacíos indican que no tienen argumentos de entrada, es decir, no necesitan que les pase ningún dato para poder realizar su tarea. Las instrucciones que componen cada función van enmarcadas entre llaves.

Los nombres de las funciones (igual que el de las variables) son case-sensitive, lo que significa que un carácter en mayúsculas es diferente del mismo en minúsculas. Por ejemplo, la función leeSensor() es diferente de leesensor(). Por supuesto, un nombre nunca puede llevar espacios.

NOTA. En Java existe una serie de convenciones de nomenclatura a la hora de escribir código que, aunque no son de obligado cumplimiento, se recomienda seguir para mejorar su legibilidad. En el caso de los nombres de las funciones (también el de las variables) suele usarse una nomenclatura llamada «camel case» que consiste en nombrar la función empezando por minúsculas y, en vez de utilizar caracteres como «-» o «_» para separar nombres compuestos, cada componente del nombre se empieza por mayúsculas. Por ejemplo, una función que obtiene los datos de un sensor podría llamarse obtieneDatosSensor. Es precisamente el perfil en forma de joroba de camello que muestra una palabra al mezclar mayúsculas y minúsculas lo que da nombre a esta nomenclatura.

Las instrucciones que componen la función setup() se ejecutan una única vez. Por ese motivo, esta función se utilizará para definir las condiciones iniciales del entorno como, por ejemplo, el tamaño de la pantalla. Solo puede haber una función de setup () en cada programa y no se debe volver a llamar después de su ejecución inicial.

Por el contrario, las instrucciones de la función draw() se ejecutarán una y otra vez de forma repetida. Serán las encargadas de realizar el refresco continuo de la imagen que se muestra en pantalla, al igual que los fotogramas de una película. Cada uno de dichos fotogramas se pintará en un ciclo del bucle, en el que también se atenderán los posibles eventos de teclado, ratón, comunicaciones, etc., que permitirán la interactividad del programa.

Como habrá comprobado, ambos bloques son similares a los de setup() y loop() de Arduino.

NOTA. En este libro, con el ánimo de mostrar de la forma más clara y sencilla el funcionamiento de las funciones de Processing, se van a utilizar ejemplos que, por su simplicidad, en algunos casos permitirían que todo el código pudiera situarse dentro del bloque setup(), dentro del bloque draw() o, incluso, escribirlo sin utilizar ninguno de dichos bloques. Sin embargo, siempre se usarán ambos bloques ya que, de lo contrario, no se estaría siguiendo la filosofía de programación subyacente bajo Processing.

NOTA. Con frecuencia llamaré a las funciones Processing comandos. También me referiré a las líneas de código acabada en punto y coma («;») como sentencias. En el caso de las funciones setup() y draw(), al ser la base de la estructura de un programa Processing, las identificaré generalmente como bloques.

Processing

Подняться наверх