* 2017.7.24
* author:acdSeen
* */
(function(window,factory){
if(typeof define === "function" && define.amd){
define(factory);
}else if(typeof module === "object" && module.exports){
module.exports = factory();
}else{
window.WaterPolo = factory();
}
}(typeof window !== "undefined" ? window : this, function(selector,userOptions){
var WaterPolo=function(selector,userOptions){
'user strict';
userOptions=userOptions||{};
var options={
wrapW:3,
cW:300,
cH:300,
lineWidth : 2,
baseY: 20,
nowRange: 0,
lineColor:'rgb(176,204,53)',
oneColor:'rgba(176,204,53,.6)',
twoColor:'rgba(176,204,53,.4)',
oneWaveWidth:0.06,
twoWaveWidth:0.06,
oneWaveHeight:4,
twoWaveHeight:4,
oneOffsetX:10,
twoOffsetX:20,
speed:0.2
};
var canvas = null,
ctx = null,
W = null,
H = null;
Object.defineProperty(this, 'options', {
get: function() {
return options;
},
set: function(value) {
mergeOption(value,options);
}
});
var mergeOption=function(userOptions,options){
Object.keys(userOptions).forEach(function(key){
options[key]=userOptions[key];
})
};
var makeLiquaid=function(ctx,xOffset,waveWidth,waveHeight,color){
ctx.save();
var points = [];
ctx.beginPath();
for (var x = 0; x < options.cW; x += 20 / options.cW) {
var y = -Math.sin(x * waveWidth + xOffset);
var dY = options.cH * (1 - options.nowRange / 100);
points.push([x, dY + y * waveHeight]);
ctx.lineTo(x, dY + y * waveHeight);
}
ctx.lineTo(options.cW, options.cH);
ctx.lineTo(0, options.cH);
ctx.lineTo(points[0][0], points[0][1]);
ctx.fillStyle = color;
ctx.fill();
ctx.restore();
};
var init=function(){
mergeOption(userOptions,options);
canvas=document.getElementById(selector);
ctx=canvas.getContext('2d');
canvas.width=options.cW;
canvas.height=options.cH;
ctx.lineWidth=options.lineWidth;
var r = options.cH / 2;
var cR = r - 6;
var drawCircle = function(ctx){
ctx.beginPath();
ctx.strokeStyle = options.lineColor;
ctx.arc(r, r, cR+options.wrapW, 0, 2 * Math.PI);
ctx.stroke();
ctx.beginPath();
ctx.arc(r, r, cR, 0, 2 * Math.PI);
ctx.clip();
};
drawCircle(ctx);
(function drawFrame(){
window.requestAnimationFrame(drawFrame);
ctx.clearRect(0, 0, options.cW, options.cH);
if (options.nowRange <= options.baseY) {
var tmp = 1;
options.nowRange += tmp;
}
if (options.nowRange > options.baseY) {
var tmp = 1;
options.nowRange -= tmp;
}
makeLiquaid(ctx,options.oneOffsetX,options.oneWaveWidth,options.oneWaveHeight,options.oneColor);
makeLiquaid(ctx,options.twoOffsetX,options.twoWaveWidth,options.twoWaveHeight,options.twoColor);
options.oneOffsetX+=options.speed;
options.twoOffsetX+=options.speed;
}());
};
init();
};
return WaterPolo;
}));