Простите за пиар, просто делать было нечего, а белкам не принято заниматься темже что и коты.
// ==UserScript==
// @name snow
// @namespace http://www.linux.org.ru/
// @description !=53 =0 ;>@5!
// @include http://www.linux.org.ru/*
// ==/UserScript==
function Sneg(args){
this.count = args.count || 100;
this.time = args.time || 100;
this.weigth = args.weigth || 1;
this.resist = args.resist || 2;
this.maxForce = args.force || 0.5;
//погода, содержит силу и направление ветра
this.weather = {
force: this.maxForce,
//угол направления
dest: Math.random()*Math.PI*2,
getForces: function(){
return {
x: Math.cos(this.dest) * this.force,
y: Math.sin(this.dest) * this.force
};
}
};
this.getDims = function(){
if(!this.dims){
this.dims = {
x: window.innerWidth / 2.0,
y: window.innerHeight / 2.0
};
}
return this.dims;
}
var Snejinka = function(parent){
this.reset = function(){
this.speed = {x:Math.random(),y:Math.random()} ;
var d = parent.getDims();
this.point = {
x: Math.random()*d.x*2 - d.x,
y: Math.random()*d.y*2 - d.y
};
}
this.move = function(p){
var d = parent.getDims();
this.node.style.top = d.y - p.y;
this.node.style.left = d.x + p.x;
}
this.repaint = function(){
var p = this.point;
var w = parent.weather.getForces();
var v = this.speed;
v.x = v.x + ( w.x * this.resist );
p.x = p.x + v.x ;
v.y = v.y + (w.y * this.resist);
p.y = p.y + v.y - this.weigth / this.resist;
this.move(this.point);
var d = parent.getDims();
if((v.y > 0 && (d.y - p.y) <= 0) || (v.y < 0 && (d.y + p.y) <= 0)){
p.y = -p.y;
}
if((v.x > 0 && (d.x - p.x) <= 0) || (v.x < 0 && (d.x + p.x) <= 0)){
p.x = -p.x;
}
}
//параметры
//вес
this.weigth = Math.random()*parent.weigth;
//парусность (воздушное сопротивление 8) )
this.resist = Math.random()*parent.resist;
// скорость
this.reset();
this.node = document.createElement("div");
this.node.appendChild(document.createTextNode("*"));
this.node.style.position = "fixed";
this.node.style.color = "#ffffff";
document.body.appendChild(this.node);
this.move(this.point);
}
this.snows = new Array();//массив снежинок, каждая имеет две координаты
//инициализация
for(var i = 0; i < this.count; i++){
this.snows[i] = new Snejinka(this);
}
this._repaint = function(){
for(var i = 0; i < this.count; i++){
this.snows[i].repaint();
}
}
var refresh = function(_this){
//TODO изменение ветра
var w = _this.weather;
w.force +=((w.force > _this.maxForce)?-1:1)*(Math.random()*w.force);
w.dest += Math.PI/2 - Math.random()*Math.PI/4;
if(w.dest > Math.PI*2){
w.dest -= Math.PI*2;
}
_this._repaint();
}
this.run = function(){
setInterval(refresh, this.time, this);
}
}
function init(){
var sneg = new Sneg({
count:250
});
sneg.run();
}
init();
>>> Просмотр (1024x768, 286 Kb)