Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.08.2017, 19:58
Новичок на форуме
Отправить личное сообщение для magistr4815 Посмотреть профиль Найти все сообщения от magistr4815
 
Регистрация: 23.08.2017
Сообщений: 6

Вращение объекта по кликам
Добрый день.
Потихоньку ковыряю JS и JQ, вообщем, хочу прописать скрипт, который раскручивает квадрат(или иной объект) в зависимости от кликов. Т.е. пользователь нажимает 1 раз на объект - он прокручивается на пол оборота и стоит. Но если пол-ль жмет постоянно, то объект начинает ускоряться и следовательно делает уже больше чем пол оборота, и ускорение возрастает от количество кликов в 5 секунд или в 1 секунду.

Ковырял и css с анимацией,но keyframes как я понял изменять в JS нельзя. Просто transform: rotate(Xdeg) - не анимированно, просто моментально повернул и все. Вообще долго искал что-то логично и думал над алгоритмом. Пришел к тому что, нужно кол-во кликов в секунду связать с оборотами в секунду ... но через что дальше делать ? анимация? или как?
Короче, есть ли у кого то, какие то соображения или мысли вообще по алгоритму ?
Заранее благодарен.
Ответить с цитированием
  #2 (permalink)  
Старый 23.08.2017, 22:01
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

magistr4815,
дополненный вариант https://toster.ru/q/261206
кликать по жёлтому блоку, для ускорения вращения
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    body{
      background: #202020;
    }

    div.rect {
      width: 150px;
      height: 150px;

      background: yellow;
    }
  </style>
</head>
<body>
  <div class="rect" id="rotate-rect"></div>
  <script>
    var rect = document.getElementById('rotate-rect');
    var a = 1, b = 0, c = 0, d = 1, tx = 100, ty = 100, angle = 0, currentAngle;
    var n = 3;
    function getAngleToRAD(){
      angle += n;
      if(angle >= 360){
        angle -= 360;
      }

      return angle * Math.PI / 180;
    }


    function update(){
      currentAngle = getAngleToRAD();

      rect.style.transform = 'matrix(' + Math.cos(currentAngle) + ',' + Math.sin(currentAngle) + ',' + -Math.sin(currentAngle) + ',' + Math.cos(currentAngle) + ',' + tx + ',' + tx + ')'
      window.requestAnimationFrame(update);
    }

            document.querySelector('.rect').addEventListener('click', function() {
               n += 3
            });

    update();
  </script>
</body>
</html>
Ответить с цитированием
  #3 (permalink)  
Старый 14.09.2017, 19:33
Новичок на форуме
Отправить личное сообщение для magistr4815 Посмотреть профиль Найти все сообщения от magistr4815
 
Регистрация: 23.08.2017
Сообщений: 6

Спасибо!
Ответить с цитированием
  #4 (permalink)  
Старый 15.09.2017, 13:38
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Что-то скучно стало...
Можно кликать и даблкликать.
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    body{
      background: #202020;
    }

    div.rect {
      width: 150px;
      height: 150px;

      background: yellow;
    }
  </style>
</head>
<body>
  <div class="rect" id="rotate-rect"></div>
  <script>
    var rect = document.getElementById('rotate-rect');
    var a = 1, b = 0, c = 0, d = 1, tx = 100, ty = 100, angle = 0, currentAngle;
    var prev = new Date();
    var n = 0;
    function getAngleToRAD(){
      angle += n;
      if(angle >= 360){
        angle -= 360;
      }

      return angle * Math.PI / 180;
    }


    function update(){
      currentAngle = getAngleToRAD();

      rect.style.transform = 'matrix(' + Math.cos(currentAngle) + ',' + Math.sin(currentAngle) + ',' + -Math.sin(currentAngle) + ',' + Math.cos(currentAngle) + ',' + tx + ',' + tx + ')'
      window.requestAnimationFrame(update);
    }

            document.querySelector('.rect').addEventListener('click', function() {
             var current = new Date(),
                     delta = current - prev;
              prev = current;
              if(delta < 1000)   return false; 
               n += 3
            });
            document.querySelector('.rect').addEventListener('dblclick', function() {
             var current = new Date();
             prev = current;
             n -= 6
            });

    update();
  </script>
</body>
</html>

Последний раз редактировалось Dilettante_Pro, 15.09.2017 в 13:40.
Ответить с цитированием
  #5 (permalink)  
Старый 15.09.2017, 14:42
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

Dilettante_Pro,
Ответить с цитированием
  #6 (permalink)  
Старый 15.09.2017, 14:47
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

рони,
Вот, уже веселее
Ответить с цитированием
  #7 (permalink)  
Старый 15.09.2017, 15:41
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

Dilettante_Pro,
Задание: качели.
а вот такое сможешь, затухающая синусоида, можно задавать время и количество колебаний, что должно получится, пример ниже на css,пример отражает суть, а не точные параметры.
кому это по силам, напишите свой вариант.
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  hr {
  width: 300px; height: 2px; background-color: #000080;
   margin-top: 200px;

  -webkit-animation: spin 5s ease-in-out;
  -moz-animation: spin 5s ease-in-out;
  -o-animation: spin 5s ease-in-out;
  animation: spin 5s ease-in-out;
    -webkit-animation-play-state: running;
    -moz-animation-play-state: running;
    -o-animation-play-state: running;
    animation-play-state: running;
}

