Ayuda con movimiento de imagen en java

javierw810
18 de Abril del 2009
[B]Hola... Estoy haciendo un programa en Jcreator que consiste en genera una pantalla y dentro de ella muestre la imagen de una mariposa moviendo las alas.(Para eso utilice tres fotos en "gifts"). Luego con las flechas: arriba, abajo, izquierda y derecha debo hacer que la mariposa se mueva por toda la pantalla.


Aqui esta el programa...cuando le doy "Ejecutar" aparece una ventana donde se ve como la mariposa mueve las alas. Sin embargo lo que aun no puedo lograr, es hacer que se genere una pantalla en donde aparesca la imagen de la mariposa y con las flechas mover a la mariposa dentro de toda la pantalla.[/B]


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class AnimadorLogo extends JPanel implements ActionListener {

private final static String NOMBRE_IMAGEN = "deitel"; // nombre base de la imagen
protected ImageIcon imagenes[]; // arreglo de imágenes

private int imagenesTotales = 3; // número de imágenes
private int imagenActual = 0; // índice de imagen actual
private int retrasoAnimacion = 50; // retraso en milisegundos
private int anchura; // anchura de la imagen
private int altura; // altura de la imagen
private float x, y;
private float vx, vy;
private boolean arriba, abajo, izquierda, derecha;
private final static int ANCHO = 6000;
private final static int ALTO = 5000;



private Timer temporizadorAnimacion; // el objeto Timer controla la animación

// inicializar objeto AnimadorLogo cargando las imágenes


private float clamp(float valor, float min, float max) {
if (valor > max)
return max;
if (valor < min)
return min;
return valor;
}



public AnimadorLogo()
{


imagenes = new ImageIcon[ imagenesTotales ];

// cargar imágenes
for ( int cuenta = 0; cuenta < imagenes.length; ++cuenta )
imagenes[ cuenta ] = new ImageIcon( getClass().getResource(
"imagenes/" + NOMBRE_IMAGEN + cuenta + ".gif" ) );

// en este ejemplo suponemos que todas las imágenes tienen la misma anchura y altura
anchura = imagenes[ 0 ].getIconWidth(); // obtener anchura de icono
altura = imagenes[ 0 ].getIconHeight(); // obtener altura de icono


setPreferredSize(new Dimension(ANCHO, ALTO));
x = 10;
y = 20;


[B]Aqui agrege las instrucciones de las flechas arriba, abajo, etc..., pero no logro hacerlas funcionar, estas las obtuve de otro programa en donde muestra una pelota roja dentro de una pantalla que se mueve con las flechas, pero la pelota roja es generada por java, y no es un imagen gift.
[/B]

addKeyListener(new KeyAdapter() {


public void keyPressed(KeyEvent e) {
actualiza(e.getKeyCode(), true);
}

public void keyReleased(KeyEvent e) {
actualiza(e.getKeyCode(), false);
}

private void actualiza(int keyCode, boolean pressed) {
switch (keyCode) {
case KeyEvent.VK_UP:
arriba = pressed;
break;

case KeyEvent.VK_DOWN:
abajo = pressed;
break;

case KeyEvent.VK_LEFT:
izquierda = pressed;
break;

case KeyEvent.VK_RIGHT:
derecha = pressed;
break;
}
}
});
setFocusable(true);


}
private void fisica(float dt) {
vx = 0;
vy = 0;
if (arriba)
vy = -300;
if (abajo)
vy = 300;
if (izquierda)
vx = -300;
if (derecha)
vx = 300;

}


[B]En las siguientes intrucciones se genera la pantalla en la que se supone estara la mariposa, pero el problema es que nose como mandar llamar a la imagen de la mariposa. Y lo que siempre ocurre aqui es que al "Ejecutar" se pone la pantalla encima y la mariposa ya no aparece. Utilice: g.imageIcon (NOMBRE_IMAGE. "gift") pero no esta bien esa intruccion. Por ello a toda la siguiente instruccion le puse dos diagonales para evitar que ocurra lo anterior mostrando solamente la mariposa moviendo las alas.[/B]


// mostrar imagen actual
//public void paint(Graphics g) {
//g.setColor(Color.WHITE);
//g.fillRect(0, 0, ANCHO, ALTO);
//g.ImageIcon ( NOMBRE_IMAGE."gift");



// }



public void paintComponent( Graphics g )
{
super.paintComponent( g );

imagenes[ imagenActual ].paintIcon( this, g, 0, 0 );

// pasar a la siguiente imagen solamente si el temporizador se está ejecutando
if ( temporizadorAnimacion.isRunning() )
imagenActual = ( imagenActual + 1 ) % imagenesTotales;
}

// responder al evento del objeto Timer
public void actionPerformed( ActionEvent eventoAccion )
{
repaint(); // repintar el animador
}

// iniciar o reiniciar la animación
public void iniciarAnimacion()
{
if ( temporizadorAnimacion == null ) {
imagenActual = 0;
temporizadorAnimacion = new Timer( retrasoAnimacion, this );
temporizadorAnimacion.start();
}
else // continuar desde la última imagen mostrada
if ( ! temporizadorAnimacion.isRunning() )
temporizadorAnimacion.restart();
}

// detener el temporizador de la animación
public void detenerAnimacion()
{
temporizadorAnimacion.stop();
}

// devolver el tamaño mínimo de la animación
public Dimension getMinimumSize()
{
return getPreferredSize();
}

// devolver el tamaño preferido de la animación
public Dimension getPreferredSize()
{
return new Dimension( anchura, altura );
}

// ejecutar la animación en un objeto JFrame
public static void main( String args[] )
{
AnimadorLogo animacion = new AnimadorLogo(); // crear el objeto AnimadorLogo

JFrame ventana = new JFrame( "Prueba del animador" ); // configurar ventana
ventana.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

Container contenedor = ventana.getContentPane();
contenedor.add( animacion );

ventana.pack(); // hacer la ventana lo suficientemente grande para su GUI
ventana.setVisible( true ); // mostrar la ventana
animacion.iniciarAnimacion(); // comenzar la animación

} // fin del método main

} // fin de la clase AnimadorLogo



[B]Espero que puedan ayudarme a resolver este problema, de antemano muchas gracias[/B]