You are on page 1of 5

Animaciones en Java

Una animacin es la presentacin de imgenes una despus de la otra cada una con ligeras
diferencias respecto a la anterior.
Para que la animacin sea buena, las imgenes se deben presentar con suficiente rapidez, y
los cambios entre las imgenes no deben ser muchos. Una buena animacin har creer a
nuestros ojos que estas imgenes se estn viendo en movimiento.
uando la animacin no es buena, la imagen parpadear y destruir la ilusin de
movimiento.
Doble Buffer
!l mostrar imgenes y sobre todo cuando son grandes, stas suelen aparecer a trozos o con
parpadeo. "as aplicaciones #ava permiten que los programas dibujen en memoria, para luego
ir mostrando la imagen completa de forma suave.
$ste es el proceso conocido como doble%buffering, y tiene dos ventajas fundamentales sobre
el proceso normal de pintar o dibujar directamente sobre la pantalla&
Primero, el usuario ve aparecer de golpe la imagen en la pantalla. 'ientras el usuario est
viendo esa imagen, el programa est generando la siguiente para mostrarla de golpe a
continuacin, y as( una y otra vez.
)egundo, la tcnica de doble%buffering involucra un objeto *mage, que se puede pasar
directamente a varios mtodos. $sta capacidad para manipular objetos *mage permite
descomponer las rutinas de dibujo en componentes funcionales, en lugar de un enorme
mtodo paint+,.
$l doble%buffering slo debe usarse para animaciones grficas, no como mtodo normal.
Para utilizar el doble buffering se requiere de un conte-to grfico +la zona donde se va a
pintar, y utilizarlo en la declaracin del mtodo paint+,&
public void paint+ .raphics g ,
$l objeto Graphics g es el conte-to grfico. )e utiliza g para realizar todo el dibujo en el
applet. Por ejemplo&
g.dra/)tring+ 012ola30,45,45 ,6
g.dra/7ect+ 85,85,59,89 ,6
$ntonces, #ava traduce todo lo que se dibuja en g en imgenes sobre la pantalla. Para
:*. ;esarrollo de !pplets < aplicaciones con uso
de base de datos, redes, )ervlets y multimedia
realizar doble%buffering, se necesita crear un conte-to grfico que no es presentado
inmediatamente en la pantalla.
Creacin de Contextos Grficos
rear conte-tos grficos tiene dos pasos& rear una imagen vac(a con las dimensiones
adecuadas y obtener un objeto .raphics de esa imagen. $l objeto .raphics que se construye
en el segundo paso realiza la funcin de conte-to grfico.
public class !ninacion e-tends !pplet =
*mage doble>uffer6
.raphics mi.6
public void init+, =
<< *nicializa el doble buffer
doble>uffer ? create*mage+ @99,@99 ,6
mi. ? doble>uffer.get.raphics+,6
<< onstruye un rea grfica de trabajo
mi..setolor+ olor./hite ,6
mi..fill7ect+ 9,9,@99,@99 ,6
resize+ 599,A59 ,6
B
;entro del conte-to grfico mi. se puede dibujar cualquier cosa. "as imgenes se trazarn
en el doble buffer y cuando el dibujo se haya terminado el doble buffer pasa a la pantalla.
public void paint+ .raphics g , =
<< )lo se tiene que presentar la imagen del buffer
g.dra/*mage+ doble>uffer,9,9,this ,6
B
Por Cltimo queda utilizar el conte-to. "a siguiente aplicacin muestra un applet que utiliza la
tcnica del doble buffering para mostrar un cuadro formado por c(rculos.
import java.a/t.D6
import java.applet.!pplet6
public class !nimacion4 e-tends !pplet =
*mage doble>uffer6
.raphics mi.6
public void init+, =
<< *nicializa el doble buffer
doble>uffer ? create*mage+ @99,@99 ,6
mi. ? doble>uffer.get.raphics+,6
<< onstruye un rea grfica de trabajo
mi..setolor+ olor./hite ,6
mi..fill7ect+ 9,9,@99,@99 ,6
resize+ 599,A59 ,6
B
public void paint+ .raphics g , =
<< Presenta la imagen del buffer
g.dra/*mage+ doble>uffer,9,9,this ,6
B
public void titulo+, =
<< Ebtiene la fuente de te-to actual y se guarda
Font f ? mi..getFont+,6
<< )elecciona otro color y otra fuente para el t(tulo
mi..setolor+ olor.blue ,6
mi..setFont+ ne/ Font+ 0Gimes7oman0,Font.>E";,49 , ,6
mi..dra/)tring+ 0$jemplo de uadrado0,85,59 ,6
mi..dra/)tring+ 0con (rculos0,85,H9 ,6
<< 7ecupera la fuente original
mi..setFont+ f ,6
B
public void cuadrado+, =
int -,y6
<< )elecciona otro color para el cuadrado
mi..setolor+ olor.red ,6
<< ;ibuja circulos en los lados horizontales
y ? 8996
for+ -?8996 - I? 4996 -J?89 ,
=
mi..dra/Eval+ -,y,49,49 ,6
mi..dra/Eval+ -,yJ899,49,49 ,6
B
<<< ;ibuja circulos en los lados verticales
- ? 8996
for+ y?8996 y I? 4996 yJ?89 ,
=
mi..dra/Eval+ -,y,49,49 ,6
mi..dra/Eval+ -J899,y,49,49 ,6
B
B
public void start+, =
<< 2ace el dibujo off%line
titulo+,6
cuadrado+,6
<< 'uestra la imagen de golpe
repaint+,6
B
B
Animacin utilizando Hilos
"a creacin de animaciones es una aplicacin directa del uso de hilos +threads,. #ava es el
lenguaje ideal para programar animaciones en la Keb utilizando esta tcnica.
$l siguiente applet muestra una pelota movindose por el rea de trabajo.
import java.a/t.D6
import java.applet.D6
public class !nimacionPelota e-tends !pplet implements 7unnable =
Ghread anima6
int radio?896 <<radio de la pelota
int -, y6 <<posicin del centro de la pelota
int d- ? 86 <<desplazamientos
int dy ? 86
int ancho!pplet6
int alto!pplet6
int retardo?L96
<<rea el ;oble buffer
*mage imag6
.raphics g>uffer6
public void init +, =
set>acMground+olor./hite,6
ancho!pplet?get)ize+,./idth6 <<dimensiones del applet
alto!pplet?get)ize+,.height6
-?ancho!pplet<A6 <<posicin inicial de la pelota
y?alto!pplet<46
B
public void start+,=
if+anima ??null,=
anima?ne/ Ghread+this,6
anima.start+,6
B
B
public void stop+,=
if+anima3?null,=
anima.stop+,6
anima?null6
B
B
public void run+, =
long t?)ystem.currentGime'illis+,6
/hile +true, =
mover+,6
try=
<<Para evitar parpadeo
tJ?retardo6
Ghread.sleep+'ath.ma-+9, t%)ystem.currentGime'illis+,,,6
B catch+*nterrupted$-ception e-,=
breaM6
B
B
B
void mover+,=
<<cambia la posicin -, y de la pelota
- J? d-6
y J? dy6
<<cuando la pelota topa en alguno de los e-tremos
if +- N? +ancho!pplet%radio, OO - I? radio, d-D? %86
if +y N? +alto!pplet%radio, OO y I? radio, dyD? %86

repaint+,6 <<"lama al mtodo update
B
public void update+.raphics g,=
if+g>uffer??null,=
imag?create*mage+ancho!pplet, alto!pplet,6
g>uffer?imag.get.raphics+,6
B
g>uffer.setolor+get>acMground+,,6
g>uffer.fill7ect+9,9, ancho!pplet, alto!pplet,6
<<dibuja la pelota
g>uffer.setolor+olor.red,6
g>uffer.fillEval+-%radio, y%radio, 4Dradio, 4Dradio,6
<<transfiere la imagen al conte-to grfico del applet
g.dra/*mage+imag, 9, 9, null,6
B
public void paint +.raphics g, =
<<se llama la primera vez que aparece el applet
B
B

You might also like