Как сделать анимацию волн при этом чтобы каждый квадрат также анимировался?
Пытаюсь сделать анимацию волн со слоями, с помощью математических функций. Мне удалось сделать два примера.
Вот пример 1. <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>HTML 5 Canvas</title> <script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script> <style type="text/css"> html, body { margin: 0px; } canvas { display: block; position: absolute; top: 0px; left: 0px; } </style> </head> <body> <canvas id="canvas"> Your browser does not support HTML5 canvas. If you would like to view, please update your browser. </canvas> <script> Rectangle = function(x, y, w, h,color) { this.x = x; this.y = y; this.width = w; this.height = h; this.color = color; this.draw = function(ctx) { ctx.fillStyle = this.color; ctx.fillRect(this.x, this.y, this.width, this.height); } } var canvas = document.getElementById("canvas"); canvas.width = window.innerWidth; canvas.height = window.innerHeight; var context = canvas.getContext("2d"); var rect; var targetY = 100; var duration = 1000; var posX = 120; var posY = 50; var angle=0; var angleStep=30; var angleSpeed=2; var distance = 60; var waveHolder = []; function init() { var colors=["#FF0000", "#FF6600", "#FFFF00", "#00FF00", "#00FFFF", "#0000FF", "#FF00FF", "#FF0066"]; waveHolder = []; var spr; for (var i = 0; i < colors.length; i++) { waveHolder.push(spr = addContent(colors[i])); } angle = 0; angleStep = 30; angleSpeed = 8; distance = 60; update(); } function addContent(color) { var rect = []; for (var i = 0; i < 5; i++) { rect[i] = new Rectangle(i * 35, 30, 30,30,color); rect[i].draw(context); } return rect; } init(); var spr = []; function update() { context.clearRect(0, 0, canvas.width, canvas.height); var currAngle; for (var i = 0; i < waveHolder.length; i++) { for(var j = 0; j < 5; j++) { spr = waveHolder[i][j]; currAngle = (angle+angleStep * i) * Math.PI / 180; spr.x = posX+(j*35 - i * 5); spr.y = posY+(Math.sin(currAngle) * distance); spr.draw(context); } } angle+= angleSpeed; angle %= 360; requestAnimationFrame(update); } </script> </body> </html> Вот пример 2. <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>HTML 5 Canvas</title> <script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script> <style type="text/css"> html, body { margin: 0px; } canvas { display: block; position: absolute; top: 0px; left: 0px; } </style> </head> <body> <canvas id="canvas"> Your browser does not support HTML5 canvas. If you would like to view, please update your browser. </canvas> <script> Rectangle = function(x, y, w, h,color) { this.x = x; this.y = y; this.width = w; this.height = h; this.color = color; this.draw = function(ctx) { ctx.fillStyle = this.color; ctx.fillRect(this.x, this.y, this.width, this.height); } } var canvas = document.getElementById("canvas"); canvas.width = window.innerWidth; canvas.height = window.innerHeight; var context = canvas.getContext("2d"); var rect; var targetY = 100; var duration = 1000; var posX = 120; var posY = -70; var angle=0; var angleStep=30; var angleSpeed=2; var distance = 60; var waveHolder = []; var startTime = new Date().getTime(); const letterSpacing = 35; function init() { var colors=["#FF0000", "#FF6600", "#FFFF00", "#00FF00", "#00FFFF", "#0000FF", "#FF00FF", "#FF0066"]; waveHolder = []; var spr; for (var i = 0; i < colors.length; i++) { waveHolder.push(spr = addContent(colors[i])); } angle = 0; angleStep = 30; angleSpeed = 8; distance = 60; update(); } function addContent(color) { var rect = []; for (var i = 0; i < 5; i++) { rect[i] = new Rectangle(i * 35, 30, 30,30,color); rect[i].draw(context); } return rect; } init(); var spr = []; function update() { context.clearRect(0, 0, canvas.width, canvas.height); var currAngle; var elapsed = new Date().getTime() - startTime; var pos = elapsed * 0.2; for (var i = 0; i < waveHolder.length; i++) { for(var j = 0; j < 5; j++) { spr = waveHolder[i][j]; var posx = pos + letterSpacing * j; var posy2 = 100 + Math.sin(posx / 50) * 20; currAngle = (angle+angleStep * i) * Math.PI / 180; spr.x = posX+(j*35 - i * 5); spr.y = posY + (35 + i * 5)+(posy2); //posY + posy2; //posY+(Math.sin(currAngle) * distance); spr.draw(context); } } angle+= angleSpeed; angle %= 360; requestAnimationFrame(update); } </script> </body> </html> Как сделать анимацию волн при этом чтобы для каждого квадрата тоже происходила анимация из восьми дубликатов (сверху вниз)? То есть, чтобы один ряд (с дубликатами разных цветов) был привязан конкретно к квадрату и для него помимо горизонтальной волны происходила еще и вертикальное перемещение (как в примере 1). P.S. Оба примера можно запустить, кнопкой "выполнить". |
Olga27,
строка 132 пример 2 spr.y += (Math.sin(currAngle) * distance/2); |
Часовой пояс GMT +3, время: 07:47. |