2013-10-11 72 views
0

我正在做一項任務,並且我被困在一個需求上。我儘可能地做出了誠意的努力,並且別無選擇,只能虛心地請求您的專業知識。 我的任務要求我在Java中進行一個簡單的遊戲,在該遊戲中圖像將隨機出現並隨機重複出現。用戶點擊圖像,並且如果用戶點擊圖像,則點擊數量被輸出到屏幕。 我的主要問題是我如何讓隨意時間隨機出現/重現所述圖像?爲了使持續時間隨機我會以某種方式設置在定時器?我試過了,但沒有奏效。至於隨機位置,我甚至不知道如何開始編碼,有人可以指引我正確的方向嗎?我會在actionPerformed方法中做到這一點嗎?Java:如何使JPanel中的ImageIcon出現/隨機出現隨機持續時間

無論如何,這裏是我的代碼到目前爲止。它編譯,但運動和速度是平穩和不變的。我需要圖像隨機出現/重現,而不是以平滑的恆定速率「滑動」。

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

看起來你已經定義了java.util.Random的實例名爲[R,和其他所有需要的功能已付諸實施。那麼爲什麼不只是修改代碼actionPerformed

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

這應該適合您的要求。

(對不起我的名聲是不夠的,通過註釋直接給這個簡單的建議。:(

0

這是一個非常好的開始。

我會做的是建立一個單一的使用(非重複)Swing Timer。這會以一個隨機延遲開始(比如1-5秒之間)

當它打勾時,你會確定當前狀態如果生物是可見的,你需要停止主要timer(因爲在隱身時更新它的位置沒什麼意義),repaint查看並使用新的隨機值重置hide/show Timer

如果生物不可見,則需要計算新的x/y座標和移動方向,重新啓動主體timer並用新的隨機值重置隱藏/顯示Timer

在你的paintComponent方法中,你將檢查一個簡單的visible標誌來確定生物的當前狀態,並確定是否應該畫生物。

例如...

(注:outTimerjavax.swing.Timervisiblebooleanrndjava.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的初始延遲到0timer.setInitialDelay(0);,這將允許在第一次啓動時立即觸發

0

...而不是以平穩的速率「滑行」。

CreatureListener負責動畫。讓我們用一個新的ActionListener類RandomCreatureListener替換它。

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

'r'字段(隨機)似乎是未使用的。這是一個線索,你應該在RandomCreatureListener中應用它。例如。

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

你會得到所需的隨機彈出式窗口,但在致盲速度。 你需要慢下來。

既然這是一項任務,我會留給你弄清楚。