¿Cómo puedo hacer que la imagen aparezca aleatoriamente cada x segundos en Java usando el temporizador?

Estoy trabajando en un juego en el que necesito ‘golpear’ un ratón / rata, desaparecerá y obtendrás 1 punto. Lo hice aparecer aleatoriamente cada vez que inicié la aplicación, pero quiero que la imagen se dibuje aleatoriamente cada x segundos usando Timer () o algo así.

Mi código para la pantalla del juego se ve así:

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

como puedes ver, estoy usando g.drawImage (muisje, random (0, this.getWidth ()), random (0, this.getHeight ()), null);

Por lo tanto, agrega aleatoriamente la imagen al inicio.

¿Cómo puedo usar un temporizador para hacer esto cada x segundos cuando la aplicación está abierta?

“¿Cómo puedo usar un temporizador para hacer esto cada x segundos cuando se abre la aplicación?”

Echa un vistazo a este ejemplo. Reuní Imágenes de internet, pero puedes hacer lo mismo usando archivos de imágenes. Lo que hice fue utilizar una matriz de URL y BufferedImage y obtuve un índice aleatorio de 500 milisegundos y volver a repaint() el panel

Nota: Si va a utilizar archivos de imagen, también puede consultar esta respuesta .

enter image description here

 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.MalformedURLException; 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 (MalformedURLException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } setBackground(Color.BLACK); Timer timer = new Timer(500, new ActionListener(){ @Override public void actionPerformed(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); } } } 

Observe el código del Timer . Esto es todo lo que hice

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

Y para .grawImage utilizo un índice aleatorio de la matriz de 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); } 

Ejemplo de ACTUALIZACIÓN . Cerré mi IDE por la noche. Demasiado perezoso para abrir, así que voy a pensar en esto a medida que avance. Si aún no lo haces, añadiré un ejemplo real mañana cuando me levante.

Básicamente, desea tener una variable global para las ubicaciones x e y de la imagen del mouse

 int x = 0; int y = 0; 

Cuando dibujas la imagen, quieres usar estas ubicaciones

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

En el temporizador, puedes modificar la xey al azar antes de pintar. Deje que use algo de lógica.

Supongamos que el ancho de su pantalla es 500 y la altura de la pantalla es 500 y el ancho de la imagen del mouse es 100 y la altura de la imagen del mouse es 100

  • Entonces, la ubicación max x será 400 = ancho de la pantalla – ancho de la imagen del mouse
  • Y la ubicación max y será 400 = altura de la pantalla – altura de la imagen del mouse

Entonces ahora tenemos nuestros rangos. Sabemos que la ubicación min x es 0 y la ubicación min y es 0. Entonces queremos un número aleatorio de 0 a 400 para cada x e y. Entonces en el temporizador puedes hacer

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

Esto volverá a pintar la imagen de su mouse en una ubicación aleatoria cada vez que se llame a repintado.


ACTUALIZACIÓN 2

No sé qué más hay para explicar. Hice exactamente las cosas que señalé (con mi código original), simplemente agregué una y y las usé para dibujar la imagen, y obtuve una ubicación aleatoria en el timer . Funciona perfectamente bien para mí. No sé lo que estás haciendo mal.

enter image description here

 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.MalformedURLException; 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 (MalformedURLException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } setBackground(Color.BLACK); Timer timer = new Timer(500, new ActionListener(){ @Override public void actionPerformed(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); } } } 

Bueno, yo también soy un principiante. Entonces, si te equivoco, lo siento de antemano. Esa es mi primera respuesta. Lo que estás buscando es probablemente esto
System.currentTimeMillis();
esto dará la hora actual como milisecs. Por lo tanto, es probable que desee utilizar otro flotador para calcular el tiempo transcurrido y le nombremos deltaTime. Puede encontrar deltaTime por deltaTime=System.currentTimeMillis(); use esto antes mientras el bucle en el método de ejecución. Luego, dentro del ciclo, si System.currentTimeMillis()-deltaTime es mayor que el número x (milisegundos), genere una rata. Y restablecer deltaTime.

Y veo que no has declarado ax, y posición entero para almacenar las ratas x y y ubicación. Así que declara 2 variables globales para xey de ratas. si las ratas múltiples que x y y int deben ser matrices con espacio suficiente para mantener todas sus posiciones de ratas.

Haz un método para que cada vez que aparezca una rata, xey de la ubicación de la rata obtenga un int aleatorio. De hecho lo descubriste en la sección de gráficos. Pero la función aleatoria no debería estar allí. En lugar de la función aleatoria xey los enteros deberían estar allí. En su código, aleatorizará la ubicación de la rata cada vez que actualice los gráficos. No, eso no es lo que quieres (probablemente).

Una cosa más, su código en realidad no funcionará sin el método de actualización llamado. Deberías poner update(); al final de tu ciclo while

Lo siento si estoy equivocado o no lo suficientemente claro. Solo soy un principiante interesado en los mismos temas antes.