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();

