Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.06.2021, 17:20
Аспирант
Отправить личное сообщение для Olga27 Посмотреть профиль Найти все сообщения от Olga27
 
Регистрация: 10.06.2021
Сообщений: 49

Как сделать анимацию волн при этом чтобы каждый квадрат также анимировался?
Пытаюсь сделать анимацию волн со слоями, с помощью математических функций. Мне удалось сделать два примера.
Вот пример 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, 10.06.2021 в 17:26.
Ответить с цитированием
  #2 (permalink)  
Старый 10.06.2021, 17:48
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Olga27,
строка 132 пример 2
spr.y += (Math.sin(currAngle) * distance/2);
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать, чтобы анимация числа работала не только при активном окне? Lefseq Общие вопросы Javascript 4 07.03.2020 09:53
Как сделать чтобы слайдер появлялся при клике на картинку? Shinjiru Элементы интерфейса 1 04.11.2013 14:57
Как сделать так, чтобы JS при нажатии на кнопку не выполняла запрос со страницы. JSProgrammer Элементы интерфейса 3 18.05.2010 20:18
Как сделать, чтобы музыка <embed> на странице не играла только при первом посещении? Bad Request Общие вопросы Javascript 22 27.07.2009 19:44
Как сделать, чтобы 2 ссылки отображались как hover при наведении мышкой на любую? Ava Элементы интерфейса 5 19.05.2009 23:24