Files
hakorune/examples/particle_explosion.nyash
Moe Charm 0bed0c0271 🎉 initial commit: Nyash Programming Language完成版
🚀 主要機能:
• Everything is Box哲学による革新的アーキテクチャ
• WebAssemblyブラウザー対応プレイグラウンド
• アーティスト協同制作デモ - 複数Boxインスタンス実証
• 視覚的デバッグシステム - DebugBox完全統合
• static box Mainパターン - メモリ安全設計

 言語機能:
• NOT/AND/OR/除算演算子完全実装
• ジェネリクス/テンプレートシステム
• 非同期処理(nowait/await)
• try/catchエラーハンドリング
• Canvas統合グラフィックス

🎨 ブラウザー体験:
• 9種類のインタラクティブデモ
• リアルタイムコード実行
• WebCanvas/WebConsole/WebDisplay
• モバイル対応完了

🤖 Built with Claude Code collaboration
Ready for public release!
2025-08-09 15:14:44 +09:00

196 lines
5.8 KiB
Plaintext
Raw 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!")