2012-07-02 24 views
10

我正在用java製作一個遊戲,我想創建一個正在傾盆大雨的模擬雲。下雨時雲應該向右移動。移動雲是沒有問題的。這是我正在努力的雨。模擬雨

我想的所做的是用一個定時器來繪製一個矩形什麼,那應該看起來像在隨機x值雲內雨聲。然後每100毫秒加1到滴的y值。但我不想爲每次降雨創建100個不同的矩形,x變量和y變量。

任何想法我可以做到這一點?建議感激!


這是一個2D遊戲..對不起。

+0

這裏2D雨是一個鏈接,可能幫助:http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=3704&lngWId=2。它是用Java 1.2編寫的,所以我不確定它是否是最好的解決方案,但它仍然可能爲您提供洞察力。 – Josh

+0

看起來很喜歡,謝謝!將看看 –

+0

確保:這是一款2D遊戲嗎?水平是地平線,垂直是高度,沒有深度? –

回答

2

我會建議只是存儲的值作爲對象的ArrayList。

class Raindrop { 
    private int x; 
    private int y; 

    public void fall() { 
     y--; 
    } 
} 

然後使用泛型類型創建ArrayList。

ArrayList<Raindrop> drops = new ArrayList<Raindrop>(); 

每一滴秋天,

for (int i=0; i<drops.length(); i++) { 
    drops.get(i).fall(); 
} 
+0

以前從未使用過arraylist。會讀一點關於它。謝謝! –

+0

所以我很努力去理解這一點。我應該在哪裏放置for語句? –

+0

我的理解是Vector類被棄用,所以ArrayList正在取代它。 – danmcardle

3

一種方法是考慮在影院選取框。您可以拍攝一系列燈泡,通過依次點亮和熄滅燈泡,您可以模擬直線運動。

以同樣的方式,而不是創造雨滴和動畫的運動,爲什麼不創建多個雨滴是不可見的,顯示和隱藏他們的序列來模擬向下運動。然後,您將有一系列代表雨滴軌跡的數組,並且您只需循環,隱藏當前數組,然後遞增數組指針並顯示該數組。

+0

可能是一個有效的解決方案。謝謝。 –

0

可以使用粒子系統或使用雨滴的矢量和動畫他們每隔X毫秒。一個鏈接到一個粒子系統庫:http://code.google.com/p/jops/

示例代碼矢量:

import java.util.Vector; 
// In your class 
Vector raindrops; 
void animate() 
{ 
    ListIterator iter = raindrops.listIterator; 
    while (iter.hasNext()) { 
     ((Raindrop)iter.next()).moveDown(); 
    } 
} 
3

是認爲雨滴被編程的要求?傳統上,這將通過幾個雨滴來完成,這些雨滴會置於雲下並生成動畫,以便看起來像雨正在下降。

2

這裏是我的Java(鞦韆)實現與滴,飛濺,風和重力

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.awt.geom.Ellipse2D; 
import java.awt.geom.Line2D; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.Random; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Main { 

public static void main(String [] args) { 
    JFrame frame = new JFrame(); 
    frame.setSize(800, 300); 
    final RPanel rPanel=new RPanel(); 
    frame.add(rPanel); 
    frame.setVisible(true); 
    frame.addWindowListener(new WindowAdapter() { 
     @Override 
     public void windowClosing(WindowEvent e) { 
      super.windowClosing(e); 
      rPanel.stop(); 
      System.exit(0); 
     } 
    }); 
} 
} 

class RPanel extends JPanel { 
//*********SETTINGS**************************** 
private float mWind = 2.05f; 
private float mGravity = 9.8f; 
private double mRainChance = 0.99; // from 0 to 1 

private int mRepaintTimeMS = 16; 
private float mRainWidth=1; 
private double mDdropInitialVelocity = 20; 
private double mDropDiam = 2; 
private Color mColor=new Color(0, 0, 255); 
//********************************************* 

private ArrayList<Rain> rainV; 
private ArrayList<Drop> dropV; 
private UpdateThread mUpdateThread; 

public RPanel() { 
    rainV = new ArrayList<>(); 
    dropV = new ArrayList<>(); 

    mUpdateThread=new UpdateThread(); 
    mUpdateThread.start(); 
} 

public void stop() { 
    mUpdateThread.stopped=true; 
} 

public int getHeight() { 
    return this.getSize().height; 
} 

public int getWidth() { 
    return this.getSize().width; 
} 

private class UpdateThread extends Thread { 
    public volatile boolean stopped=false; 
    @Override 
    public void run() { 
     while (!stopped) { 
      RPanel.this.repaint(); 
      try { 
       Thread.sleep(mRepaintTimeMS); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D) g; 
    g2.setStroke(new BasicStroke(mRainWidth)); 
    g2.setColor(mColor); 

    //DRAW DROPS 
    Iterator<Drop> iterator2 = dropV.iterator(); 
    while (iterator2.hasNext()) { 
     Drop drop = iterator2.next(); 
     drop.update(); 
     drop.draw(g2); 

     if (drop.y >= getHeight()) { 
      iterator2.remove(); 
     } 
    } 

    //DRAW RAIN 
    Iterator<Rain> iterator = rainV.iterator(); 
    while (iterator.hasNext()) { 
     Rain rain = iterator.next(); 
     rain.update(); 
     rain.draw(g2); 

     if (rain.y >= getHeight()) { 
      //create new drops (2-8) 
      long dropCount = 1 + Math.round(Math.random() * 4); 
      for (int i = 0; i < dropCount; i++) { 
       dropV.add(new Drop(rain.x, getHeight())); 
      } 
      iterator.remove(); 

     } 
    } 

    //CREATE NEW RAIN 
    if (Math.random() < mRainChance) { 
     rainV.add(new Rain()); 
    } 
} 

//***************************************** 
class Rain { 
    float x; 
    float y; 
    float prevX; 
    float prevY; 

    public Rain() { 
     Random r = new Random(); 
     x = r.nextInt(getWidth()); 
     y = 0; 
    } 

    public void update() { 
     prevX = x; 
     prevY = y; 

     x += mWind; 
     y += mGravity; 
    } 

    public void draw(Graphics2D g2) { 
     Line2D line = new Line2D.Double(x, y, prevX, prevY); 
     g2.draw(line); 
    } 
} 

//***************************************** 
private class Drop { 

    double x0; 
    double y0; 
    double v0; //initial velocity 
    double t; //time 
    double angle; 
    double x; 
    double y; 

    public Drop(double x0, double y0) { 
     super(); 
     this.x0 = x0; 
     this.y0 = y0; 

     v0 = mDdropInitialVelocity; 
     angle = Math.toRadians(Math.round(Math.random() * 180)); //from 0 - 180 degrees 
    } 

    private void update() { 
     // double g=10; 
     t += mRepaintTimeMS/100f; 
     x = x0 + v0 * t * Math.cos(angle); 
     y = y0 - (v0 * t * Math.sin(angle) - mGravity * t * t/2); 
    } 

    public void draw(Graphics2D g2) { 
     Ellipse2D.Double circle = new Ellipse2D.Double(x, y, mDropDiam, mDropDiam); 
     g2.fill(circle); 
    } 
} 
}