MediaWiki:Common.js: Unterschied zwischen den Versionen
Admin (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Admin (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
| Zeile 1.237: | Zeile 1.237: | ||
/* ============================================================ | /* ============================================================ | ||
ADOS – Feuerwerk | ADOS – Feuerwerk (klassisch Silvester) – Raketen steigen hoch + explodieren | ||
ES5 | dauerhaft | kein Abdunkeln | Canvas transparent | |||
============================================================ */ | ============================================================ */ | ||
(function () { | (function () { | ||
| Zeile 1.281: | Zeile 1.278: | ||
var ctx = c.getContext('2d'); | var ctx = c.getContext('2d'); | ||
ctx.setTransform(dpr, 0, 0, dpr, 0, 0); | ctx.setTransform(dpr, 0, 0, dpr, 0, 0); | ||
// Glow- | // Glow-/Leuchteffekt (klassischer Feuerwerkslook) | ||
ctx.globalCompositeOperation = 'lighter'; | ctx.globalCompositeOperation = 'lighter'; | ||
return ctx; | return ctx; | ||
| Zeile 1.295: | Zeile 1.292: | ||
var running = true; | var running = true; | ||
// ---- Rocket Spawn (klassisch: moderat schnell) ---- | |||
function spawnRocket() { | function spawnRocket() { | ||
var w = window.innerWidth; | var w = window.innerWidth; | ||
| Zeile 1.301: | Zeile 1.299: | ||
var x = rand(60, w - 60); | var x = rand(60, w - 60); | ||
var y = h + rand(20, 120); | var y = h + rand(20, 120); | ||
// Explosionshöhe (klassisch: eher im oberen Mittelfeld) | |||
var | var targetY = rand(h * 0.12, h * 0.48); | ||
// Geschwindigkeit (klassisch: sichtbar, aber nicht hektisch) | |||
var vy = rand(-10.5, -14.5); | |||
var vx = rand(-1.2, 1.2); | |||
// Raketenleuchten (warm/gold) | |||
var r = Math.floor(rand(220, 255)); | var r = Math.floor(rand(220, 255)); | ||
var g = Math.floor(rand(170, 240)); | var g = Math.floor(rand(170, 240)); | ||
| Zeile 1.315: | Zeile 1.317: | ||
targetY: targetY, | targetY: targetY, | ||
age: 0, | age: 0, | ||
life: rand( | life: rand(2400, 3400), | ||
r: r, g: g, b: b, | r: r, g: g, b: b, | ||
trail: [] | trail: [] | ||
| Zeile 1.321: | Zeile 1.323: | ||
} | } | ||
// ---- Explosion (klassisch: kräftig, aber nicht extrem) ---- | |||
function explode(x, y) { | function explode(x, y) { | ||
var count = Math.floor(rand( | // Partikelanzahl: klassisch mittel | ||
var count = Math.floor(rand(55, 95)); | |||
var i; | var i; | ||
for (i = 0; i < count; i++) { | for (i = 0; i < count; i++) { | ||
var angle = rand(0, Math.PI * 2); | var angle = rand(0, Math.PI * 2); | ||
var speed = rand(2. | // Geschwindigkeit: klassisch „Knall“ | ||
var speed = rand(2.8, 6.8); | |||
// Farben: Mix aus bunt + gold (klassisch) | |||
var rr = Math.floor(rand(120, 255)); | var rr = Math.floor(rand(120, 255)); | ||
var gg = Math.floor(rand(80, 240)); | var gg = Math.floor(rand(80, 240)); | ||
var bb = Math.floor(rand(120, 255)); | var bb = Math.floor(rand(120, 255)); | ||
// Gold-Bias | // Gold/Amber-Bias für „klassisch“ | ||
if (Math.random() < 0. | if (Math.random() < 0.35) { | ||
rr = Math.floor(rand(220, 255)); | rr = Math.floor(rand(220, 255)); | ||
gg = Math.floor(rand(150, 230)); | gg = Math.floor(rand(150, 230)); | ||
| Zeile 1.345: | Zeile 1.351: | ||
vy: Math.sin(angle) * speed, | vy: Math.sin(angle) * speed, | ||
age: 0, | age: 0, | ||
life: rand(900, | life: rand(900, 1500), | ||
size: rand(1.8, 3. | size: rand(1.8, 3.4), | ||
r: rr, g: gg, b: bb | r: rr, g: gg, b: bb | ||
}); | }); | ||
| Zeile 1.361: | Zeile 1.367: | ||
var h = window.innerHeight; | var h = window.innerHeight; | ||
// | // Transparent löschen: kein Abdunkeln, kein Weiß-Schleier | ||
ctx.globalCompositeOperation = 'source-over'; | ctx.globalCompositeOperation = 'source-over'; | ||
ctx.clearRect(0, 0, w, h); | ctx.clearRect(0, 0, w, h); | ||
| Zeile 1.372: | Zeile 1.378: | ||
r.age += dt; | r.age += dt; | ||
// Trail | |||
r.trail.push({ x: r.x, y: r.y }); | r.trail.push({ x: r.x, y: r.y }); | ||
if (r.trail.length > | if (r.trail.length > 16) r.trail.shift(); | ||
r.vy += 0. | // Physik: sanfte Schwerkraft (klassisch) | ||
r.vy += 0.006 * (dt / 16); | |||
r.x += r.vx * (dt / 16); | r.x += r.vx * (dt / 16); | ||
r.y += r.vy * (dt / 16); | r.y += r.vy * (dt / 16); | ||
// Explosions-Trigger | |||
if (r.y <= r.targetY) { | if (r.y <= r.targetY) { | ||
explode(r.x, r.y); | explode(r.x, r.y); | ||
| Zeile 1.385: | Zeile 1.394: | ||
} | } | ||
// Safety | |||
if (r.age >= r.life || r.y < -200 || r.x < -200 || r.x > w + 200) { | if (r.age >= r.life || r.y < -200 || r.x < -200 || r.x > w + 200) { | ||
rockets.splice(i, 1); | rockets.splice(i, 1); | ||
| Zeile 1.390: | Zeile 1.400: | ||
} | } | ||
// Trail | // Trail zeichnen (klassisch: sichtbar, aber nicht zu dick) | ||
ctx.beginPath(); | ctx.beginPath(); | ||
ctx.lineWidth = | ctx.lineWidth = 2.6; | ||
ctx.strokeStyle = 'rgba(' + r.r + ',' + r.g + ',' + r.b + ',0. | ctx.strokeStyle = 'rgba(' + r.r + ',' + r.g + ',' + r.b + ',0.30)'; | ||
var t; | var t; | ||
for (t = 0; t < r.trail.length; t++) { | for (t = 0; t < r.trail.length; t++) { | ||
| Zeile 1.405: | Zeile 1.415: | ||
ctx.beginPath(); | ctx.beginPath(); | ||
ctx.fillStyle = 'rgba(' + r.r + ',' + r.g + ',' + r.b + ',1)'; | ctx.fillStyle = 'rgba(' + r.r + ',' + r.g + ',' + r.b + ',1)'; | ||
ctx.arc(r.x, r.y, | ctx.arc(r.x, r.y, 2.7, 0, Math.PI * 2, false); | ||
ctx.fill(); | ctx.fill(); | ||
} | } | ||
| Zeile 1.420: | Zeile 1.430: | ||
} | } | ||
p.vy += 0. | // Physik | ||
p.vx *= Math.pow(0. | p.vy += 0.018 * (dt / 16); | ||
p.vy *= Math.pow(0. | p.vx *= Math.pow(0.986, dt / 16); | ||
p.vy *= Math.pow(0.986, dt / 16); | |||
p.x += p.vx * (dt / 16); | p.x += p.vx * (dt / 16); | ||
p.y += p.vy * (dt / 16); | p.y += p.vy * (dt / 16); | ||
| Zeile 1.437: | Zeile 1.448: | ||
} | } | ||
// ---- Spawn-Frequenz (klassisch: alle ~1.2–2.2s) ---- | |||
function scheduleRockets() { | function scheduleRockets() { | ||
function loop() { | function loop() { | ||
if (!running) return; | if (!running) return; | ||
// meist 1 Rakete, manchmal 2 (klassisch) | |||
spawnRocket(); | spawnRocket(); | ||
if (Math.random() < 0. | if (Math.random() < 0.28) spawnRocket(); | ||
setTimeout(loop, Math.floor(rand( | setTimeout(loop, Math.floor(rand(1200, 2200))); | ||
} | } | ||
loop(); | loop(); | ||