una poner pelota movimiento mover imagenes imagen hechos geometricas figuras dibujos como codigo animadas animación animacion java image animation

poner - mover figuras en java



Cómo mover una imagen(animación)? (2)

Intento mover el barco en el eje x (sin el teclado todavía). ¿Cómo puedo relacionar el movimiento / animación con boat.png y no con ninguna otra imagen?

public class Mama extends Applet implements Runnable { int width, height; int x = 200; int y = 200; int dx = 1; Image img1, img2, img3, img4; @Override public void init(){ setSize(627, 373); Thread t = new Thread(this); img1 = getImage(getCodeBase(),"Background.png"); img2 = getImage(getCodeBase(), "boat.png"); img3 = getImage(getCodeBase(), "LeftPalm.png"); img4 = getImage(getCodeBase(), "RightPalm.png"); } @Override public void paint(Graphics g){ g.drawImage(img1, 0, 0, this); g.drawImage(img2, 200, 200, this); g.drawImage(img3, 40, 100, this); g.drawImage(img4, 450, 130, this); } @Override public void run() { while(true){ x += dx; repaint(); try { Thread.sleep(17); } catch (InterruptedException e) { System.out.println("Thread generates an error."); } } } }


Hay algunas cosas que se destacan ...

El problema"

Como ya se ha indicado, debe proporcionar argumentos variables para el proceso de dibujo de la imagen. g.drawImage(img2, x, y, this); , esto te permitirá definir dónde se debe pintar la imagen.

Mientras implementó Runnable , en realidad no ha iniciado ningún subproceso para llamarlo. Esto significa que, en realidad, nada está cambiando las variables.

En el método de start , debe llamar a algo como new Thread(this).start() .

Recomendaciones

Aunque etiquetó la pregunta como Swing, está utilizando componentes AWT. Esto no es recomendable (de hecho, los applets son generalmente desalentados ya que son problemáticos, en mi humilde opinión). El otro problema, como seguramente descubrirá en breve, es que no tienen amortiguación doble, esto generalmente genera parpadeos cuando se realiza la animación, lo que no es deseable.

Como nota al margen, también se desaconseja anular el método de paint de contenedores de nivel superior como Applet . Los contenedores de nivel superior tienden a contener un número de componentes adicionales, anulando el método de paint como este, destruyes esta configuración. Además, los contenedores de nivel superior tampoco tienden a ser de doble amortiguación.

El siguiente ejemplo utiliza un JFrame , pero no sería necesario convertirlo para usar un JApplet (simplemente JApplet en el JApplet AnimationPanel . Esta es otra razón por la cual, por lo general, no se JApplet extenderse desde contenedores de nivel superior;)

public class AnimatedBoat { public static void main(String[] args) { new AnimatedBoat(); } public AnimatedBoat() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame("Test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new AnimationPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class AnimationPane extends JPanel { private BufferedImage boat; private int xPos = 0; private int direction = 1; public AnimationPane() { try { boat = ImageIO.read(new File("boat.png")); Timer timer = new Timer(40, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { xPos += direction; if (xPos + boat.getWidth() > getWidth()) { xPos = getWidth() - boat.getWidth(); direction *= -1; } else if (xPos < 0) { xPos = 0; direction *= -1; } repaint(); } }); timer.setRepeats(true); timer.setCoalesce(true); timer.start(); } catch (IOException ex) { ex.printStackTrace(); } } @Override public Dimension getPreferredSize() { return boat == null ? super.getPreferredSize() : new Dimension(boat.getWidth() * 4, boat.getHeight()); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); int y = getHeight() - boat.getHeight(); g.drawImage(boat, xPos, y, this); } } }


g.drawImage(img2, 200, 200, this); reemplazar g.drawImage(img2, 200, 200, this); con g.drawImage(img2, x, y, this);