生成元素的随机数(下雨)

问题描述 投票:2回答:2

我是一名新的编程学生,我已经坚持了很长一段时间的指导。我必须创建一个由Nyan猫下雨(在某个方向,随机旋转角度等)制作的动画。我尝试了很多东西,但我无法弄清楚如何在屏幕上添加随机数量的猫。

我试过Math.floor(Math.random(),但我不知道如何将它与我的猫联系起来。

这是我的代码。它可能不是很优化但是现在“逐步”写作对我来说是可以理解的。

<body>
    <button id="make_it_rain">Make it rain!</button>
    <img id ="cat" src="img/cat.png">
    <div id="container">
    </div>
    <audio id="myAudio"> 
        <source src="audio/nyancat.ogg">
            <source src="audio/nyancat.mp3">
            </audio>

<script>

var btn = document.getElementById("make_it_rain"); 
    btn.addEventListener("click", rainCat);

// Animation starts
function rainCat()
{ 
setTimeout(animationEnd,10000);

  // Background styling 
  var background = document.getElementById("container");
  background.style.display = "block";
  document.body.appendChild(background);
  var pos_background = 0;
  setInterval(frameBackground, 100);

  // Background moves
  function frameBackground()
  {
    if (pos_background == -100) {
        pos_background = 0;
    } else {
        pos_background--;
        background.style.top = pos_background + "%"; 
        background.style.left = pos_background + "%"; 
    }
  }

  // Cat styling
  var nyanCat = document.getElementById("cat");
  nyanCat.style.display = "block";
  nyanCat.style.transform = "rotate(45deg)";
  document.body.appendChild(nyanCat);

  // Cat variables (position, rotate, speed)
  var pos_cat_left = 100;
  var pos_cat_top = 0;
  var rotate = Math.floor(Math.random() * 360);
  setInterval(oneCat, 5);

  // One cat moves
  function oneCat()
  {
    if (pos_cat_left == 100) {
        pos_cat_left = Math.floor(Math.random() * 50);
        pos_cat_top = 0;
        rotateCat = Math.floor(Math.random() * 360);
    } else {
        pos_cat_top = pos_cat_top + 0.5; 
        pos_cat_left = pos_cat_left + 0.5;
        nyanCat.style.top = pos_cat_top + "%"; 
        nyanCat.style.left = pos_cat_left + "%"; 
        nyanCat.style.transform = 'rotate(' + rotate + 'deg)';
    }
  }

  // Music plays
  document.getElementById('myAudio').play();
  function playAudio() { audio.play(); }
}

  // Animation stops
  function animationEnd() {
    location.reload(); 
  }

</script>


</body>

目前动画效果很好,但我怎样才能随机繁殖我的猫,以免许多猫同时下雨?

非常感谢你的帮助!

javascript
2个回答
0
投票

目前在您的DOM中只有一个猫图像,您可能需要在循环中创建多个:

const cats = [];

for(let count = 0; count < 10; count++) {
 const cat = document.createElement("img");

 cat.src = "./cat.png";
 cat.style.display = "block";
 cat.style.transform = "rotate(45deg)";

 document.body.appendChild(cat);
 cats.push(cat);
}

既然你有一系列的猫,你还需要每次滴答都更新它们:

function render() {
  for(const cat of cats) {
    // your cat update logic from oneCat()
  }
  requestAnimationFrame(update); // better as a timer, as it only updates on every display rerender
}

render();

0
投票

根据您的代码添加我的克隆和旋转解决方案版本请看这个小提琴:

https://jsfiddle.net/aq02wu4j/1/

重点是使用动画对象数组:

var btn = document.getElementById("make_it_rain"); 
    btn.addEventListener("click", rainCat);

// Animation starts
function rainCat()
{ 
setTimeout(animationEnd,1000000);

  // Background styling 
  var background = document.getElementById("container");
  background.style.display = "block";
  document.body.appendChild(background);
  var pos_background = 0;
  setInterval(frameBackground, 100);

  // Background moves
  function frameBackground()
  {
    if (pos_background == -100) {
        pos_background = 0;
    } else {
        pos_background--;
        background.style.top = pos_background + "%"; 
        background.style.left = pos_background + "%"; 
    }
  }
    var numbersOfCats = 3;
  // Cat styling
  var catsPos = {};
  for(var i = 0; i <numbersOfCats ; ++i) {
  catsPos[i] = {};
  catsPos[i].nyanCat = $("#cat").clone()[0];
  catsPos[i].nyanCat.style.display = "block";
  catsPos[i].nyanCat.style.transform = "rotate(45deg)";
  document.body.appendChild(catsPos[i].nyanCat);

  // Cat variables (position, rotate, speed)
  catsPos[i].pos_cat_left = 0;
  catsPos[i].pos_cat_top = 0;
  catsPos[i].rotate = Math.floor(Math.random() * 360);
    runNewCat(i);

}
function runNewCat(i) {
setInterval(function() { 
  oneCat(i)
  }, 10);
}

  // One cat moves
  function oneCat(i)
  {
   var catData = catsPos[i];
    if (catData.pos_cat_left >= 100) {
        catData.pos_cat_left = Math.floor(Math.random() * 50);
        catData.pos_cat_top = 0;
        catData.rotateCat = Math.floor(Math.random() * 360);
        catData.rotate =45;
    } else {
            catData.rotate +=5;
        catData.pos_cat_top = catData.pos_cat_top + 0.5; 
        catData.pos_cat_left = catData.pos_cat_left + 0.5;
        catData.nyanCat.style.top = catData.pos_cat_top + "px"; 
        catData.nyanCat.style.left = catData.pos_cat_left + "px"; 
        catData.nyanCat.style.transform = 'rotate(' + catData.rotate + 'deg)';
    }
  }

  // Music plays
  document.getElementById('myAudio').play();
  function playAudio() { audio.play(); }
}

  // Animation stops
  function animationEnd() {
    location.reload(); 
  }
© www.soinside.com 2019 - 2024. All rights reserved.