导航

萌即是正义!时不时分享一些ACG活动记录与有趣代码的小站!

侧边栏
最新评论
广树管理员
2026-08-22 17:46
@Ringnee:很大的雷阵雨,其实上次也不是台风哦。
Ringnee
2026-08-22 17:45
又刮台风了吗
广树管理员
2026-08-22 17:02
@Zrzzz:抽了几十张卡才抽到满意的图片,嘻嘻
Zrzzz
2026-08-22 17:01
场景连贯性好强
广树管理员
2026-08-22 16:55
@RQ_东流水:这些就是照片呀!
攻略中
空之轨迹 the 1st
暂无评分
Steam空之轨迹 the 1st
2026年8月02日 12时 ~ 攻略中
已累计游玩3周
因父亲卡西乌斯失踪而踏上旅程的艾丝蒂尔与约书亚, 在巡游利贝尔王国的过程中, 经历了无数与未知同伴的相遇与别离, 而在旅途终点等待着两人的,究竟会是什么……?
节奏天国 奇迹之星
暂无评分
NS节奏天国 奇迹之星
2026年7月08日 20时 ~ 攻略中
已累计游玩1个月16天
《节奏天国:奇迹之星》是一款轻松又充满创意的音乐节奏游戏,玩家只需跟随音乐节拍按下按键,就能完成跳跃、敲击空罐、制作料理等各种有趣的小挑战。游戏延续了《节奏天国》系列简单易上手、节奏感强、画风幽默的特点,让玩家在一个个短小精巧的关卡中感受音乐与反应力结合的乐趣,适合喜欢节奏游戏和轻松休闲玩法的玩家体验。
告别回忆 -无垢少女- 致最爱的你
暂无评分
Steam告别回忆 -无垢少女- 致最爱的你
2026年6月24日 20时 ~ 攻略中
已累计游玩2个月
系列作发售至今经历了19年,做为其系列最终作的《告别回忆 ~无垢少女~》(以下略称为本篇)在2018年3月发售。本次的FanDisc和至今的系列作相同,带给玩家在各结局后的短篇故事。请充分享受和各个女主角们在欢乐结局后的幸福时光。
亚路塔:狐狸狐途的面包冒险
暂无评分
Steam亚路塔:狐狸狐途的面包冒险
2026年2月12日 19时 ~ 攻略中
已累计游玩6个月12天
一场席卷全世界的面包革命现在开始! 主人公查雅阴错阳差之下,开始了在荒废的岛屿上经营面包店的生活。 出外冒险搜集食材、研发崭新面包配方、遇见性格各异的伙伴们,建造更丰富的设施,用面包香气使无人问津的广场再次热闹起来!
fault - StP - LIGHTKRAVTE
暂无评分
Steamfault - StP - LIGHTKRAVTE
2025年5月29日 20时 ~ 攻略中
已累计游玩1年2个月
全球累计销量超过50万份的“fault”系列最新作!故事的舞台是一个融合了奇幻与科幻的超前世界——卢森海德王国。本作讲述了生活在此地的一个平凡又平庸的究极普通市民——名为果子的少年的故事。
PSN奖杯卡

PSN奖杯卡

归档
赞助商广告

用canvas描绘容器注水的效果(如果没灌满会有波浪效果)

2018-02-02 16:19:02
JavaScript

其实原理就是控制正弦波的幅度。

CSS:

html, body {
  height: 100%;
  text-align: center;
  background-color: #323436;
}

canvas#sineCanvas {
  width:500px;
  height:500px;
  overflow:hidden;
  background:#5b5d5e;
}

HTML:

<div id="canvas-container">
    <canvas id="sineCanvas"></canvas>
</div>

JS:

(function () {

var unit = 100,
    canvas, context, canvas2, context2,
    height, width, xAxis, yAxis,
    draw;
var percentMax = 0.6;//液体占容器的百分比
var percentMin = 0;
var maxHeight = 1;
if(percentMax>=1){
	maxHeight = 0.95;
}
var wavePower = 3;
//初始化
function init() {
	window.requestAnimFrame = (function(){
	  return  window.requestAnimationFrame       ||
			  window.webkitRequestAnimationFrame ||
			  window.mozRequestAnimationFrame    ||
			  function( callback ){
				window.setTimeout(callback, 1000/60);
			  };
	})();
    
    canvas = document.getElementById("sineCanvas");
    
    canvas.width = 1000; 
    canvas.height = 1000;
    
    context = canvas.getContext("2d");
    
    height = canvas.height;
    width = canvas.width;
    yAxis = 0;
    
    draw();
	
}
function draw() {
    
    // 清理canvas画板
    context.clearRect(0, 0, width, height);

    //描绘波浪
    drawWave(['#cea155','#e8c183'], 1, 1.5);
	
	if(percentMin<=percentMax){
    	percentMin = percentMin+0.002;
    	xAxis = Math.floor(height*(maxHeight-percentMin));
    }
    if(percentMin>0.80){
    	if(wavePower<=36*percentMax){
        	wavePower = wavePower+0.05
        }
    }
    
    // 更新时间然后重新绘制
    draw.seconds = draw.seconds + .009;
    draw.t = draw.seconds*Math.PI;
    window.requestAnimFrame(draw);
};
draw.seconds = 0;
draw.t = 0;

/**
* 描绘波浪
* drawWave([渐变左侧颜色,右侧颜色], 不透明度, 波浪的幅度)
*/
function drawWave(color, alpha, zoom) {
    context.globalAlpha = alpha;
	var linearGrad = context.createLinearGradient(0, 0, width, 0);
	linearGrad.addColorStop(0.0, color[0]);  
    linearGrad.addColorStop(1.0, color[1]); 
	context.fillStyle = linearGrad;
	
    context.beginPath(); //开始路径
    drawSine(draw.t / 0.5, zoom);
    context.lineTo(width + 10, height); //路径朝canvas右下
    context.lineTo(0, height); //路径朝canvas左下
    context.closePath() //封闭路径
    context.fill(); //涂色
}

/**
 * 画正弦
 * drawSine(时间, 波浪的浮动)
 */
function drawSine(t, zoom) {

    var x = t; //将时间转换为x轴
    var y = Math.sin(x)/zoom;
    context.moveTo(yAxis, unit*y+xAxis); //在开始位置放置路径
    
    // 绘制波浪、横向幅度 
    for (var i = yAxis; i <= width + 10; i += 10) {
        x = t+(-yAxis+i)/unit/zoom;
        y = Math.sin(x - 0)/wavePower;
        context.lineTo(i, unit*y+xAxis);
    }
}

init();
    
})();


收款.png


file_000000008460720687635c008459256b.png