0

我正在执行一项任务,但我被困在一个要求上。我已尽我所能尽善尽美,别无选择,只能谦虚地请求您的专业知识。我的任务要求我用 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();

      }
    }
 }
4

3 回答 3

0

看起来您已经定义了一个名为r的 java.util.Random 实例,并且所有其他需要的功能都已实现。那么为什么不直接修改actionPerformed代码

x = r.nextInt(WIDTH-IMAGE_SIZE);
y = r.nextInt(HEIGHT-IMAGE_SIZE);

这应该适合您的要求。

(对不起,我的声誉不足以通过评论直接给出这个简单的建议。:(

于 2013-10-11T05:55:30.717 回答
0

这是一个非常好的开始。

我要做的是创建一个单次使用(非重复)的 Swing Timer。这将以随机延迟(例如 1-5 秒)开始。

当它滴答作响时,您将确定当前状态。如果该生物可见,您将需要停止主视图timer(因为在它不可见时更新它的位置几乎没有意义),视图并使用新的随机值repaint重置隐藏/显示。Timer

如果该生物不可见,您需要计算新的 x/y 坐标和移动方向,重新启动主程序并使用新的随机值timer重置隐藏/显示。Timer

在您的paintComponent方法中,您将检查一个简单的visible标志以确定生物的当前状态并确定您是否应该绘制该生物。

例如...

(注:outTimerjavax.swing.Timervisible是一个booleanrnd是一个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();

我还建议您将 maintimer的初始延迟设置为0, timer.setInitialDelay(0);,这将允许在第一次启动时立即触发

于 2013-10-11T05:56:43.047 回答
0

...而不是以平稳的恒定速率“滑行”。

CreatureListener 负责动画。让我们用一个新的 ActionListener 类 RandomCreatureListener 替换它。

timer = new Timer(DELAY, new RandomCreatureListener());

'r' 字段(随机)似乎未使用。这是您应该在 RandomCreatureListener 中应用它的线索。例如

x = r.nextInt(WIDTH - IMAGE_SIZE);
y = r.nextInt(WIDTH - IMAGE_SIZE);

您将获得所需的随机弹出窗口,但速度惊人。你需要放慢速度。

由于这是一项任务,我将把它留给你来解决。

于 2013-10-11T05:58:17.773 回答