En este mi primer acercamiento con Processing voy a mostrar los conceptos básicos de animación en 2D, el uso de framerate, fill, background, ellipse, setup, draw y de una clase personalizada «ball» para llevar a cabo el resultado que se puede apreciar en el siguiente vídeo.

Descargar Codigo Fuente para Proccesing y Java

siguiendo la serie de publicaciones recientes, he llegado al uso de pantalla completa con java full screen exclusive mode api, ahora extendiendo en esta via, vamos a aprender como hacer una animación en pantalla completa con render loop activo, doble buffer con BufferStrategy, captura de pantalla, thread y manejo con el teclado.

aqui un video que muestra el comportamiento de la aplicacion

la aplicación permite controlar el radio del circulo con las teclas A y Z, controlar la velocidad del mismo con las teclas S y X, cambiar de direccion de forma aleatoria con la tecla D, cambiar de color de forma aleatoria con la tecla C, salir con la tecla ESC, y modificar la direccion girar en ambos sentidos con F y V

En algunas oportunidades es necesario tomar el control de toda la pantalla, para poder fijar la resolución a la que se desea trabajar, o acelerar el rendimiento gráfico de una aplicación exigente, Java provee esta capacidad a travez de su Api Full Screen Exclusive Mode

en este pequeño ejemplo, se propone un extensión del ejemplo de captura de pantalla, para poder ingresar y salir del modo Pantalla Completa utilizando la barra de Menu del JFrame.

try {            
GraphicsEnvironment gEnv =
GraphicsEnvironment.getLocalGraphicsEnvironment();

GraphicsDevice gDev = gEnv.getDefaultScreenDevice();

setVisible(false);

dispose();

setUndecorated(false);

gDev.setFullScreenWindow(null);

setSize(new Dimension(400,300));

setLocationRelativeTo(null);

setVisible(true);

} catch (Exception e) {
// TODO: Add catch code
e.printStackTrace();
}

En este pequeño ejemplo, se muestra como tomar una captura de pantalla desde java, colocar la imagen en un JPanel, y luego de forma opcional guardar la imagen en un archivo en formato PNG.

en este programa se muestra el uso de la clase ImageIO con su metodo write para guardar la imagen, la clase Robot para tomar la captura de pantalla, la clase JFileChooser para obtener el archivo donde se desea guardar, y ademas la clase Desktop para lanzar la aplicación por defecto con la imagen guardada (visor de imagenes)

Descargar Codigo Fuente

En este post presento un interprete muy simple que puede ser usado como base para la construcción de algo mas complejo, la idea fundamental en ese, es ayudar a comprender el funcionamiento de Java CUP, un generador de analizadores sintácticos LALR para Java y JFLEX un generador de analizadores léxicos basados en tabla también para Java.
El interprete consiste en una aplicación por consola que recibe como parámetro el path del archivo que se desea interpretar, y simplemente ejecuta las instrucciones del archivo en forma secuencial.
El lenguaje permite describir operaciones matemáticas, en notación polaca usando la sintaxis siguiente:

push 10 : para ingresar un numero a la pila

print :  para extraer un numero de la pila y mostrarlo en pantalla

add: suma los dos números mas arriba de la pila

sub: resta los dos números mas arriba de la pila

mult: multiplicación de los dos números mas arriba en la pila

div: división de los dos números mas arriba en la pila

Un ejemplo de archivo de entrada para la expresion  ( ( 10 + 5 ) + 15 ) * 2

push 10
push 5
add
push 15
add
push 2
mult
print

la salida para este ejemplo

la gramatica para este interprete es la siguiente

package test;

import java_cup.runtime.*;

parser code {:

public CalculadoraDePila calc = new CalculadoraDePila();

:}

terminal TOKEN_ADD, TOKEN_SUB, TOKEN_MULT, TOKEN_DIV, TOKEN_PUSH, TOKEN_PRINT;
terminal String TOKEN_NUMBER;

non terminal Documento;

non terminal Lista;

non terminal Elemento;

Documento ::= Lista {: System.out.println("DOCUMENTO OK"); :};

Lista ::= Lista Elemento {: :}
| Elemento {: :};

Elemento ::= TOKEN_ADD {: parser.calc.add(); :}
| TOKEN_SUB {: parser.calc.sub(); :}
| TOKEN_MULT {: parser.calc.mult(); :}
| TOKEN_DIV {: parser.calc.div(); :}
| TOKEN_PRINT {: parser.calc.print(); :}
| TOKEN_PUSH TOKEN_NUMBER:n
{:
Integer numero = Integer.parseInt( n );
parser.calc.push( numero );
:};

y para el analizador lexico

package test;

import java_cup.runtime.Symbol;

%%

%{

%}

%line
%char

%cup

%%

[0-9]+ { return new Symbol( sym.TOKEN_NUMBER , yytext() ); }
"push" { return new Symbol( sym.TOKEN_PUSH , yytext() ); }
"add" { return new Symbol( sym.TOKEN_ADD , yytext() ); }
"sub" { return new Symbol( sym.TOKEN_SUB , yytext() ); }
"div" { return new Symbol( sym.TOKEN_DIV , yytext() ); }
"mult" { return new Symbol( sym.TOKEN_MULT , yytext() ); }
"print" { return new Symbol( sym.TOKEN_PRINT , yytext() ); }

[\n\r\t ]+ { }

. { System.out.println( "Caracter no Esperado, ERROR LEXICO " + yytext() ); }

Código fuente en NetBeans