Files
hakorune/examples/particle_explosion.hako

196 lines
5.8 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 🌟 パーティクル爆発システム - Everything is Box の美しい実証
// WebCanvasBox + RandomBox + MathBox の完璧な統合
print("🌟 === Particle Explosion System Starting ===")
// デバッグシステム初期化
DEBUG = new DebugBox()
DEBUG.startTracking()
// 🎨 パーティクルBox - 各粒子が独立したBox
box ParticleBox {
init { x, y, vx, vy, color, size, life, maxLife, gravity }
ParticleBox(startX, startY) {
// ランダム生成器
random = new RandomBox()
// 初期位置
me.x = startX
me.y = startY
// ランダム速度(爆発効果)
angle = random.float() * 6.28318 // 2π
speed = random.float() * 5.0 + 2.0
me.vx = speed * new MathBox().cos(angle)
me.vy = speed * new MathBox().sin(angle) - 3.0 // 上向き初速度
// ランダム色(虹色パーティクル)
colorChoice = random.integer(1, 6)
if colorChoice == 1 { me.color = "red" }
if colorChoice == 2 { me.color = "orange" }
if colorChoice == 3 { me.color = "yellow" }
if colorChoice == 4 { me.color = "lime" }
if colorChoice == 5 { me.color = "cyan" }
if colorChoice == 6 { me.color = "magenta" }
// パーティクル特性
me.size = random.float() * 4.0 + 2.0
me.maxLife = 100
me.life = me.maxLife
me.gravity = 0.1
}
// 物理更新
update() {
// 重力適用
me.vy = me.vy + me.gravity
// 位置更新
me.x = me.x + me.vx
me.y = me.y + me.vy
// 空気抵抗
me.vx = me.vx * 0.99
me.vy = me.vy * 0.98
// 寿命減少
me.life = me.life - 1
// サイズも寿命とともに小さく
ratio = me.life / me.maxLife
me.size = me.size * 0.995
return me.life > 0
}
// Canvas描画
draw(canvas) {
if me.life > 0 {
// 透明度計算
alpha = me.life / me.maxLife
// 円を描画
canvas.setFillStyle(me.color)
canvas.beginPath()
canvas.arc(me.x, me.y, me.size, 0, 6.28318)
canvas.fill()
// 光るエフェクト(小さい白い点)
if me.life > me.maxLife * 0.8 {
canvas.setFillStyle("white")
canvas.beginPath()
canvas.arc(me.x, me.y, me.size * 0.3, 0, 6.28318)
canvas.fill()
}
}
}
isAlive() {
return me.life > 0
}
}
// 🎆 パーティクルシステム管理Box
box ParticleSystemBox {
init { particles, canvas, centerX, centerY, explosionTimer }
ParticleSystemBox(canvasId, width, height) {
// WebCanvas初期化
me.canvas = new WebCanvasBox(canvasId, width, height)
me.particles = new ArrayBox()
me.centerX = width / 2
me.centerY = height / 2
me.explosionTimer = 0
// 背景色設定
me.canvas.setFillStyle("black")
me.canvas.fillRect(0, 0, width, height)
DEBUG.trackBox(me, "ParticleSystem")
}
// 爆発生成
explode(x, y, count) {
print("💥 Creating " + count + " particles at (" + x + ", " + y + ")")
i = 0
loop (i < count) {
particle = new ParticleBox(x, y)
me.particles.add(particle)
DEBUG.trackBox(particle, "Particle_" + i)
i = i + 1
}
}
// フレーム更新
update() {
// 背景クリア(トレイル効果用に少し透明)
me.canvas.setFillStyle("rgba(0,0,0,0.1)")
me.canvas.fillRect(0, 0, me.canvas.width, me.canvas.height)
// 全パーティクル更新
aliveParticles = new ArrayBox()
i = 0
loop (i < me.particles.size()) {
particle = me.particles.get(i)
if particle.update() {
particle.draw(me.canvas)
aliveParticles.add(particle)
}
i = i + 1
}
me.particles = aliveParticles
// 自動爆発タイマー
me.explosionTimer = me.explosionTimer + 1
if me.explosionTimer > 120 { // 2秒間隔
random = new RandomBox()
explodeX = random.integer(50, me.canvas.width - 50)
explodeY = random.integer(50, me.canvas.height - 50)
particleCount = random.integer(15, 30)
me.explode(explodeX, explodeY, particleCount)
me.explosionTimer = 0
}
// 統計表示
me.canvas.setFillStyle("white")
me.canvas.fillText("Particles: " + me.particles.size(), 10, 20)
me.canvas.fillText("Everything is Box!", 10, 40)
}
// メイン実行ループ
run(frames) {
frame = 0
loop (frame < frames) {
me.update()
frame = frame + 1
// フレーム情報
if frame % 60 == 0 {
print("🎬 Frame: " + frame + ", Active particles: " + me.particles.size())
}
}
}
}
// 🚀 システム起動!
print("🎨 Creating particle system...")
system = new ParticleSystemBox("particle-canvas", 800, 600)
// 最初の大爆発!
system.explode(400, 300, 50)
print("💥 Initial explosion created!")
print("🌈 Rainbow particles with physics!")
print("✨ Each particle is an independent Box!")
// 自動実行デモ300フレーム = 約5秒
print("🎮 Running automatic particle show...")
system.run(300)
// 最終統計
print(DEBUG.memoryReport())
print("🎆 Particle explosion complete!")
print("🐱 Everything is Box - Even explosions are beautiful!")