
๐ Rust Code
use nannou::prelude::*;
struct Particle {
pos: Point2,
vel: Vec2,
radius: f32,
life: f32,
}
struct Model {
particles: Vec<Particle>,
}
fn main() {
nannou::app(model).update(update).run();
}
fn model(app: &App) -> Model {
app.new_window().size(1080, 1080).view(view).mouse_pressed(mouse_pressed).build().unwrap();
Model { particles: Vec::new() }
}
fn mouse_pressed(app: &App, model: &mut Model, _btn: MouseButton) {
let mouse_pos = app.mouse.position();
for _ in 0..30 {
let vel = vec2(random_range(-3.0, 3.0), random_range(3.0, -3.0));
let radius = random_range(2.0, 5.0);
model.particles.push(Particle {
pos: mouse_pos,
vel,
radius,
life: random_range(1.0, 3.0),
});
}
}
fn update(_app: &App, model: &mut Model, update: Update) {
let dt = update.since_last.as_secs_f32();
for p in &mut model.particles {
p.pos += p.vel;
p.life -= dt;
}
model.particles.retain(|p| p.life > 0.0);
}
fn view(app: &App, model: &Model, frame: Frame) {
frame.clear(BLACK);
let draw = app.draw();
for p in &model.particles {
draw.ellipse()
.xy(p.pos)
.radius(p.radius)
.color(rgba(1.0, 1.0, 1.0, p.life / 2.0));
}
draw.to_frame(app, &frame).unwrap();
}