我正在完成一项任务,但我仍然坚持一项要求。我尽可能地做出了善意的努力,别无选择,只能谦虚地询问你的专业知识。 我的任务要求我在Java中制作一个简单的游戏,其中图像将出现并随机重新出现。用户点击图像,如果用户点击图像,则点击次数输出到屏幕。 我的主要问题是如何在随机持续时间的随机发布中使所述图像出现/重新出现?为了使持续时间随机,我会以某种方式在计时器中设置?我试过了,但没用。至于随机位置,我甚至不知道如何开始编码,有人能指出我正确的方向吗?我会在actionPerformed方法中做到这一点吗?
无论如何,到目前为止,这是我的代码。它编译,但运动和速度是平滑和恒定的。我需要图像随机出现/重新出现,而不是以平滑的恒定速率“滑动”。
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import java.util.Random;
public class CreatureClass extends JPanel
{
private final int WIDTH = 400, HEIGHT = 300;
private final int DELAY=20, IMAGE_SIZE = 60;
Random r = new Random();
private ImageIcon image;
private Timer timer;
private int x, y, moveX, moveY;
private int catchCount=0;
//-----------------------------------------------------------------
// Sets up the panel, including the timer for the animation.
//-----------------------------------------------------------------
public CreatureClass()
{
timer = new Timer(DELAY, new CreatureListener());//how to make duration random here?
addMouseListener (new MouseClickedListener());
image = new ImageIcon ("UMadBro.gif");
x = 0; //starting coordinates of image
y = 40;
moveX = moveY = 3;//image is shifted 3 pixels every time image is updated. I
// tried setting these to a random number, but it makes the
// image "stuck" in one position.
setPreferredSize (new Dimension(WIDTH, HEIGHT));
setBackground (Color.yellow);
timer.start();
}
//-----------------------------------------------------------------
// Draws the image in the current location.
//-----------------------------------------------------------------
public void paintComponent (Graphics page)
{
super.paintComponent (page);
image.paintIcon (this, page, x, y);
page.drawString("Number of clicks: " + catchCount, 10, 15);
}
//*****************************************************************
// Detects when mouse clicked=image postition
//*****************************************************************
public boolean pointInMe(int posX, int posY)
{
if(x == posX && y == posY)
{
catchCount++;
return true;
}
return false;
}
public int getCatchCount()
{
return catchCount;
}
private class MouseClickedListener extends MouseAdapter
{
public void mouseClicked (MouseEvent event)
{
pointInMe(event.getX(), event.getY());
}
}
//*****************************************************************
// Represents the action listener for the timer.
//*****************************************************************
private class CreatureListener implements ActionListener
{
//--------------------------------------------------------------
// Updates the position of the image and possibly the direction
// of movement whenever the timer fires an action event.
// (I don't know how to make the image appear and reappear
// randomly for random durations)
//--------------------------------------------------------------
public void actionPerformed (ActionEvent event)
{
x += moveX;
y += moveY;
if (x <= 0 || x >= WIDTH-IMAGE_SIZE)
moveX = moveX * -1;
if (y <= 0 || y >= HEIGHT-IMAGE_SIZE)
moveY = moveY * -1;
repaint();
}
}
}
答案 0 :(得分:0)
看起来您已经定义了一个名为 r 的java.util.Random实例,并且已经实现了所有其他所需的功能。那么为什么不用{/ 1}修改actionPerformed
中的代码呢?
x = r.nextInt(WIDTH-IMAGE_SIZE);
y = r.nextInt(HEIGHT-IMAGE_SIZE);
这应该适合您的要求。
(对不起,我的声誉不足以通过评论直接提出这个简单的建议。:(
答案 1 :(得分:0)
这是一个非常好的开始。
我要做的是创建一次使用(非重复)Swing Timer
。这将以随机延迟(例如1-5秒之间)开始。
当它滴答时,您将确定当前状态。如果该生物可见,则需要停止主timer
(因为在它不可见的情况下更新它的位置没什么意义),repaint
视图并重置隐藏/显示Timer
带有新的随机值。
如果该生物不可见,则需要计算新的x / y坐标和移动方向,重新启动主timer
并使用新的随机值重置隐藏/显示Timer
。
在paintComponent
方法中,您需要检查一个简单的visible
标志,以确定该生物的当前状态,并确定是否应该对该生物进行绘画。
例如......
(nb:outTimer
为javax.swing.Timer
,visible
为boolean
,rnd
为java.util.Random
)
outTimer = new Timer(1000 + (int)(Math.random() * 4000), new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Are we currently visible or not
if (!visible) {
// Calculate the x/y position
x = (int) (Math.random() * (WIDTH - IMAGE_SIZE));
y = (int) (Math.random() * (HEIGHT - IMAGE_SIZE));
// Calculate a random speed
int xSpeed = (int) (Math.random() * 4) + 1;
int ySpeed = (int) (Math.random() * 4) + 1;
// Calculate the direction based on the speed
moveX = rnd.nextBoolean() ? xSpeed : -xSpeed;
moveY = rnd.nextBoolean() ? ySpeed : -ySpeed;
// Restart the main timer
timer.start();
} else {
// Stop the main timer
timer.stop();
}
// Flip the visible flag
visible = !visible;
repaint();
// Calculate a new random time
outTimer.setDelay(1000 + (int)(Math.random() * 4000));
outTimer.start();
}
});
// We don't want the timer to repeat
outTimer.setRepeats(false);
outTimer.start();
我还建议您将主timer
的初始延迟设置为0
,timer.setInitialDelay(0);
,这将允许在第一次启动时立即触发
答案 2 :(得分:0)
...而不是以平稳的恒定速率“滑行”。
CreatureListener负责动画。让我们用一个新的ActionListener类RandomCreatureListener替换它。
timer = new Timer(DELAY, new RandomCreatureListener());
“r”字段(随机)似乎未使用。这是一个线索,你应该在RandomCreatureListener中应用它。 E.g。
x = r.nextInt(WIDTH - IMAGE_SIZE);
y = r.nextInt(WIDTH - IMAGE_SIZE);
您将获得所需的随机弹出窗口,但速度令人目眩。 你需要放慢速度。
由于这是一项任务,我会留给你解决。