MediaWiki:Common.js: Unterschied zwischen den Versionen
Admin (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung Markierung: Zurückgesetzt |
Admin (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung Markierung: Zurückgesetzt |
||
| Zeile 1.238: | Zeile 1.238: | ||
/* ============================================================ | /* ============================================================ | ||
ADOS – | ADOS – Feuerwerk mit Raketen (hochschießen + explodieren) | ||
ES5 | dauerhaft | kein Abdunkeln | pointer-events:none | |||
============================================================ */ | ============================================================ */ | ||
(function () { | (function () { | ||
'use strict'; | 'use strict'; | ||
// --- OPTIONAL: nur an Silvester/Neujahr | // --- OPTIONAL: nur an Silvester/Neujahr --- | ||
// | // true = nur 31.12/01.01, false = immer | ||
var onlyOnNewYears = | var onlyOnNewYears = false; | ||
function isNewYears() { | function isNewYears() { | ||
| Zeile 1.254: | Zeile 1.254: | ||
return (m === 12 && day === 31) || (m === 1 && day === 1); | return (m === 12 && day === 31) || (m === 1 && day === 1); | ||
} | } | ||
if (onlyOnNewYears && !isNewYears()) return; | if (onlyOnNewYears && !isNewYears()) return; | ||
| Zeile 1.286: | Zeile 1.285: | ||
var canvas, ctx; | var canvas, ctx; | ||
var particles = []; | var rockets = []; // Raketenobjekte | ||
var particles = []; // Explosionspartikel | |||
var last = 0; | var last = 0; | ||
var running = true; | var running = true; | ||
function | // ---- Rocket Spawn ---- | ||
var count = Math.floor(rand( | function spawnRocket() { | ||
var w = window.innerWidth; | |||
var h = window.innerHeight; | |||
// Start unten (leicht random) | |||
var x = rand(60, w - 60); | |||
var y = h + rand(10, 80); | |||
// Zielhöhe irgendwo oben/mittig | |||
var targetY = rand(h * 0.15, h * 0.55); | |||
// Geschwindigkeit / Drift | |||
var vy = rand(-9.5, -12.5); | |||
var vx = rand(-1.2, 1.2); | |||
rockets.push({ | |||
x: x, | |||
y: y, | |||
vx: vx, | |||
vy: vy, | |||
targetY: targetY, | |||
life: rand(900, 1400), // Sicherheitslimit | |||
age: 0, | |||
// Rocket-Farbe / Leuchtpunkt | |||
r: Math.floor(rand(220, 255)), | |||
g: Math.floor(rand(180, 240)), | |||
b: Math.floor(rand(80, 160)) | |||
}); | |||
} | |||
// ---- Explosion ---- | |||
function explode(x, y) { | |||
var count = Math.floor(rand(45, 90)); | |||
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.0, | var speed = rand(2.0, 6.0); | ||
particles.push({ | particles.push({ | ||
x: x, | x: x, | ||
| Zeile 1.303: | Zeile 1.335: | ||
life: rand(650, 1200), | life: rand(650, 1200), | ||
age: 0, | age: 0, | ||
size: rand(1.4, 3. | size: rand(1.4, 3.1), | ||
// | // Explosionsfarbe: Gold/Rot/Blau gemischt | ||
r: Math.floor(rand( | r: Math.floor(rand(140, 255)), | ||
g: Math.floor(rand( | g: Math.floor(rand(80, 230)), | ||
b: Math.floor(rand( | b: Math.floor(rand(120, 255)) | ||
}); | }); | ||
} | } | ||
} | } | ||
// | // ---- Render: keine Abdunkelung → clearRect (kein Schleier) ---- | ||
function tick(ts) { | function tick(ts) { | ||
if (!running) return; | if (!running) return; | ||
| Zeile 1.321: | Zeile 1.351: | ||
last = ts; | last = ts; | ||
ctx.clearRect(0, 0, | var w = window.innerWidth; | ||
var h = window.innerHeight; | |||
// Kein Abdunkeln | |||
ctx.clearRect(0, 0, w, h); | |||
// --- Rockets updaten/zeichnen --- | |||
var i, r; | |||
for (i = rockets.length - 1; i >= 0; i--) { | |||
r = rockets[i]; | |||
r.age += dt; | |||
// Bewegung | |||
r.vy += 0.0022 * dt; // Schwerkraft bremst (weniger negativ) | |||
r.vx *= Math.pow(0.999, dt); | |||
r.vy *= Math.pow(0.999, dt); | |||
r.x += r.vx * (dt / 16); | |||
r.y += r.vy * (dt / 16); | |||
// Rakete erreicht Zielhöhe → explodiert | |||
if (r.y <= r.targetY) { | |||
explode(r.x, r.y); | |||
rockets.splice(i, 1); | |||
continue; | |||
} | |||
// Sicherheits-Limit | |||
if (r.age >= r.life || r.y < -100 || r.x < -100 || r.x > w + 100) { | |||
rockets.splice(i, 1); | |||
continue; | |||
} | |||
var | // Rocket zeichnen: Punkt + kleiner Schweif | ||
ctx.beginPath(); | |||
ctx.fillStyle = 'rgba(' + r.r + ',' + r.g + ',' + r.b + ',1)'; | |||
ctx.arc(r.x, r.y, 2.2, 0, Math.PI * 2, false); | |||
ctx.fill(); | |||
// Schweif (kurzer Strich nach unten) | |||
ctx.beginPath(); | |||
ctx.strokeStyle = 'rgba(' + r.r + ',' + r.g + ',' + r.b + ',0.65)'; | |||
ctx.lineWidth = 2; | |||
ctx.moveTo(r.x, r.y + 10); | |||
ctx.lineTo(r.x - r.vx * 3, r.y + 22); | |||
ctx.stroke(); | |||
} | |||
// --- Partikel updaten/zeichnen --- | |||
var p; | |||
for (i = particles.length - 1; i >= 0; i--) { | for (i = particles.length - 1; i >= 0; i--) { | ||
p = particles[i]; | p = particles[i]; | ||
p.age += dt; | p.age += dt; | ||
if (p.age >= p.life) { | if (p.age >= p.life) { | ||
particles.splice(i, 1); | particles.splice(i, 1); | ||
| Zeile 1.333: | Zeile 1.410: | ||
// Physik | // Physik | ||
p.vy += 0. | p.vy += 0.0030 * dt; | ||
p.vx *= Math.pow(0.998, dt); | p.vx *= Math.pow(0.998, dt); | ||
p.vy *= Math.pow(0.998, dt); | p.vy *= Math.pow(0.998, dt); | ||
| Zeile 1.351: | Zeile 1.428: | ||
} | } | ||
// | // ---- Spawner: dauerhaft neue Raketen ---- | ||
function | function scheduleRockets() { | ||
function loop() { | function loop() { | ||
if (!running) return; | if (!running) return; | ||
setTimeout(loop, Math.floor(rand( | // 1–2 Raketen pro Spawn | ||
spawnRocket(); | |||
if (Math.random() < 0.35) spawnRocket(); | |||
// Frequenz (anpassen!) | |||
setTimeout(loop, Math.floor(rand(800, 1500))); | |||
} | } | ||
loop(); | loop(); | ||
| Zeile 1.370: | Zeile 1.452: | ||
}); | }); | ||
scheduleRockets(); | |||
requestAnimationFrame(tick); | requestAnimationFrame(tick); | ||
} | } | ||