209 lines
5.1 KiB
Plaintext
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!")
|