220 lines
5.2 KiB
JavaScript
220 lines
5.2 KiB
JavaScript
|
(function () {
|
||
|
'use strict';
|
||
|
window.addEventListener('load', function () {
|
||
|
var canvas = document.getElementById('canvas');
|
||
|
|
||
|
if (!canvas || !canvas.getContext) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/********************
|
||
|
Random Number
|
||
|
********************/
|
||
|
|
||
|
function rand(min, max) {
|
||
|
return Math.floor(Math.random() * (max - min + 1) + min);
|
||
|
}
|
||
|
|
||
|
/********************
|
||
|
Var
|
||
|
********************/
|
||
|
|
||
|
var ctx = canvas.getContext('2d');
|
||
|
var X = canvas.width = window.innerWidth;
|
||
|
var Y = canvas.height = window.innerHeight;
|
||
|
var mouseX = X / 2;
|
||
|
var mouseY = Y / 2;
|
||
|
var shapes = [];
|
||
|
var shapeNum = Y / 4;
|
||
|
|
||
|
/********************
|
||
|
Animation
|
||
|
********************/
|
||
|
|
||
|
window.requestAnimationFrame =
|
||
|
window.requestAnimationFrame ||
|
||
|
window.mozRequestAnimationFrame ||
|
||
|
window.webkitRequestAnimationFrame ||
|
||
|
window.msRequestAnimationFrame ||
|
||
|
function(cb) {
|
||
|
setTimeout(cb, 17);
|
||
|
};
|
||
|
|
||
|
/********************
|
||
|
Shape
|
||
|
********************/
|
||
|
|
||
|
function Shape(ctx, x, y, i) {
|
||
|
this.ctx = ctx;
|
||
|
this.init(x, y, i);
|
||
|
}
|
||
|
|
||
|
Shape.prototype.init = function(x, y, i) {
|
||
|
this.x = x;
|
||
|
this.y = y;
|
||
|
this.i = i;
|
||
|
this.r = 2;
|
||
|
this.a = rand(0, 360);
|
||
|
this.rad = this.a * Math.PI / 180;
|
||
|
this.ga = Math.random() * Math.random() * Math.random();
|
||
|
this.inA = Math.random();
|
||
|
this.scaleX = 100 - i / 2;
|
||
|
this.dist = shapeNum - i;
|
||
|
};
|
||
|
|
||
|
Shape.prototype.draw = function() {
|
||
|
var ctx = this.ctx;
|
||
|
ctx.save();
|
||
|
ctx.fillStyle = 'white';
|
||
|
ctx.globalCompositeOperation = 'lighter';
|
||
|
ctx.globalAlpha = this.ga;
|
||
|
ctx.translate(Math.sin(this.rad) * this.dist + this.x, this.y);
|
||
|
ctx.scale(this.scaleX, 1);
|
||
|
ctx.translate(-Math.sin(this.rad) * this.dist - this.x, -this.y);
|
||
|
ctx.beginPath();
|
||
|
ctx.arc(Math.sin(this.rad) * this.dist + this.x, this.y, this.r, 0, Math.PI * 2, false);
|
||
|
ctx.fill();
|
||
|
ctx.restore();
|
||
|
};
|
||
|
|
||
|
Shape.prototype.updateParams = function() {
|
||
|
this.a += this.inA;
|
||
|
this.rad = this.a * Math.PI / 180;
|
||
|
};
|
||
|
|
||
|
Shape.prototype.render = function() {
|
||
|
this.updateParams();
|
||
|
this.draw();
|
||
|
};
|
||
|
|
||
|
for (var i = 0; i < shapeNum; i++) {
|
||
|
var s = new Shape(ctx, X / 2, Y - i * 1, i);
|
||
|
shapes.push(s);
|
||
|
}
|
||
|
|
||
|
/********************
|
||
|
Moon
|
||
|
********************/
|
||
|
|
||
|
var radius = 150;
|
||
|
|
||
|
if (X < 768) {
|
||
|
radius = 100;
|
||
|
}
|
||
|
|
||
|
function drawMoon() {
|
||
|
ctx.save();
|
||
|
ctx.beginPath();
|
||
|
ctx.fillStyle = 'white';
|
||
|
ctx.shadowColor = 'white';
|
||
|
ctx.shadowBlur = 100;
|
||
|
ctx.arc(X / 2, Y / 3, radius, 0, Math.PI * 2, false);
|
||
|
ctx.fill();
|
||
|
ctx.restore();
|
||
|
}
|
||
|
|
||
|
/********************
|
||
|
Kirakira
|
||
|
********************/
|
||
|
|
||
|
var particleNum = 500;
|
||
|
var particles = [];
|
||
|
|
||
|
function Particle(ctx, x, y) {
|
||
|
this.ctx = ctx;
|
||
|
this.init(x, y);
|
||
|
}
|
||
|
|
||
|
Particle.prototype.init = function(x, y) {
|
||
|
this.x = x;
|
||
|
this.y = y;
|
||
|
this.r = rand(5, 10);
|
||
|
this.ga = Math.random() * Math.random() * Math.random() * Math.random();
|
||
|
this.v = {
|
||
|
x: 0,
|
||
|
y: -Math.random() * Math.random()
|
||
|
};
|
||
|
this.l = rand(10, 50);
|
||
|
};
|
||
|
|
||
|
Particle.prototype.draw = function() {
|
||
|
var ctx = this.ctx;
|
||
|
ctx.save();
|
||
|
ctx.fillStyle = 'white';
|
||
|
ctx.globalCompositeOperation = 'lighter';
|
||
|
ctx.globalAlpha = this.ga;
|
||
|
ctx.beginPath();
|
||
|
ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2, false);
|
||
|
ctx.fill();
|
||
|
ctx.restore();
|
||
|
};
|
||
|
|
||
|
Particle.prototype.updateParams = function() {
|
||
|
this.a += this.inA;
|
||
|
this.rad = this.a * Math.PI / 180;
|
||
|
this.l -= 0.1;
|
||
|
if (this.l < 0) {
|
||
|
this.init(rand(0, X), rand(Y - Y / 4, Y));
|
||
|
}
|
||
|
};
|
||
|
|
||
|
Particle.prototype.updatePositon = function() {
|
||
|
this.y += this.v.y;
|
||
|
};
|
||
|
|
||
|
Particle.prototype.render = function() {
|
||
|
this.updatePositon();
|
||
|
this.updateParams();
|
||
|
this.draw();
|
||
|
};
|
||
|
|
||
|
for (var i = 0; i < particleNum; i++) {
|
||
|
var p = new Particle(ctx, rand(0, X), rand(Y - Y / 4, Y));
|
||
|
particles.push(p);
|
||
|
}
|
||
|
|
||
|
/********************
|
||
|
Render
|
||
|
********************/
|
||
|
|
||
|
function render() {
|
||
|
ctx.clearRect(0, 0, X, Y);
|
||
|
drawMoon();
|
||
|
for (var i = 0; i < shapes.length; i++) {
|
||
|
shapes[i].render(i);
|
||
|
}
|
||
|
for (var i = 0; i < particles.length; i++) {
|
||
|
particles[i].render(i);
|
||
|
}
|
||
|
requestAnimationFrame(render);
|
||
|
}
|
||
|
|
||
|
render();
|
||
|
|
||
|
/********************
|
||
|
Event
|
||
|
********************/
|
||
|
|
||
|
function onResize() {
|
||
|
X = canvas.width = window.innerWidth;
|
||
|
Y = canvas.height = window.innerHeight;
|
||
|
shapes = [];
|
||
|
if (X < 768) {
|
||
|
radius = 100;
|
||
|
} else {
|
||
|
radius = 150;
|
||
|
}
|
||
|
for (var i = 0; i < shapeNum; i++) {
|
||
|
var s = new Shape(ctx, X / 2, Y - i * 1, i);
|
||
|
shapes.push(s);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
window.addEventListener('resize', function() {
|
||
|
onResize();
|
||
|
});
|
||
|
|
||
|
});
|
||
|
// Author
|
||
|
console.log('File Name / moonRiver.js\nCreated Date / July 10, 2020\nAuthor / Toshiya Marukubo\nTwitter / https://twitter.com/toshiyamarukubo');
|
||
|
})();
|