Kategorien
| Bitte befüllt die Seite DarkfleetWiki:NoSpamUser in alphabetischer Reihenfolge mit den Namen von Wikibenutzern, welche keine Spam-Bots sind. |
MediaWiki:Feuerwerk.js: Unterschied zwischen den Versionen
Aus DarkfleetWiki
Galak (Diskussion | Beiträge) |
Galak (Diskussion | Beiträge) (für bessere performance bleiben wir beim alten) |
||
| Zeile 1: | Zeile 1: | ||
| − | / | + | //////////////////////////////////////////////////////////////////////// |
| − | + | // Fireworks-Script (c) 2014, Dominik Scholz / go4u.de Webdesign | |
| − | + | //////////////////////////////////////////////////////////////////////// | |
| − | |||
| − | |||
| − | / | ||
| − | |||
| − | + | var fireworks = { | |
| − | { | ||
| − | + | ///////////////////////////// configuration //////////////////////////// | |
| − | + | ||
| − | + | // random colors | |
| + | _color: ['#D0D0D0', '#FF0000', '#FFFF00', '#22FF00', '#2040FF', '#00CCFF', '#FF00FF', '#A319D6'], | ||
| + | // gravity factor | ||
| + | _gravity: 0.07, | ||
| + | // air resistance factor | ||
| + | _resistance: 0.975, | ||
| + | // zIndex of particles | ||
| + | _zIndex: 20000, | ||
| + | // maximal age of particles (in msec) | ||
| + | _maxAge: 2000, | ||
| + | // interval of appearing explosions (in msec) | ||
| + | _interval: [500, 2500], | ||
| + | // amount of particles per explosion | ||
| + | _particlesPerExplosion: 40, | ||
| + | // maximal speed of particle at moment of explosion | ||
| + | _speed: 5, | ||
| − | + | ||
| + | |||
| + | ///////////////////////////// private vars ///////////////////////////// | ||
| + | |||
| + | _particles: [], | ||
| + | _bodyWidth: 0, | ||
| + | _bodyHeight: 0, | ||
| + | _count: 0, | ||
| + | _lastInterval: 0, | ||
| − | + | ||
| − | |||
| − | |||
| − | + | ////////////////////////////// functions /////////////////////////////// | |
| − | |||
| − | + | // init fireworks | |
| − | + | init: function() | |
| − | + | { | |
| + | this._addEventListener(window, 'resize', function() { return fireworks.resize.apply(fireworks); }); | ||
| + | this._addEventListener(window, 'load', function() { return fireworks.start.apply(fireworks); }); | ||
| + | }, | ||
| + | |||
| + | |||
| + | // add an event listener | ||
| + | _addEventListener: function(el, name, handler) | ||
| + | { | ||
| + | if (el.addEventListener) | ||
| + | el.addEventListener(name, handler, false); | ||
| + | else if (el.attachEvent) | ||
| + | el.attachEvent('on' + name, handler); | ||
| + | }, | ||
| + | |||
| + | |||
| + | // start fireworks | ||
| + | start: function() | ||
| + | { | ||
| + | // init window size | ||
| + | this.resize(); | ||
| − | + | // start to move particles | |
| − | + | this._animFn = function() {fireworks._move();}; | |
| + | this._lastInterval = this._time(); | ||
| + | requestAnimFrame(this._animFn); | ||
| + | |||
| + | this._addExplosion(); | ||
| + | }, | ||
| + | |||
| + | |||
| + | // get current time | ||
| + | _time: function() | ||
| + | { | ||
| + | return +new Date(); | ||
| + | }, | ||
| + | |||
| − | return | + | // return a random integer |
| − | + | _random: function(value) | |
| − | + | { | |
| − | { | + | return Math.random() * value; |
| − | + | }, | |
| − | + | ||
| − | } | ||
| − | |||
| − | + | // return a random array element | |
| − | + | _randomArray: function(arr) | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | / | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
{ | { | ||
| − | + | return arr[ | |
| − | + | Math.floor( | |
| − | + | Math.random() * (arr.length) | |
| − | + | ) | |
| − | + | ]; | |
| − | + | }, | |
| − | + | ||
| − | + | ||
| − | + | // add a new explosion | |
| − | } | + | _addExplosion: function() |
| − | |||
| − | |||
| − | |||
| − | |||
{ | { | ||
| + | var x = Math.floor(this._random(this._bodyWidth)), | ||
| + | y = Math.floor((this._random(.5) + .1) * this._bodyHeight), | ||
| + | dx = this._random(10) - 5, | ||
| + | dy = this._random(-2) - 1, | ||
| + | c1 = this._randomArray(this._color), | ||
| + | c2 = this._randomArray(this._color); | ||
| − | + | for (var i = 0; i < this._particlesPerExplosion; i++) | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
{ | { | ||
| − | this.dy | + | this._createParticle( |
| − | + | x, | |
| − | + | y, | |
| − | + | dx, | |
| + | dy, | ||
| + | i / (this._particlesPerExplosion - 1) * 180 * Math.PI, | ||
| + | this._random(this._speed), | ||
| + | this._random(1) > .5 ? c1 : c2 | ||
| + | ); | ||
} | } | ||
| − | } | + | |
| − | + | window.setTimeout( | |
| + | function() { return fireworks._addExplosion.apply(fireworks);}, | ||
| + | this._random(this._interval[1] - this._interval[0]) + this._interval[0] | ||
| + | ); | ||
| + | }, | ||
| + | |||
| + | |||
| + | // creates a new particle | ||
| + | _createParticle: function(x, y, dx, dy, rot, speed, color) | ||
{ | { | ||
| − | + | var el = null, | |
| − | + | foundEl = false, | |
| − | + | p = this._particles; | |
| − | + | ||
| − | + | // look for old particle | |
| − | + | for (var i = 0, l = p.length; i < l; i++) | |
| − | + | if (p[i].data.age > 1) | |
| − | + | { | |
| − | + | el = p[i]; | |
| − | + | foundEl = true; | |
| − | + | break; | |
| − | this. | + | } |
| − | + | ||
| − | + | // create span child for particles | |
| − | + | if (!foundEl) | |
| − | } | + | { |
| − | + | el = document.createElement('div'); | |
| + | el.className = 'particle'; | ||
| + | el.style.position = 'absolute'; | ||
| + | el.style.fontSize = '20px'; | ||
| + | el.style.zIndex = this._zIndex; | ||
| + | el.style.width = '10px'; | ||
| + | el.style.overflow = 'hidden'; | ||
| + | el.innerHTML = '●'; | ||
| + | } | ||
| − | + | el.style.left = x + 'px'; | |
| − | + | el.style.top = y + 'px'; | |
| − | + | el.style.color = color; | |
| − | + | el.data = { | |
| − | + | x: x, | |
| − | + | y: y, | |
| − | + | dx: Math.cos(rot) * speed + dx, | |
| − | + | dy: Math.sin(rot) * speed + dy, | |
| − | + | color: color, | |
| + | age: Math.random() * .25 | ||
| + | }; | ||
| + | |||
| + | if (!foundEl) | ||
| + | { | ||
| + | document.getElementsByTagName('body')[0].appendChild(el); | ||
| + | this._particles.push(el); | ||
| + | } | ||
| + | }, | ||
| − | + | ||
| − | + | // move existing particles | |
| − | + | _move: function() | |
| − | |||
| − | |||
| − | |||
{ | { | ||
| − | this. | + | requestAnimFrame(this._animFn); |
| − | this. | + | |
| − | this. | + | // calculate movement factor |
| − | + | var dif = this._time() - this._lastInterval; | |
| − | + | this._lastInterval = this._time(); | |
| − | } | + | |
| − | + | var delta = dif / 20, | |
| − | { | + | el, |
| − | + | d, | |
| − | } | + | p = this._particles, |
| + | r = Math.pow(this._resistance, delta), | ||
| + | g = this._gravity * delta, | ||
| + | a = dif / this._maxAge; | ||
| + | |||
| + | for (var i = 0, l = p.length; i < l; i++) | ||
| + | { | ||
| + | el = p[i]; | ||
| + | d = el.data; | ||
| + | |||
| + | if (d.age > 1) | ||
| + | continue; | ||
| + | |||
| + | d.age += a; | ||
| + | d.dy += g; | ||
| + | d.dx *= r; | ||
| + | d.dy *= r; | ||
| + | d.x += d.dx * delta; | ||
| + | d.y += d.dy * delta; | ||
| + | |||
| + | if (d.x < 0) | ||
| + | { | ||
| + | d.dx *= -1; | ||
| + | d.x = 0; | ||
| + | } | ||
| + | if (d.x > this._bodyWidth) | ||
| + | { | ||
| + | d.dx *= -1; | ||
| + | d.x = this._bodyWidth; | ||
| + | } | ||
| + | if (d.y < 0) | ||
| + | { | ||
| + | d.dy *= -1; | ||
| + | d.y = 0; | ||
| + | } | ||
| + | if (d.y > this._bodyHeight) | ||
| + | { | ||
| + | d.dy *= -1; | ||
| + | d.y = this._bodyHeight; | ||
| + | } | ||
| + | |||
| + | if (d.age > 1) | ||
| + | d.x = d.y = 0; | ||
| + | |||
| + | el.style.left = d.x + 'px'; | ||
| + | el.style.top = d.y + 'px'; | ||
| + | el.style.color = (Math.random() * .5 + d.age >= 1) ? 'transparent' : d.color; | ||
| + | el.style.fontSize = (1 - d.age) * 5 + 5 + 'px'; | ||
| + | } | ||
| + | }, | ||
| + | |||
| − | + | // calculate new positions for all particles | |
| − | { | + | resize: function() |
| − | + | { | |
| − | + | // get new width and height | |
| − | + | this._bodyWidth = this._getWindowWidth() - 10; | |
| + | this._bodyHeight = this._getWindowHeight() - 20; | ||
| + | }, | ||
| − | + | ||
| − | + | // get window width | |
| − | + | _getWindowWidth: function() | |
| − | |||
| − | |||
| − | |||
{ | { | ||
| − | + | return document.getElementsByTagName('body')[0].offsetWidth; | |
| − | + | }, | |
| − | } | ||
| − | + | ||
| − | + | // get window height | |
| − | + | _getWindowHeight: function() | |
| − | |||
{ | { | ||
| − | + | var h = Math.max(self.innerHeight || 0, window.innerHeight || 0); | |
| − | + | ||
| − | + | if (document.documentElement) | |
| + | h = Math.max(h, document.documentElement.clientHeight || 0); | ||
| + | if (document.body) | ||
{ | { | ||
| − | + | h = Math.max(h, document.body.clientHeight || 0); | |
| − | + | h = Math.max(h, document.body.scrollHeight || 0); | |
| − | + | h = Math.max(h, document.body.offsetHeight || 0); | |
| − | } | + | } |
| + | |||
| + | return h; | ||
} | } | ||
| − | |||
| − | |||
| − | + | }; | |
| − | + | ||
| − | + | // shim layer with setTimeout fallback | |
| − | + | window.requestAnimFrame = (function(){ | |
| − | } | + | return window.requestAnimationFrame || |
| − | + | window.webkitRequestAnimationFrame || | |
| − | + | window.mozRequestAnimationFrame || | |
| − | + | window.oRequestAnimationFrame || | |
| + | window.msRequestAnimationFrame || | ||
| + | function (cb){ | ||
| + | window.setTimeout(cb, 1000 / 60); | ||
| + | }; | ||
| + | })(); | ||
| + | |||
| + | fireworks.init(); | ||
Aktuelle Version vom 3. Dezember 2015, 02:35 Uhr
////////////////////////////////////////////////////////////////////////
// Fireworks-Script (c) 2014, Dominik Scholz / go4u.de Webdesign
////////////////////////////////////////////////////////////////////////
var fireworks = {
///////////////////////////// configuration ////////////////////////////
// random colors
_color: ['#D0D0D0', '#FF0000', '#FFFF00', '#22FF00', '#2040FF', '#00CCFF', '#FF00FF', '#A319D6'],
// gravity factor
_gravity: 0.07,
// air resistance factor
_resistance: 0.975,
// zIndex of particles
_zIndex: 20000,
// maximal age of particles (in msec)
_maxAge: 2000,
// interval of appearing explosions (in msec)
_interval: [500, 2500],
// amount of particles per explosion
_particlesPerExplosion: 40,
// maximal speed of particle at moment of explosion
_speed: 5,
///////////////////////////// private vars /////////////////////////////
_particles: [],
_bodyWidth: 0,
_bodyHeight: 0,
_count: 0,
_lastInterval: 0,
////////////////////////////// functions ///////////////////////////////
// init fireworks
init: function()
{
this._addEventListener(window, 'resize', function() { return fireworks.resize.apply(fireworks); });
this._addEventListener(window, 'load', function() { return fireworks.start.apply(fireworks); });
},
// add an event listener
_addEventListener: function(el, name, handler)
{
if (el.addEventListener)
el.addEventListener(name, handler, false);
else if (el.attachEvent)
el.attachEvent('on' + name, handler);
},
// start fireworks
start: function()
{
// init window size
this.resize();
// start to move particles
this._animFn = function() {fireworks._move();};
this._lastInterval = this._time();
requestAnimFrame(this._animFn);
this._addExplosion();
},
// get current time
_time: function()
{
return +new Date();
},
// return a random integer
_random: function(value)
{
return Math.random() * value;
},
// return a random array element
_randomArray: function(arr)
{
return arr[
Math.floor(
Math.random() * (arr.length)
)
];
},
// add a new explosion
_addExplosion: function()
{
var x = Math.floor(this._random(this._bodyWidth)),
y = Math.floor((this._random(.5) + .1) * this._bodyHeight),
dx = this._random(10) - 5,
dy = this._random(-2) - 1,
c1 = this._randomArray(this._color),
c2 = this._randomArray(this._color);
for (var i = 0; i < this._particlesPerExplosion; i++)
{
this._createParticle(
x,
y,
dx,
dy,
i / (this._particlesPerExplosion - 1) * 180 * Math.PI,
this._random(this._speed),
this._random(1) > .5 ? c1 : c2
);
}
window.setTimeout(
function() { return fireworks._addExplosion.apply(fireworks);},
this._random(this._interval[1] - this._interval[0]) + this._interval[0]
);
},
// creates a new particle
_createParticle: function(x, y, dx, dy, rot, speed, color)
{
var el = null,
foundEl = false,
p = this._particles;
// look for old particle
for (var i = 0, l = p.length; i < l; i++)
if (p[i].data.age > 1)
{
el = p[i];
foundEl = true;
break;
}
// create span child for particles
if (!foundEl)
{
el = document.createElement('div');
el.className = 'particle';
el.style.position = 'absolute';
el.style.fontSize = '20px';
el.style.zIndex = this._zIndex;
el.style.width = '10px';
el.style.overflow = 'hidden';
el.innerHTML = '●';
}
el.style.left = x + 'px';
el.style.top = y + 'px';
el.style.color = color;
el.data = {
x: x,
y: y,
dx: Math.cos(rot) * speed + dx,
dy: Math.sin(rot) * speed + dy,
color: color,
age: Math.random() * .25
};
if (!foundEl)
{
document.getElementsByTagName('body')[0].appendChild(el);
this._particles.push(el);
}
},
// move existing particles
_move: function()
{
requestAnimFrame(this._animFn);
// calculate movement factor
var dif = this._time() - this._lastInterval;
this._lastInterval = this._time();
var delta = dif / 20,
el,
d,
p = this._particles,
r = Math.pow(this._resistance, delta),
g = this._gravity * delta,
a = dif / this._maxAge;
for (var i = 0, l = p.length; i < l; i++)
{
el = p[i];
d = el.data;
if (d.age > 1)
continue;
d.age += a;
d.dy += g;
d.dx *= r;
d.dy *= r;
d.x += d.dx * delta;
d.y += d.dy * delta;
if (d.x < 0)
{
d.dx *= -1;
d.x = 0;
}
if (d.x > this._bodyWidth)
{
d.dx *= -1;
d.x = this._bodyWidth;
}
if (d.y < 0)
{
d.dy *= -1;
d.y = 0;
}
if (d.y > this._bodyHeight)
{
d.dy *= -1;
d.y = this._bodyHeight;
}
if (d.age > 1)
d.x = d.y = 0;
el.style.left = d.x + 'px';
el.style.top = d.y + 'px';
el.style.color = (Math.random() * .5 + d.age >= 1) ? 'transparent' : d.color;
el.style.fontSize = (1 - d.age) * 5 + 5 + 'px';
}
},
// calculate new positions for all particles
resize: function()
{
// get new width and height
this._bodyWidth = this._getWindowWidth() - 10;
this._bodyHeight = this._getWindowHeight() - 20;
},
// get window width
_getWindowWidth: function()
{
return document.getElementsByTagName('body')[0].offsetWidth;
},
// get window height
_getWindowHeight: function()
{
var h = Math.max(self.innerHeight || 0, window.innerHeight || 0);
if (document.documentElement)
h = Math.max(h, document.documentElement.clientHeight || 0);
if (document.body)
{
h = Math.max(h, document.body.clientHeight || 0);
h = Math.max(h, document.body.scrollHeight || 0);
h = Math.max(h, document.body.offsetHeight || 0);
}
return h;
}
};
// shim layer with setTimeout fallback
window.requestAnimFrame = (function(){
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function (cb){
window.setTimeout(cb, 1000 / 60);
};
})();
fireworks.init();