init
This commit is contained in:
commit
5935d51e08
|
@ -0,0 +1 @@
|
|||
/target
|
|
@ -0,0 +1,206 @@
|
|||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 4
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "1.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "2.9.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967"
|
||||
|
||||
[[package]]
|
||||
name = "c_vec"
|
||||
version = "2.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fdd7a427adc0135366d99db65b36dae9237130997e560ed61118041fb72be6e8"
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
|
||||
|
||||
[[package]]
|
||||
name = "fireworks"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"rand",
|
||||
"sdl2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "getrandom"
|
||||
version = "0.3.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"r-efi",
|
||||
"wasi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lazy_static"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.174"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776"
|
||||
|
||||
[[package]]
|
||||
name = "ppv-lite86"
|
||||
version = "0.2.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
|
||||
dependencies = [
|
||||
"zerocopy",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.95"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.40"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "r-efi"
|
||||
version = "5.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
|
||||
|
||||
[[package]]
|
||||
name = "rand"
|
||||
version = "0.9.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97"
|
||||
dependencies = [
|
||||
"rand_chacha",
|
||||
"rand_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_chacha"
|
||||
version = "0.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
|
||||
dependencies = [
|
||||
"ppv-lite86",
|
||||
"rand_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_core"
|
||||
version = "0.9.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
|
||||
dependencies = [
|
||||
"getrandom",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sdl2"
|
||||
version = "0.37.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3b498da7d14d1ad6c839729bd4ad6fc11d90a57583605f3b4df2cd709a9cd380"
|
||||
dependencies = [
|
||||
"bitflags 1.3.2",
|
||||
"c_vec",
|
||||
"lazy_static",
|
||||
"libc",
|
||||
"sdl2-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sdl2-sys"
|
||||
version = "0.37.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "951deab27af08ed9c6068b7b0d05a93c91f0a8eb16b6b816a5e73452a43521d3"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"version-compare",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.104"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
|
||||
|
||||
[[package]]
|
||||
name = "version-compare"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29"
|
||||
|
||||
[[package]]
|
||||
name = "wasi"
|
||||
version = "0.14.2+wasi-0.2.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3"
|
||||
dependencies = [
|
||||
"wit-bindgen-rt",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen-rt"
|
||||
version = "0.39.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
|
||||
dependencies = [
|
||||
"bitflags 2.9.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.8.26"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f"
|
||||
dependencies = [
|
||||
"zerocopy-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy-derive"
|
||||
version = "0.8.26"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
|
@ -0,0 +1,8 @@
|
|||
[package]
|
||||
name = "fireworks"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
rand = "0.9.1"
|
||||
sdl2 = { version = "0.37.0", features = ["gfx"] }
|
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2025 iceyrazor
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
|
@ -0,0 +1,15 @@
|
|||
# fireworks in sdl2 rust
|
||||
|
||||

|
||||
|
||||
followed this video [Coding Challenge #27: Fireworks](https://youtu.be/CKeyIbT3vXI)
|
||||
but instead of p5 javascript. i did it in sdl2 rust
|
||||
|
||||
its 4th of july so i decided to upload it. why not :p
|
||||
|
||||
``no clue if this compiles on windows``
|
||||
|
||||
## requirements
|
||||
|
||||
- sdl2
|
||||
- sdl2_gfx
|
Binary file not shown.
After Width: | Height: | Size: 2.9 MiB |
|
@ -0,0 +1,372 @@
|
|||
// followed this video [Coding Challenge #27: Fireworks](https://youtu.be/CKeyIbT3vXI)
|
||||
// but instead of p5 javascript. i did it in sdl2 rust
|
||||
extern crate sdl2;
|
||||
|
||||
use sdl2::{gfx::primitives::DrawRenderer, rect::Rect};
|
||||
use sdl2::pixels::Color;
|
||||
use sdl2::event::Event;
|
||||
use sdl2::keyboard::Keycode;
|
||||
use sdl2::render::WindowCanvas;
|
||||
use std::time::Duration;
|
||||
use rand::{rng, Rng};
|
||||
|
||||
|
||||
//HSV to rgv.
|
||||
//i did not make this
|
||||
//only translated it from my c version i found from a stranger
|
||||
struct HSV {
|
||||
h: f64,
|
||||
s: f64,
|
||||
v: f64,
|
||||
}
|
||||
impl HSV{
|
||||
fn new(h: f64, s: f64, v: f64) -> Self{
|
||||
Self{
|
||||
h: h,
|
||||
s: s,
|
||||
v: v,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone,Copy)]
|
||||
struct IRGB {
|
||||
r: f64,
|
||||
g: f64,
|
||||
b: f64,
|
||||
}
|
||||
impl IRGB {
|
||||
fn new(r: f64, g: f64, b: f64) -> Self{
|
||||
Self{
|
||||
r: r,
|
||||
g: g,
|
||||
b: b,
|
||||
}
|
||||
}
|
||||
|
||||
fn hsvtorgb(&mut self, hsv: &mut HSV){
|
||||
let mut r = 0.0;
|
||||
let mut g = 0.0;
|
||||
let mut b = 0.0;
|
||||
|
||||
if hsv.s == 0.0 {
|
||||
r = hsv.v;
|
||||
g = hsv.v;
|
||||
b = hsv.v;
|
||||
} else {
|
||||
let mut i: f64 = 0.0;
|
||||
let mut f: f64 = 0.0;
|
||||
let mut p: f64 = 0.0;
|
||||
let mut q: f64 = 0.0;
|
||||
let mut t: f64 = 0.0;
|
||||
|
||||
if hsv.h == 360.0 {
|
||||
hsv.h = 0.0;
|
||||
} else {
|
||||
hsv.h = hsv.h / 60.0;
|
||||
|
||||
i = hsv.h.trunc();
|
||||
f = hsv.h - i;
|
||||
|
||||
p = hsv.v * (1.0 - hsv.s);
|
||||
q = hsv.v * (1.0 - (hsv.s * f));
|
||||
t = hsv.v * (1.0 - (hsv.s * (1.0 - f)));
|
||||
|
||||
match i {
|
||||
0.0=>{
|
||||
r = hsv.v;
|
||||
g = t;
|
||||
b = p;
|
||||
},
|
||||
1.0=>{
|
||||
r = q;
|
||||
g = hsv.v;
|
||||
b = p;
|
||||
},
|
||||
2.0=>{
|
||||
r = p;
|
||||
g = hsv.v;
|
||||
b = t;
|
||||
},
|
||||
3.0=>{
|
||||
r = p;
|
||||
g = q;
|
||||
b = hsv.v;
|
||||
},
|
||||
4.0=>{
|
||||
r = t;
|
||||
g = p;
|
||||
b = hsv.v;
|
||||
},
|
||||
_=>{
|
||||
r = hsv.v;
|
||||
g = p;
|
||||
b = q;
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
self.r = r * 255.0;
|
||||
self.g = g * 255.0;
|
||||
self.b = b * 255.0;
|
||||
}
|
||||
}
|
||||
|
||||
fn magnitude(x: f64,y: f64) -> f64 {
|
||||
((x).powi(2) + (y).powi(2)).sqrt()
|
||||
}
|
||||
|
||||
struct PointG{
|
||||
x: f64,
|
||||
y: f64,
|
||||
}
|
||||
impl PointG{
|
||||
fn new(x: f64, y: f64) -> Self {
|
||||
Self{
|
||||
x: x,
|
||||
y: y,
|
||||
}
|
||||
}
|
||||
|
||||
fn add(&mut self, addvec: &PointG){
|
||||
self.x = self.x + addvec.x;
|
||||
self.y = self.y + addvec.y;
|
||||
}
|
||||
|
||||
fn mul(&mut self, addvec: &PointG){
|
||||
self.x = self.x * addvec.x;
|
||||
self.y = self.y * addvec.y;
|
||||
}
|
||||
|
||||
fn set_mag(&mut self, mag: &f64){
|
||||
let getmag: f64 = magnitude(self.x, self.y);
|
||||
self.x = (self.x / getmag) * mag;
|
||||
self.y = (self.y / getmag) * mag;
|
||||
}
|
||||
}
|
||||
|
||||
struct Gvars{
|
||||
mouse: PointG,
|
||||
screen_size: PointG,
|
||||
}
|
||||
impl Gvars{
|
||||
fn new(sw: f64, sh: f64) -> Self{
|
||||
Self {
|
||||
mouse: PointG::new(0.0,0.0),
|
||||
screen_size: PointG::new(sw,sh),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Particle
|
||||
struct Particle{
|
||||
pos: PointG,
|
||||
vel: PointG,
|
||||
acc: PointG,
|
||||
firework: bool,
|
||||
lifespan: i16,
|
||||
hue: IRGB,
|
||||
}
|
||||
|
||||
impl Particle{
|
||||
fn new(x: f64, y: f64, hu: IRGB, firework: bool) -> Self{
|
||||
let mut initvel=PointG::new(0.0,rng().random_range(-18.0..-9.0));
|
||||
if firework==true {
|
||||
initvel=PointG::new(rng().random_range(-1.0..1.0),rng().random_range(-1.0..1.0));
|
||||
initvel.set_mag(&rng().random_range(1.0..10.0));
|
||||
}
|
||||
Self {
|
||||
pos: PointG::new(x,y),
|
||||
vel: initvel,
|
||||
acc: PointG::new(0.0,0.0),
|
||||
firework: firework,
|
||||
lifespan: 255,
|
||||
hue: hu,
|
||||
}
|
||||
}
|
||||
|
||||
fn apply_force(&mut self, force: &PointG){
|
||||
self.acc.add(&force);
|
||||
}
|
||||
|
||||
fn done(&mut self) -> bool{
|
||||
if self.lifespan <= 0 {
|
||||
return true
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
fn update(&mut self){
|
||||
if self.firework {
|
||||
self.vel.mul(&PointG::new(0.9,0.9));
|
||||
self.lifespan = self.lifespan - 4;
|
||||
|
||||
if self.lifespan <= 0 {
|
||||
self.lifespan = 0;
|
||||
}
|
||||
}
|
||||
self.vel.add(&self.acc);
|
||||
self.pos.add(&self.vel);
|
||||
|
||||
self.acc.x = 0.0;
|
||||
self.acc.y = 0.0;
|
||||
}
|
||||
|
||||
fn show(&mut self, canvas: &mut WindowCanvas, gvars: &mut Gvars){
|
||||
if self.firework {
|
||||
canvas.filled_circle(self.pos.x as i16, self.pos.y as i16, 1, Color::RGBA(self.hue.r as u8,self.hue.g as u8,self.hue.b as u8,self.lifespan as u8)).err();
|
||||
} else {
|
||||
canvas.filled_circle(self.pos.x as i16, self.pos.y as i16, 3, Color::RGBA(self.hue.r as u8,self.hue.g as u8,self.hue.b as u8,255)).err();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Firework
|
||||
struct Firework{
|
||||
firework: Particle,
|
||||
exploded: bool,
|
||||
particles: Vec<Particle>,
|
||||
hue: IRGB,
|
||||
}
|
||||
|
||||
impl Firework{
|
||||
fn new(x: f64, y: f64) -> Self{
|
||||
let mut hu = IRGB::new(0.0,0.0,0.0);
|
||||
hu.hsvtorgb(&mut HSV::new(rng().random_range(0.0..360.0),1.0,1.0));
|
||||
Self {
|
||||
firework: Particle::new(x,y,hu,false),
|
||||
exploded: false,
|
||||
particles: Vec::new(),
|
||||
hue: hu,
|
||||
}
|
||||
}
|
||||
|
||||
fn done(&mut self) -> bool{
|
||||
if self.exploded && self.particles.len() == 0{
|
||||
return true
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
fn update(&mut self){
|
||||
if !self.exploded {
|
||||
self.firework.apply_force(&PointG::new(0.0,0.2));
|
||||
self.firework.update();
|
||||
|
||||
if self.firework.vel.y >= 0.0 {
|
||||
self.exploded=true;
|
||||
self.explode();
|
||||
}
|
||||
}
|
||||
|
||||
for i in (0..self.particles.len()).rev() {
|
||||
self.particles[i].apply_force(&PointG::new(0.0,0.2));
|
||||
self.particles[i].update();
|
||||
if self.particles[i].done() {
|
||||
self.particles.remove(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn explode(&mut self){
|
||||
for _ in 0..100{
|
||||
let p = Particle::new(self.firework.pos.x,self.firework.pos.y,self.hue,true);
|
||||
self.particles.push(p);
|
||||
}
|
||||
}
|
||||
|
||||
fn show(&mut self, canvas: &mut WindowCanvas, gvars: &mut Gvars){
|
||||
if !self.exploded {
|
||||
self.firework.show(canvas,gvars);
|
||||
}
|
||||
|
||||
for obj in &mut self.particles{
|
||||
obj.show(canvas,gvars);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Canvas Draw
|
||||
fn draw(canvas: &mut WindowCanvas, obj_arr: &mut Vec<Firework>, gvars: &mut Gvars){
|
||||
canvas.set_draw_color(Color::RGBA(0,0,0,50));
|
||||
|
||||
//swap these lines out if screen is glitchy
|
||||
canvas.fill_rect(Rect::new(0,0,800,800)).err();
|
||||
//canvas.clear();
|
||||
|
||||
|
||||
if rng().random_range(0.0..1.0) < 0.08 {
|
||||
let obj = Firework::new(rng().random_range(0.0..gvars.screen_size.x as f64), gvars.screen_size.y as f64);
|
||||
obj_arr.push(obj);
|
||||
}
|
||||
|
||||
for i in (0..obj_arr.len()).rev() {
|
||||
obj_arr[i].update();
|
||||
obj_arr[i].show(canvas,gvars);
|
||||
if obj_arr[i].done() {
|
||||
obj_arr.remove(i);
|
||||
}
|
||||
}
|
||||
|
||||
canvas.present();
|
||||
}
|
||||
|
||||
|
||||
|
||||
fn main() {
|
||||
let sdl2_context = sdl2::init().unwrap();
|
||||
let video_subsystem = sdl2_context.video().unwrap();
|
||||
|
||||
|
||||
let width: u32=800;
|
||||
let height: u32=800;
|
||||
|
||||
let window = video_subsystem.window("fireworks", width, height)
|
||||
.position_centered()
|
||||
.build()
|
||||
.unwrap();
|
||||
|
||||
let mut canvas = window.into_canvas().build().unwrap();
|
||||
canvas.default_pixel_format();
|
||||
canvas.set_blend_mode(sdl2::render::BlendMode::Blend);
|
||||
|
||||
let mut gvars = Gvars::new(width as f64, height as f64);
|
||||
|
||||
let mut obj_arr: Vec<Firework> = Vec::new();
|
||||
|
||||
|
||||
let obj = Firework::new(rng().random_range(0.0..width as f64), height as f64);
|
||||
obj_arr.push(obj);
|
||||
|
||||
|
||||
canvas.set_draw_color(Color::RGB(0,0,0));
|
||||
canvas.clear();
|
||||
|
||||
let mut event_pump = sdl2_context.event_pump().unwrap();
|
||||
draw(&mut canvas, &mut obj_arr, &mut gvars);
|
||||
|
||||
'running: loop {
|
||||
draw(&mut canvas, &mut obj_arr, &mut gvars);
|
||||
let state = event_pump.mouse_state();
|
||||
gvars.mouse.x=state.x() as f64;
|
||||
gvars.mouse.y=state.y() as f64;
|
||||
//draw(&mut canvas, &mut obj, &state.x(), &state.y());
|
||||
for event in event_pump.poll_iter() {
|
||||
match event {
|
||||
Event::Quit {..} |
|
||||
Event::KeyDown { keycode: Some(Keycode::Escape), .. } => {
|
||||
break 'running
|
||||
},
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 60));
|
||||
}
|
||||
}
|
||||
|
||||
// *~challenges
|
||||
// shaped fireworks such as a heart
|
||||
// variable amount of particles
|
Loading…
Reference in New Issue