Come spostare un’immagine (animazione)?

Sto provando a spostare la barca sull’asse x (senza la tastiera ancora). Come posso correlare il movimento / animazione a boat.png e non a qualsiasi altra immagine?

 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."); } } } } 

Ci sono alcune cose che si distinguono …

Il problema”

Come già affermato, è necessario fornire argomenti variabili al processo di disegno dell’immagine. g.drawImage(img2, x, y, this); , questo ti permetterà di definire dove deve essere dipinta l’immagine.

Mentre hai implementato Runnable , in realtà non hai avviato alcun thread per chiamarlo. Ciò significa che nulla sta effettivamente cambiando le variabili.

Nel tuo metodo start , dovresti chiamare qualcosa come new Thread(this).start() .

raccomandazioni

Sebbene tu abbia codificato la domanda come Swing, stai utilizzando i componenti AWT. Questo non è raccomandato (in effetti le applet sono generalmente scoraggiate perché sono problematiche – IMHO). L’altro problema, come si scoprirà a breve, è che non hanno il doppio buffer, questo generalmente porta a sfarfallio durante l’esecuzione dell’animazione, il che non è desiderabile.

Come nota a margine, è anche scoraggiato a scavalcare il metodo paint dei contenitori di livello superiore come Applet . I contenitori di livello superiore tendono a contenere un numero di componenti aggiuntivi, ignorando il metodo di paint come questo, si distrugge questa configurazione. Inoltre, i contenitori di livello superiore non tendono ad essere a doppio buffer.

L’esempio seguente utilizza un JFrame , ma non ci vorrebbe molto per convertirlo per utilizzare una JApplet (basta trascinare AnimationPanel su di essa. Questo è un altro motivo per cui l’estensione da contenitori di livello superiore è generalmente scoraggiata;)

inserisci la descrizione dell'immagine qui

 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 actionPerformsd(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); } } } 

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