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);