猿问

加工。粒子系统-如何让粒子一颗一颗的进来

我试图让我的粒子系统一个接一个地生成粒子,而不是同时生成所有粒子。我的代码目前将立即生成所有 100 个粒子。


我没有尝试太多,因为我是编码新手。


我有一个设置,可以调用并更新我的粒子类,以及一个包含粒子系统所有参数的类。


int num = 100;

Particle[] p = new Particle[num];


void setup() {

    size(1080, 720);

    colorMode(HSB);

    for (int i = 0; i < num; i ++) {

        p[i] = new Particle(new PVector(random(width), random(height)), 100, 150);

    }

    stroke(255);

}


void draw() {

    background(0);

    for (int i = 0; i < num; i ++) {

        p[i].update(p, i);

    }

}


class Particle {


    PVector pos;

    PVector vel;


    float r, mr;


    float spd = 0.1;

    float max = 2;


    Particle(PVector pos, float r, float mr) {

        this.pos = pos;

        this.r = r;

        this.mr = mr;

        vel = new PVector(random(-1, 1), random(-1, 1));

    }


    void update(Particle[] p, int i) {

        float h = map(mouseX, 0, width, 0, 255);

        pos.add(vel);


        if (pos.x < -10) pos.x = width;

        if (pos.x > width + 10) pos.x = 0;

        if (pos.y < -10) pos.y = height;

        if (pos.y > height + 10) pos.y = 0;


        vel.x = constrain(vel.x + random(-spd, spd), -max, max);

        vel.y = constrain(vel.y + random(-spd, spd), -max, max);


        for (int j = i + 1; j < p.length; j ++) {

            float ang = atan2(pos.y - p[j].pos.y, pos.x - p[j].pos.x);

            float dist = pos.dist(p[j].pos);


            if (dist < r) {

                stroke(h, 255, map(dist, 0, r, 255, 0));

                strokeWeight(map(dist, 0, r, 3, 0));

                line(pos.x, pos.y, p[j].pos.x, p[j].pos.y);


                float force = map(dist, 0, r, 4, 0);

                vel.x += force * cos(ang);

                vel.y += force * sin(ang);

            }

        }



拉风的咖菲猫
浏览 97回答 1
1回答

浮云间

创建一个ArrayList粒子,但不要在 中添加任何粒子setup():ArrayList<Particle> paticles = new ArrayList<Particle>();void setup() {    size(400, 400);    colorMode(HSB);    stroke(255);}连续添加颗粒draw()。该函数millis()用于获取自程序启动以来的时间:void draw() {  int num = 100;    int interval = 100; // 0.5 seconds    int time = millis();   // milliseconds  since starting the program    if (paticles.size() < num && paticles.size()*interval+5000 < time) {        paticles.add(new Particle(new PVector(random(width), random(height)), 100, 150));    }    background(0);    for (int i = 0; i < paticles.size(); i ++) {        Particle p = paticles.get(i);        p.update(paticles, i);    }} 请注意,该类Particle必须进行调整,因为它必须使用ArrayList可变长度的数组而不是固定长度的数组进行操作:class Particle {    PVector pos;    PVector vel;    float r, mr;    float spd = 0.1;    float max = 2;    Particle(PVector pos, float r, float mr) {        this.pos = pos;        this.r = r;        this.mr = mr;        vel = new PVector(random(-1, 1), random(-1, 1));    }    void update(ArrayList<Particle> paticles, int i) {        float h = map(mouseX, 0, width, 0, 255);        pos.add(vel);        if (pos.x < -10) pos.x = width;        if (pos.x > width + 10) pos.x = 0;        if (pos.y < -10) pos.y = height;        if (pos.y > height + 10) pos.y = 0;        vel.x = constrain(vel.x + random(-spd, spd), -max, max);        vel.y = constrain(vel.y + random(-spd, spd), -max, max);        for (int j = i + 1; j < paticles.size(); j ++) {            Particle pj = paticles.get(j);            float ang = atan2(pos.y - pj.pos.y, pos.x - pj.pos.x);            float dist = pos.dist(pj.pos);            if (dist < r) {                stroke(h, 255, map(dist, 0, r, 255, 0));                strokeWeight(map(dist, 0, r, 3, 0));                line(pos.x, pos.y, pj.pos.x, pj.pos.y);                float force = map(dist, 0, r, 4, 0);                vel.x += force * cos(ang);                vel.y += force * sin(ang);            }        }        float ang = atan2(pos.y - mouseY, pos.x - mouseX);        float dist = pos.dist(new PVector(mouseX, mouseY));        if (dist < r) {            stroke(0, 0, map(dist, 0, r, 255, 0));            strokeWeight(map(dist, 0, r, 3, 0));            line(pos.x, pos.y, mouseX, mouseY);            float force = map(dist, 0, r, 30, 0);            vel.x += force * cos(ang);            vel.y += force * sin(ang);        }        noStroke();        fill(h, 255, 255);        ellipse(pos.x, pos.y, 5, 5);    }}
随时随地看视频慕课网APP

相关分类

Java
我要回答