Come posso far apparire le immagini casualmente ogni x secondi in java usando il timer?

Sto lavorando a un gioco in cui ho bisogno di “colpire” un mouse / ratto, scomparirà e otterrai 1 punto. L’ho fatto apparire casualmente ogni volta che avvio l’app, ma voglio che l’immagine sia disegnata a caso ogni x secondi usando Timer () o qualcosa del genere.

Il mio codice per la schermata di gioco assomiglia a questo:

import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Image; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Random; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JTextField; public class Gamevenster extends JPanel implements Runnable { public String Gamestatus = "active"; private Thread thread; //public Main game; public int random(int min, int max) { int range = (max - min) + 1; return (int)(Math.random() * range) + min; } public void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(achtergrond, 0, 0, this.getWidth(), this.getHeight(), null); //g.drawImage(muisje, 10, 10, null); g.drawImage(muisje, random(0, this.getWidth()), random(0, this.getHeight()), null); } private static final long serialVersionUID = 1L; Image achtergrond, muisje; JTextField invoer; JButton raden; JButton menu; Gamevenster() { setLayout(null); ImageIcon icon = new ImageIcon(this.getClass().getResource("assets/achtergrondspel.png")); achtergrond = icon.getImage(); ImageIcon icon2 = new ImageIcon(this.getClass().getResource("assets/muisje.png")); muisje = icon2.getImage(); //Get the default toolkit Toolkit toolkit = Toolkit.getDefaultToolkit(); //Load an image for the cursor Image image = toolkit.getImage("src/assets/hand.png"); //Create the hotspot for the cursor Point hotSpot = new Point(0,0); //Create the custom cursor Cursor cursor = toolkit.createCustomCursor(image, hotSpot, "Hand"); //Use the custom cursor setCursor(cursor); // setLayout( null ); // Invoer feld invoer = new JTextField(10); invoer.setLayout(null); invoer.setBounds(150, 474, 290, 60); // Verander positie onder aan scherm is int 1 // Button voor raden raden = new JButton("Raden"); raden.setLayout(null); raden.setBounds(10, 474, 130, 60); raden.setFont(new Font("Dialog", 1, 20)); raden.setForeground(Color.white); raden.setBackground(new Color(46, 204, 113)); raden.setPreferredSize(new Dimension(130, 60)); // Menu knop menu = new JButton("Menu"); menu.setLayout(null); menu.setBounds(450, 474, 130, 60); menu.setFont(new Font("Dialog", 1, 20)); menu.setForeground(Color.white); menu.setBackground(new Color(46, 204, 113)); menu.setPreferredSize(new Dimension(130, 60)); // Toevoegen aan screen add(invoer); //add(raden); add(menu); menu.addActionListener(new ActionListener() { public void actionPerformsd(ActionEvent e) { String i = invoer.getText(); System.out.println("Er is gedrukt! " + i); } }); } public void start(){ thread = new Thread(this,"spelloop"); thread.start(); } public void run() { // TODO Auto-generated method stub while(Gamestatus=="active"){ System.out.println("Gameloop werkt"); } } } 

come puoi vedere sto usando g.drawImage (muisje, random (0, this.getWidth ()), random (0, this.getHeight ()), null);

Quindi aggiunge in modo casuale l’immagine all’avvio.

Come posso usare un timer per farlo ogni x secondi quando l’app è aperta?

“Come posso usare un timer per farlo ogni x secondi quando l’app è aperta?”

Dai un’occhiata a questo esempio. Ho raccolto immagini da internet, ma puoi fare lo stesso usando i file di immagine. Quello che ho fatto è stato usare una serie di URL e BufferedImage e ottenuto un indice casuale di 500 millisecondi e repaint() il pannello

Nota Se si intende utilizzare i file di immagine, si consiglia di guardare anche a questa risposta .

inserisci la descrizione dell'immagine qui

 import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.MalformsdURLException; import java.net.URL; import java.util.Random; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.Timer; public class TestImageRotate { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable(){ @Override public void run() { JFrame frame = new JFrame("Image Timer"); frame.add(new ImagePanel()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } private static class ImagePanel extends JPanel { URL[] urls; BufferedImage[] images; Random rand = new Random(); public ImagePanel() { urls = new URL[5]; try { urls[0] = new URL("http://www.atomicframework.com/assetsY/img/stackoverflow_chicklet.png"); urls[1] = new URL("http://www.iconsdb.com/icons/download/orange/stackoverflow-256.png"); urls[2] = new URL("http://img.1mobile.com/market/screenshot/50/com.dd.stackoverflow/0.png"); urls[3] = new URL("http://www.iconsdb.com/icons/download/orange/stackoverflow-4-512.png"); urls[4] = new URL("http://www.iconsdb.com/icons/preview/light-gray/stackoverflow-xxl.png"); images = new BufferedImage[5]; images[0] = ImageIO.read(urls[0]); images[1] = ImageIO.read(urls[1]); images[2] = ImageIO.read(urls[2]); images[3] = ImageIO.read(urls[3]); images[4] = ImageIO.read(urls[4]); } catch (MalformsdURLException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } setBackground(Color.BLACK); Timer timer = new Timer(500, new ActionListener(){ @Override public void actionPerformsd(ActionEvent e) { repaint(); } }); timer.start(); } private int random() { int index = rand.nextInt(5); return index; } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); BufferedImage img = images[random()]; g.drawImage(img, 0, 0, 400, 400, 0, 0, img.getWidth(), img.getHeight(), this); } @Override public Dimension getPreferredSize() { return new Dimension(400, 400); } } } 

Si noti il ​​codice del Timer . Questo è tutto ciò che ho fatto

 Timer timer = new Timer(500, new ActionListener(){ @Override public void actionPerformsd(ActionEvent e) { repaint(); } }); timer.start(); 

E per .grawImage uso un indice casuale dalla matrice di BufferedImages

 @Override protected void paintComponent(Graphics g) { super.paintComponent(g); BufferedImage img = images[random()]; g.drawImage(img, 0, 0, 400, 400, 0, 0, img.getWidth(), img.getHeight(), this); } 

UPDATE Esempio. Ho spento il mio IDE per la notte. Troppo pigro per aprire così ho intenzione di venire con questo come vado. Se ancora non lo fai, aggiungerò un vero esempio domani quando mi alzerò.

Fondamentalmente si desidera avere una variabile globale per le posizioni x e y dell’immagine del mouse

 int x = 0; int y = 0; 

Quando si disegna l’immagine, si desidera utilizzare queste posizioni

 g.drawImage(img, x, y, whatEverWidth, whatEverHeight, this); 

Nel timer, è ansible modificare la xey in modo casuale prima di dipingere. Lascia che usi una logica.

Diciamo che la larghezza del ghiaione è 500 e l’altezza dello schermo è 500 e la larghezza dell’immagine del mouse è 100 e l’altezza dell’immagine del mouse è 100

  • Quindi la posizione massima x sarà 400 = larghezza dello schermo – larghezza dell’immagine del mouse
  • La posizione massima sarà 400 = altezza schermo – altezza dell’immagine del mouse

Quindi ora abbiamo le nostre gamme. Sappiamo che la posizione min x è 0 e la posizione min è 0. Quindi vogliamo un numero casuale compreso tra 0 e 400 per ogni xey. Quindi nel timer puoi farlo

 Timer timer = new Timer(1000, new ActionListener(){ public void actionPerformsd(ActionEvent e) { x = rand.nextInt(400) + 1; y = rand.nextInt(400) + 1; repaint(); } }); 

Questo ridisegnerà l’immagine del tuo mouse in un punto casuale ogni volta che viene chiamato il repaint.


AGGIORNAMENTO 2

Non so cos’altro c’è da spiegare. Ho fatto solo quelle cose che ho indicato (con il mio codice originale), ho appena aggiunto una y e li ho usati per disegnare l’immagine, e ho ottenuto una posizione casuale nel timer . Funziona perfettamente bene per me. Non so cosa stai sbagliando.

inserisci la descrizione dell'immagine qui

 import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.MalformsdURLException; import java.net.URL; import java.util.Random; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.Timer; public class TestImageRotate { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable(){ @Override public void run() { JFrame frame = new JFrame("Image Timer"); frame.add(new ImagePanel()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } private static class ImagePanel extends JPanel { URL[] urls; BufferedImage[] images; Random rand = new Random(); private int x = 0; private int y = 0; public ImagePanel() { urls = new URL[5]; try { urls[0] = new URL("http://www.atomicframework.com/assetsY/img/stackoverflow_chicklet.png"); urls[1] = new URL("http://www.iconsdb.com/icons/download/orange/stackoverflow-256.png"); urls[2] = new URL("http://img.1mobile.com/market/screenshot/50/com.dd.stackoverflow/0.png"); urls[3] = new URL("http://www.iconsdb.com/icons/download/orange/stackoverflow-4-512.png"); urls[4] = new URL("http://www.iconsdb.com/icons/preview/light-gray/stackoverflow-xxl.png"); images = new BufferedImage[5]; images[0] = ImageIO.read(urls[0]); images[1] = ImageIO.read(urls[1]); images[2] = ImageIO.read(urls[2]); images[3] = ImageIO.read(urls[3]); images[4] = ImageIO.read(urls[4]); } catch (MalformsdURLException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } setBackground(Color.BLACK); Timer timer = new Timer(500, new ActionListener(){ @Override public void actionPerformsd(ActionEvent e) { x = rand.nextInt(325); y = rand.nextInt(325); repaint(); } }); timer.start(); } private int random() { int index = rand.nextInt(5); return index; } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); BufferedImage img = images[random()]; g.drawImage(img, x, y, 75, 75, this); } @Override public Dimension getPreferredSize() { return new Dimension(400, 400); } } } 

Bene, anch’io sono un principiante. Quindi se ti sbaglio, mi dispiace in anticipo. Questa è la mia prima risposta. Quello che stai cercando è probabilmente questo
System.currentTimeMillis();
questo darà l’ora corrente come milisec. Quindi probabilmente vorrai usare un altro float per calcolare il tempo trascorso e dargli il nome deltaTime. Puoi trovare deltaTime di deltaTime=System.currentTimeMillis(); usalo prima mentre esegui il ciclo nel metodo run. Quindi all’interno del ciclo, se System.currentTimeMillis()-deltaTime è maggiore del numero x (millisecondi), genera un ratto. E resetta deltaTime.

E vedo che non hai dichiarato ax, y posizione intera per memorizzare i ratti x e y posizione. Quindi dichiarare 2 variabili globali per x e y dei ratti. se i ratti multipli che x e y int devono essere array con spazio sufficiente per mantenere tutte le posizioni dei ratti.

Crea un metodo in modo che ogni volta che un topo genera, xey della posizione del topo ottenga un int casuale. In realtà lo hai capito nella sezione grafica. Ma la funzione casuale non dovrebbe essere lì dentro. Al posto della funzione casuale dovrebbero esserci interi xey. Nel tuo codice randomizzerà la posizione del ratto ogni volta che aggiorna la grafica. No, non è quello che vuoi (probabilmente).

Un’altra cosa, il tuo codice in realtà non funzionerà senza il metodo di aggiornamento chiamato. Dovresti inserire update(); alla fine del tuo ciclo while.

Scusate se sbaglio o non abbastanza chiaro. Sono solo un principiante interessato agli stessi argomenti prima.