如何使用计时器在java中每隔x秒随机显示图像?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何使用计时器在java中每隔x秒随机显示图像?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含9246字,纯文字阅读大概需要14分钟。
内容图文
![如何使用计时器在java中每隔x秒随机显示图像?](/upload/InfoBanner/zyjiaocheng/715/cefa2185d0a3490c9d201cd49faabafb.jpg)
我正在开发一款游戏,我需要“击中”一只老鼠/老鼠,它会消失,你会得到1分.
我每次启动应用程序时都会随机出现,但我希望每隔x秒使用Timer()或其他东西随机绘制图像.
我的游戏屏幕代码如下所示:
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秒执行此操作?
解决方法:
“How can I use a timer to do this every x seconds when the app is openend?”
看看这个例子.我从互联网上收集了图像,但你可以使用图像文件来做同样的事情.我做的是使用一个URL和BufferedImage数组,并获得一个500毫秒的随机索引并重绘()面板
注意如果要使用图像文件,也可以查看this answer.
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 = 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);
}
更新示例.我关闭了我的IDE过夜.太懒了打开所以我只想在我走的时候拿出来.如果你还没有,我会在明天起床时添加一个真实的例子.
基本上,您希望为鼠标图像的x和y位置设置全局变量
int x = 0;
int y = 0;
绘制图像时,您希望使用这些位置
g.drawImage(img, x, y, whatEverWidth, whatEverHeight, this);
在计时器中,您可以在绘制之前随机修改x和y.让我们用一些逻辑.
假设您的scree宽度为500,屏幕高度为500,鼠标图像宽度为100,鼠标图像高度为100
>所以max x位置将是400 =屏幕宽度 – 鼠标图像宽度
>最大y位置将为400 =屏幕高度 – 鼠标图像高度
所以现在我们有了我们的范围.我们知道min x位置是0而min y位置是0.所以我们想要每个x和y的0到400的随机数.所以在计时器中你可以做到
Timer timer = new Timer(1000, new ActionListener(){
public void actionPerformed(ActionEvent e) {
x = rand.nextInt(400) + 1;
y = rand.nextInt(400) + 1;
repaint();
}
});
每次调用重绘时,这将在随机位置重新绘制鼠标图像.
更新2
我不知道还有什么可以解释.我做了我指出的那些事情(用我的原始代码),只是添加了一个x和y并用它们来绘制图像,并在计时器中得到一个随机位置.它对我来说非常好.我不知道你做错了什么.
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);
}
}
}
内容总结
以上是互联网集市为您收集整理的如何使用计时器在java中每隔x秒随机显示图像?全部内容,希望文章能够帮你解决如何使用计时器在java中每隔x秒随机显示图像?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。