10

私はJavaでゲームを作っていますが、雨が降っている雲のシミュレーションを作成したいと思います。雨が降っている間、雲は右に移動するはずです。クラウドの移動は問題ありません。私が苦労しているのは雨です。

私が考えていたのは、タイマーを使って長方形を描くことでした。これは、雲の中のランダムなx値で雨が降っているように見えるはずです。次に、100ミリ秒ごとにドロップのy値に1を加算します。しかし、雨滴ごとに100個の異なる長方形、x変数、y変数を作成したくありません。

どうすればこれを達成できるか考えていますか?提案を歓迎します!


2Dゲームです。ごめんなさい。

4

5 に答える 5

3

1つのアプローチは、劇場のマーキーを検討することです。一連の電球を使用し、それらを順番に点灯および消灯することで、線形運動をシミュレートできます。

同様に、雨滴を作成してその動きをアニメートするのではなく、目に見えない複数の雨滴を作成し、それらを順番に表示および非表示にして下向きの動きをシミュレートしてみませんか。次に、雨滴のトラックを表す一連の配列があり、それを循環して、現在の配列を非表示にし、配列ポインターをインクリメントして、その配列を表示する必要があります。

于 2012-07-02T14:51:22.977 に答える
3

雨滴をプログラムする必要がありますか?従来、これは、雲の下に配置し、雨が降っているように見えるようにアニメートするいくつかのレインスプライトを使用して行われます。

于 2012-07-02T14:55:22.627 に答える
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();
}
于 2012-07-02T14:59:00.397 に答える
2

これが、ドロップ、スプラッシュ、風、重力を伴う2Dレインの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);
    }
}
}
于 2013-10-09T09:50:01.760 に答える
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();
    }
}
于 2012-07-02T14:54:58.760 に答える