Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.05.2021, 16:09
Кандидат Javascript-наук
Отправить личное сообщение для Katy93 Посмотреть профиль Найти все сообщения от Katy93
 
Регистрация: 28.12.2018
Сообщений: 138

Как сделать перемещения объектов используя функцию ослабления?
Делаю перемещение объектов с эффектом волн. Четыре объекта перемещается вниз и вверх. Чтобы получился эффект волны я установила интервал по "y" каждого объекта на +10 пикселей. Мне нужно чтобы они перемещались используя функцию ослабление (замедление), однако когда они достигаю нижней планки, то сразу перемещаются вверх. Для теста решила над одним объектом сделать функцию ослабление, в итоге объект прыгает по канвасу и улетает за границу. Как сделать перемещение с эффектом ослабления, разумеется, чтобы они перемещались волнами?
Код:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>HTML 5 Canvas</title>
     <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/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)
{
  
  this.x = x;
  this.y = y;
  this.width = w;
  this.height = h;
 
  
  this.draw = function(ctx)
  {
      ctx.fillStyle = "#000";
      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 rect1 = new Rectangle(15,15,50,40);
var rect2 = new Rectangle(75, 25, 50, 40);
var rect3 = new Rectangle(135, 35, 50, 40);
var rect4 = new Rectangle(195, 45, 50, 40);
var movement1 =-2;
var movement2 =-2;
var movement3 =-2;
var movement4 =-2;
  
var startTime = new Date();
  var time = new Date() - startTime;
  var   changeY = 100 - rect1.y;
 
setInterval(function()
{
        var time = new Date() - startTime;
    context.clearRect(0, 0, canvas.width, canvas.height);
    
    
     rect1.y += movement1;
     rect2.y += movement2;
     rect3.y += movement3;
     rect4.y += movement4;
     if(rect1.y >= 70 || rect1.y < 15)
     {
         rect1.y = easeInOutQuad(time, rect1.y, changeY, 1000);
     }
           
    
     if(rect2.y >= 70 || rect2.y < 15)  
          movement2 *= -1;
    if(rect3.y >= 70 || rect3.y < 15)   
          movement3 *= -1;
     if(rect4.y >= 70 || rect4.y < 15)  
          movement4 *= -1;
    rect1.draw(context);
    rect2.draw(context);
        rect3.draw(context);
        rect4.draw(context);
},33);
 
    function linearTween(t, b, c, d) {
        return c * t / d + b;
    }
 
    
    function easeInQuad(t, b, c, d) {
        return c*(t/=d)*t + b;
    };
 
    
    function easeOutQuad(t, b, c, d) {
        return -c *(t/=d)*(t-2) + b;
    };
  
  function easeInOutQuad(t, b, c, d) {
        if ((t/=d/2) < 1) return c/2*t*t + b;
        return -c/2 * ((--t)*(t-2) - 1) + b;
    };
</script>

</body>
</html>

Последний раз редактировалось Katy93, 29.05.2021 в 16:44.
Ответить с цитированием
  #2 (permalink)  
Старый 29.05.2021, 16:21
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Katy93,
делайте макет целиком, а не кусками.
Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
Ответить с цитированием
  #3 (permalink)  
Старый 29.05.2021, 16:47
Кандидат Javascript-наук
Отправить личное сообщение для Katy93 Посмотреть профиль Найти все сообщения от Katy93
 
Регистрация: 28.12.2018
Сообщений: 138

Все отформатировала текст, теперь можно запустить кнопкой "Посмотреть". Как сделать функцию ослабления, при этом чтобы остался эффект волны?
Ответить с цитированием
  #4 (permalink)  
Старый 29.05.2021, 18:30
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

canvas wave волна
Katy93,
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>HTML 5 Canvas</title>
    <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) {
            this.x = x;
            this.y = y;
            this.yy = y;
            this.width = w;
            this.height = h;
            this.to = [205, 15];
            this.draw = function(ctx) {
                ctx.fillStyle = "#000";
                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");
        function anim(a) {
            function e(b) {
                context.clearRect(a.x, a.y, a.width, a.height)
                var k = .03;
                a.yy += (a.to[0] - a.yy) * k;
                a.y = Math.trunc(a.yy)
                a.draw(context);
                if (Math.abs(a.yy - a.to[0]) < .5) {
                    a.to.reverse();
                    anim(a)
                } else requestAnimationFrame(e)
            }
            requestAnimationFrame(e)
        }
        for (var i = 0; i < 10; i++) {
            var rect = new Rectangle(15 + i * 52, 45 + (Math.cos(i) * 70 | 0), 50, 40)
            anim(rect)
        }
    </script>
</body>
</html>

Последний раз редактировалось рони, 29.05.2021 в 18:33.
Ответить с цитированием
  #5 (permalink)  
Старый 29.05.2021, 19:33
Кандидат Javascript-наук
Отправить личное сообщение для Katy93 Посмотреть профиль Найти все сообщения от Katy93
 
Регистрация: 28.12.2018
Сообщений: 138

Мне не нужно выбирать из середины, перемещение должно происходить с первой квадрата по последний по очереди делая эффект волны.
Примерно вот так, выполнено с помощью TweenLite, только проблема в коде заключается в том что происходит выстраивание в линию, а потом продолжается движение. В моем случае движение должно происходить постоянно как только достиг нижней или верхней границы, тут же отправляется дальше движение без выстраивания в линию. Как это можно сделать?
<!DOCTYPE HTML>
<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Tween</title>
    
      <script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/gsap/1.17.0/TweenLite.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/gsap/1.17.0/plugins/CSSPlugin.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/gsap/1.17.0/easing/EasePack.min.js'></script>  
  
</head>
    <body>

 		<canvas id="canvas" width="670" height="500" style="background-color:#eee; border:1px solid #ccc;"></canvas>
<script>
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');

var canvas = document.getElementById('canvas');

var x = 50;
var y = 50;


Rectangle = function(x,y,width,height)
{
  this.x = x;
  this.y = y;
  this.width = width;
  this.height = height;
  this.draw = function(ctx)
  {
    ctx.beginPath();
    ctx.fillRect(this.x, this.y, this.width, this.height);
  }
}
var rect1;
var rect2;
var rect3;
var rect4;
var obj;
function animate() {
   ctx.clearRect(0,0,canvas.width,canvas.height);
   rect1.draw(ctx);
   rect2.draw(ctx);
   rect3.draw(ctx);
   rect4.draw(ctx);
   requestAnimationFrame(animate);
}


function init()
{
 rect1 = new Rectangle(50,50,20,40);
 rect2 = new Rectangle(80,70,20,40);
 rect3 = new Rectangle(110,90,20,40);
 rect4 = new Rectangle(140,110,20,40);
}

init();
animate();

 tweenSquare(rect1);
 tweenSquare2(rect2);
 tweenSquare3(rect3);
 tweenSquare4(rect4);
 
function tweenSquare(s) {    
  TweenLite.to(s, 2, {y:250, ease: Cubic.easeInOut,delay:0.4, onComplete: function() {
    TweenLite.to(s, 2, {y:50, ease: Cubic.easeInOut, onComplete: function() {
      tweenSquare(s);
    }})
  }});

}

function tweenSquare2(s) {
  TweenLite.to(s, 2, {y:250, ease: Cubic.easeInOut,delay:0.3,onComplete: function() {
    TweenLite.to(s, 2, {y:50, ease: Cubic.easeInOut,onComplete: function() {
      tweenSquare(s);
    }})
  }});
}
function tweenSquare3(s) { 
  TweenLite.to(s, 2, {y:250, ease: Cubic.easeInOut,delay:0.2,onComplete: function() {
    TweenLite.to(s, 2, {y:50, ease: Cubic.easeInOut, onComplete: function() {
      tweenSquare(s);
    }})
  }});
}
function tweenSquare4(s) {
  TweenLite.to(s, 2, {y:250, ease: Cubic.easeInOut,delay:0.1, onComplete: function() {
    TweenLite.to(s, 2, {y:50, ease: Cubic.easeInOut, onComplete: function() {
      tweenSquare(s);
    }})
  }}); 
}
function start(){
  console.log('start');
}

function update(){
  console.log('animating');
}

function complete(){
  console.log('end');
}

</script>  
</body>
</html>
Ответить с цитированием
  #6 (permalink)  
Старый 29.05.2021, 19:56
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Katy93,
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>HTML 5 Canvas</title>
    <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) {
            this.x = x;
            this.y = y;
            this.yy = y;
            this.width = w;
            this.height = h;
            this.to = [205, 15];
            this.draw = function(ctx) {
                ctx.fillStyle = "#000";
                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");
        function anim(a) {
            function e(b) {
                context.clearRect(a.x, a.y, a.width, a.height)
                var k = .03;
                a.yy += (a.to[0] - a.yy) * k;
                a.y = Math.trunc(a.yy)
                a.draw(context);
                if (Math.abs(a.yy - a.to[0]) < .05) {
                    a.to.reverse();
                    anim(a)
                } else requestAnimationFrame(e)
            }
            requestAnimationFrame(e)
        }
        for (var i = 0; i < 10; i++) {
            let rect = new Rectangle(50 + i * 30, 50, 20, 40);
            window.setTimeout(_ => anim(rect), i * 100)

        }
    </script>
</body>
</html>
Ответить с цитированием
  #7 (permalink)  
Старый 29.05.2021, 20:55
Кандидат Javascript-наук
Отправить личное сообщение для Katy93 Посмотреть профиль Найти все сообщения от Katy93
 
Регистрация: 28.12.2018
Сообщений: 138

Хорошо получилось, только вот объекты выстраиваются в линию. Нельзя ли сделать, так чтобы они сразу стартовали когда они достигнут конечной оси координат по y. Мне удалось, это сделать с помощью TweenLite, но хотелось бы увидеть анимацию, без этой библиотеке. Мой вариант TweenLite.
<!DOCTYPE HTML>
<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Tween</title>
    
      <script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/gsap/1.17.0/TweenLite.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/gsap/1.17.0/plugins/CSSPlugin.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/gsap/1.17.0/easing/EasePack.min.js'></script>  
  
</head>
    <body>

 		<canvas id="canvas" width="670" height="500" style="background-color:#eee; border:1px solid #ccc;"></canvas>
<script>
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');

var canvas = document.getElementById('canvas');

var x = 50;
var y = 50;


Rectangle = function(x,y,width,height)
{
  this.x = x;
  this.y = y;
  this.width = width;
  this.height = height;
  this.draw = function(ctx)
  {
    ctx.beginPath();
    ctx.fillRect(this.x, this.y, this.width, this.height);
  }
}
var rects;
var obj;
function animate() {
   ctx.clearRect(0,0,canvas.width,canvas.height);
  
   draw();
   requestAnimationFrame(animate);
}
var rects = [];
function init()
{
 for(var i=0; i < 20; i++)
 {
   rect = new Rectangle(50+i*30,70,20,40);
   rects.push(rect);
 }
}
function draw()
{
  for(var i=0; i < rects.length; i++)
   {
         rects[i].draw(ctx);
   }
}
init();
animate();

for(var i = rects.length-1; i >=0; i--)
{
  console.log(rects[i]);
 tweenSquare(rects[i],i);
 
}

 
function tweenSquare(s,i) {  
  
  TweenLite.to(s, 1+i*0.1, {y:100, ease: Cubic.easeInOutCubic,delay:0.1+i*0.1, onComplete: function() {
    TweenLite.to(s, 1+i*0.1, {y:50, ease: Cubic.easeInOutCubic, onComplete: function() {
      tweenSquare(s,0.1+i*0.1);
    }})
  }});
}
</script>  
</body>
</html>
Ответить с цитированием
  #8 (permalink)  
Старый 29.05.2021, 22:21
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Katy93,
пока без вариантов, может гугла расспросить?
Ответить с цитированием
  #9 (permalink)  
Старый 31.05.2021, 04:58
Кандидат Javascript-наук
Отправить личное сообщение для Katy93 Посмотреть профиль Найти все сообщения от Katy93
 
Регистрация: 28.12.2018
Сообщений: 138

Мне удалось добиться своего, только вот проблема не могу исправить скролинг текста, он почему-то все время уезжает за пределами экрана и появляется с другой стороны, а должен оставаться на месте, нужно сохранить
эффект волн, но чтобы текст оставался на месте. Я понимаю что дело в стиле left, но не знаю как исправить может кто подскажет? Вот рабочий код.
<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
	<title>Text Wave</title>
	<style type="text/css">
	.letter {
		font-family: sans-serif;
		font-size: 40px;
		font-weight: bold;
		position: absolute;
		top: -100px; 
		left: 0px;
	}
	</style>
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js" type="text/javascript" charset="utf-8"></script>
	<script type="text/javascript">
	$(document).ready(function() {
	  const width = $(window).width();
    const letterSpacing = 35; 
    var startTime = new Date().getTime();
    const waveText = 'Мой текст';
  
		var elements = $('#elements');
		for (i = 0; i < waveText.length; i++) {
			$('<div>', {
				html: waveText[i]
			})
			.addClass('letter')
			.appendTo(elements);
		}
    
    
		
		function runWave() {
      
      var elapsed = new Date().getTime() - startTime;
		   
      
       var pos = elapsed * 0.05;
			
			$('div.letter').each(function(index, letter) {
      
				var posx = ((pos + letterSpacing * index) % width);
        
        var posy = 100 + Math.sin(posx / 50) * 20;
				$(letter).css('left', posx + 'px');
				$(letter).css('top', posy + 'px');
			});
		}
		
		setInterval(runWave, 30);
	});
	</script>
</head>
<body>
	<div id="elements"></div>
</body>
</html>

Последний раз редактировалось Katy93, 31.05.2021 в 05:06.
Ответить с цитированием
  #10 (permalink)  
Старый 31.05.2021, 07:59
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Сообщение от Katy93
чтобы текст оставался на месте.
Скрипт для эффекта волны
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать одну функцию с циклом alma95 Общие вопросы Javascript 5 16.08.2015 09:40
Как сделать, чтобы фабрика возвращала функцию? Splik Общие вопросы Javascript 10 17.06.2015 17:25
Как сделать что бы картинки с другого url отображались как свои zlodey Серверные языки и технологии 1 04.05.2015 21:30
Как сделать именованую функцию, запускающуюся при объявлении? Shitbox2 Общие вопросы Javascript 18 09.12.2012 15:45
Как найти точки соприкосновения двух объектов в RaphaelJS Fatalityap Библиотеки/Тулкиты/Фреймворки 3 03.08.2012 16:33