如何使图像在java中每隔x秒随机出现一次?

我正在做一个游戏,在这个游戏中,我需要“敲击”一个鼠标/鼠标,它会消失,你会得到1分。 每当我启动应用程序时,我都会随机出现,但是我想要使用Timer()或其他东西每隔x秒随机绘制图像。

我的游戏屏幕代码如下所示:

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

你可以看到我使用g.drawImage(muisje,random(0,this.getWidth()),random(0,this.getHeight()),null);

所以它在启动时随机添加图像。

当应用程序打开时,如何使用计时器在x秒内执行此操作?

“当应用程序打开时,如何使用计时器每x秒执行一次?”

看看这个例子。 我从互联网上收集图片,但你可以使用图像文件做同样的事情。 我所做的是使用一个URLBufferedImage数组,并得到一个随机索引500毫秒和repaint()面板

注意如果你要使用图像文件,你也可以看看这个答案

在这里输入图像描述

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

注意Timer代码。 这是我所做的一切

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

而对于.grawImage我使用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); } 

更新示例。 我closures了我的IDE过夜。 太懒了,所以我打算在我走的时候拿出这个。 如果你还不这样做,明天起床时我会加一个真实的例子。

基本上你想拥有鼠标图像的x和y位置的全局variables

 int x = 0; int y = 0; 

绘制图像时,您需要使用这些位置

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

在计时器中,您可以在绘制之前随机修改x和y。 让我们使用一些逻辑。

假设您的屏幕宽度为500,屏幕高度为500,鼠标图像宽度为100,鼠标图像高度为100

  • 所以最大的x位置将是400 =屏幕宽度 – 鼠标图像的宽度
  • 最大的位置将是400 =屏幕高度 – 鼠标图像的高度

所以现在我们有我们的范围。 我们知道min x的位置是0,min y的位置是0.所以我们需要一个从0到400的每个x和y的随机数。 所以在计时器,你可以做

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

每次调用repaint时,都会在随机位置重新绘制鼠标图像。


更新2

我不知道还有什么要解释的。 我只是做了我指出的那些事情(用我的原始代码),只是添加了一个xy并用它们来绘制图像,并在timer得到一个随机的位置。 这对我来说是完美的。 我不知道你做错了什么。

在这里输入图像描述

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

那么我也是一个初学者。 所以如果我误导你,我提前抱歉。 这是我的第一个答案。 你正在寻找的可能是这个
System.currentTimeMillis();
这将使当前时间为milisecs。 所以你可能会想使用另一个浮点数来计算传递时间,并将其命名为deltaTime。 您可以通过deltaTime=System.currentTimeMillis();查找deltaTime deltaTime=System.currentTimeMillis(); 在运行方法中使用while循环之前。 然后在循环内部,如果System.currentTimeMillis()-deltaTime大于x数(毫秒),则产生一个鼠标。 并重置deltaTime。

而且我看到你没有宣布ax,y位置整数来存储老鼠x和y的位置。 因此,为大鼠x和y申报2个全局variables。 如果老鼠多倍x和y int应该是有足够的空间来保持所有的鼠标位置arrays。

每当大鼠产卵时都要做一个方法,大鼠位置的x和y会随机取整。 你实际上已经在graphics部分find了它。 但是随机函数不应该在那里。 而不是随机函数x和y整数应该在那里。 在你的代码中,每次更新graphics时,它都会随机地显示大鼠的位置。 不,这不是你想要的(可能)。

还有一件事,如果没有更新方法,你的代码实际上不能工作。 你应该把update(); 在while循环的结尾。

对不起,如果我错了或不够清楚。 我以前只是一个初学者对同样的题目感兴趣。