为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉风的咖菲猫 2023-10-27 10:50:39
我试图让我的粒子系统一个接一个地生成粒子,而不是同时生成所有粒子。我的代码目前将立即生成所有 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);            }        }
查看完整描述

1 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

创建一个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);

    }

}



查看完整回答
反对 回复 2023-10-27
  • 1 回答
  • 0 关注
  • 96 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信