Files
hakorune/examples/wasm/03_particle_fireworks.nyash
2025-08-13 00:27:07 +00:00

209 lines
5.1 KiB
Plaintext

// 🎆 Particle Fireworks Demo - ParticleBox simulation
// Demonstrates particle physics and animation using Everything is Box
print("🎆 === Particle Fireworks Demo Starting ===")
// Initialize components
local canvas, timer, random
canvas = new WebCanvasBox("demo-canvas", 800, 600)
timer = new TimerBox()
random = new RandomBox()
// Particle system data
local particles, maxParticles
particles = []
maxParticles = 100
// Particle properties structure (Everything is Box approach)
local createParticle
createParticle = function(x, y, vx, vy, color, life) {
local particle
particle = {
x: x,
y: y,
vx: vx,
vy: vy,
color: color,
life: life,
maxLife: life,
size: random.randInt(2, 8)
}
return particle
}
// Physics constants
local gravity, friction
gravity = 0.1
friction = 0.99
// Update particle physics
local updateParticles
updateParticles = function() {
local i, particle
i = 0
loop(i < particles.length()) {
particle = particles[i]
// Update position
particle.x = particle.x + particle.vx
particle.y = particle.y + particle.vy
// Apply physics
particle.vy = particle.vy + gravity
particle.vx = particle.vx * friction
particle.vy = particle.vy * friction
// Update life
particle.life = particle.life - 1
// Remove dead particles
if (particle.life <= 0) {
particles.remove(i)
} else {
i = i + 1
}
}
}
// Render particles
local drawParticles
drawParticles = function() {
local i, particle, alpha, size
i = 0
loop(i < particles.length()) {
particle = particles[i]
// Calculate fade based on remaining life
alpha = particle.life / particle.maxLife
size = particle.size * alpha
// Draw particle with fading effect
canvas.setFillStyle(particle.color)
canvas.fillCircle(particle.x, particle.y, size)
i = i + 1
}
}
// Create firework burst
local createFirework
createFirework = function(x, y) {
local i, angle, speed, vx, vy, colors, color
colors = ["#ff0000", "#00ff00", "#0000ff", "#ffff00", "#ff00ff", "#00ffff", "#ffffff", "#ff8800"]
i = 0
loop(i < 20) {
angle = random.random() * 6.28318 // Full circle in radians
speed = random.randInt(2, 10)
vx = Math.cos(angle) * speed
vy = Math.sin(angle) * speed
color = colors[random.randInt(0, 7)]
// Add particle to system
particles.push(createParticle(x, y, vx, vy, color, random.randInt(30, 60)))
i = i + 1
}
}
// Trail particles for rocket
local createTrail
createTrail = function(x, y) {
local i, vx, vy
i = 0
loop(i < 3) {
vx = random.random() * 2 - 1
vy = random.random() * 2 + 1
particles.push(createParticle(x, y, vx, vy, "#ffaa00", random.randInt(10, 20)))
i = i + 1
}
}
// Main animation loop simulation
local frame, lastFirework
frame = 0
lastFirework = 0
local animate
animate = function() {
// Clear canvas with night sky
canvas.setFillStyle("#000011")
canvas.fillRect(0, 0, 800, 600)
// Update and draw particles
updateParticles()
drawParticles()
// Create new fireworks periodically
if (frame - lastFirework > 60) { // Every ~1 second at 60fps
local fx, fy
fx = random.randInt(100, 700)
fy = random.randInt(100, 300)
createFirework(fx, fy)
lastFirework = frame
}
// Add some continuous sparkles
if (frame % 10 == 0) {
local sx, sy
sx = random.randInt(0, 800)
sy = random.randInt(400, 600)
createTrail(sx, sy)
}
frame = frame + 1
}
// Set up initial display
canvas.clear()
canvas.setFillStyle("#000011")
canvas.fillRect(0, 0, 800, 600)
// Draw title
canvas.setFillStyle("#ffffff")
canvas.fillText("🎆 Nyash Particle Fireworks", 250, 50, "28px Arial", "#ffffff")
// Create initial fireworks for demo
createFirework(200, 150)
createFirework(400, 200)
createFirework(600, 180)
// Run a few animation frames for demo
local demoFrames
demoFrames = 0
loop(demoFrames < 10) {
animate()
demoFrames = demoFrames + 1
}
// Draw info text
canvas.setFillStyle("#ffff00")
canvas.fillText("Particle Count: " + particles.length(), 50, 550, "18px Arial", "#ffff00")
canvas.fillText("Everything is Box - even fireworks!", 400, 550, "18px Arial", "#00ff00")
print("🎆 Particle Fireworks Demo Ready!")
print("• " + particles.length() + " particles currently active")
print("• Physics simulation with gravity and friction")
print("• Randomized colors and burst patterns")
print("• Automatic firework generation")
print("🌐 Everything is Box - explosive entertainment!")
// Add some decorative elements
canvas.setFillStyle("#444444")
local i
i = 0
loop(i < 50) {
local starX, starY
starX = random.randInt(0, 800)
starY = random.randInt(0, 200)
canvas.fillCircle(starX, starY, 1)
i = i + 1
}
print("✅ Particle Fireworks Demo Complete!")