@keyframes spin {
  0% {
      transform: rotateZ(50deg);
  }

  25% {
     transform: rotateZ(-40deg);

  }
  50%{
    transform: rotateZ(30deg);
  }
  75%{
    transform: rotateZ(-20deg);
  }

  100%{
    transform: rotateZ(0deg);
  }

}



  </style>

  <script>

  </script>
</head>

<body>
<label><input type="number" min="1" step="1" value="1"></label>
<input id="go" name="" type="button" value="go">
<hr style="width: 300px; height: 2px; background-color: #000080">
<script>
var maximumAngle = 50, duration = 5000;

</script>
</body>
</html>
Ответить с цитированием
  #8 (permalink)  
Старый 19.09.2017, 14:37
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

рони,
Вот, на скорую руку... Мало свободного времени.
<!DOCTYPE html>
<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  hr {
  width: 300px; height: 2px; background-color: #000080;
   margin-top: 160px;
  }
  .hr-rotate {
  -webkit-animation: spin 5s ease-in-out;
  -moz-animation: spin 5s ease-in-out;
  -o-animation: spin 5s ease-in-out;
  animation: spin 5s ease-in-out;
    -webkit-animation-play-state: running;
    -moz-animation-play-state: running;
    -o-animation-play-state: running;
    animation-play-state: running;
}
  .hr-set {
  -webkit-animation: set 1s ease-in-out forwards;
  -moz-animation: set 1s ease-in-out forwards;
  -o-animation: set 1s ease-in-out forwards;
  animation: set 1s ease-in-out forwards;
    -webkit-animation-play-state: running;
    -moz-animation-play-state: running;
    -o-animation-play-state: running;
    animation-play-state: running;
}
  </style>

  <style id="spin">
  </style>

  <style id="set">
  </style>
  
</head>

<body>
  Начальный угол<input id = "setAngle" type="range" min="0" max="75"      value="45" step = "15" list="tickAngle">
<datalist id="tickAngle">
   <option value="0">0</option>
   <option value="15">15</option>
   <option value="30">30</option>
   <option value="45">45</option>
   <option value="60">60</option>
   <option value="75">75</option>
</datalist>
<br>
Тормоза <input id = "setВrake" type="range" min="10" max="50"      value="20" step = "10" list="tickBrake">
<datalist id="tickBrake">
   <option value="10">10</option>
   <option value="20">20</option>
   <option value="30">30</option>
   <option value="40">40</option>
   <option value="50">50</option>
 </datalist>
<input id="go" name="" type="button" value="go">
<hr >
<script>
var maxAngle = "0", prevAngle = "0", 
      line = document.querySelector('hr');

   go.onclick = function() {
       line.classList.remove('hr-set');
       maxAngle = setAngle.value;
       if(maxAngle =="0") return;
       var brake = +setВrake.value,
             currAngle = +maxAngle,
             limit = 0,
             sign = 1,
             keys = "@keyframes spin {";
       while(currAngle > 0.9) {
           limit++;
           currAngle = currAngle *(100 - brake) / 100;
       }
       currAngle = +maxAngle; 
       for(var i = 0; i <= limit; i++) {
          keys += (i *100 / limit) + "%{transform: rotateZ(" + sign * currAngle +"deg)}";
          sign = - sign;
          currAngle = currAngle *(100 - brake) / 100;
       }
       keys += "}";
       spin.innerHTML = keys;
       line.classList.add('hr-rotate');
       setTimeout("line.classList.remove('hr-rotate');", 6000);
   }

   setAngle.onchange = function() {
        line.classList.remove('hr-set');
        prevAngle = maxAngle;
        maxAngle = this.value;
        set.innerHTML = "@keyframes set { 0% { transform: rotateZ("+prevAngle +"deg);  }  100% { transform: rotateZ(" + maxAngle + "deg); }}";
      line.classList.add('hr-set');
   }
</script>
</body>
</html>

Последний раз редактировалось Dilettante_Pro, 19.09.2017 в 14:39.
Ответить с цитированием
  #9 (permalink)  
Старый 19.09.2017, 14:52
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

Dilettante_Pro,
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вращение объекта при клике dany994 Элементы интерфейса 1 09.01.2017 11:56
three.js вращение камеры вокруг объекта ppavelstn Библиотеки/Тулкиты/Фреймворки 6 18.12.2016 07:34
При вызове локальной функции объекта не могу использовать свойства объекта Gudsaf Общие вопросы Javascript 7 17.09.2016 20:23
Canvas. Как сделать или вообще нельзя? Вращение рандомизированно изменяемого объекта. Zemsky Общие вопросы Javascript 30 19.12.2013 19:44
Можно ли получить имя экземпляра объекта внутри самого объекта? Ichigeki Общие вопросы Javascript 9 14.11.2008 19:00