最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

原生JS實(shí)現(xiàn)多個(gè)小球碰撞反彈效果示例

 更新時(shí)間:2018年01月31日 13:42:11   作者:motokay  
這篇文章主要介紹了原生JS實(shí)現(xiàn)多個(gè)小球碰撞反彈效果,結(jié)合完整實(shí)例形式分析了javascript實(shí)現(xiàn)小球碰撞的相關(guān)數(shù)值計(jì)算、隨機(jī)數(shù)生成、事件響應(yīng)等操作技巧,需要的朋友可以參考下

本文實(shí)例講述了原生JS實(shí)現(xiàn)多個(gè)小球碰撞反彈效果。分享給大家供大家參考,具體如下:

實(shí)現(xiàn)思路:小球的移動,是通過改變小球的left和top值來改變,坐標(biāo)分別為(x,y)當(dāng)x/y值加到最大,即加到父級的寬度或者高度時(shí),使x值或者y值減小,同理當(dāng)x值或者y值減到最小時(shí),同樣的使x值或者y值增加,以上的思路可以實(shí)現(xiàn)小球的碰壁反彈

小球與小球之間的碰撞,要判斷小球在被撞小球的哪個(gè)方向,從而判斷小球該向哪個(gè)方向移動,同樣的改變小球的坐標(biāo)值,來實(shí)現(xiàn)小球的反彈

實(shí)現(xiàn)代碼:

<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>小球碰撞</title>
    <style type="text/css">
      * {
        margin: 0;
        padding: 0;
      }
      #wrap {
        height: 800px;
        width: 1300px;
        border: 1px solid red;
        /*小球設(shè)置相對定位*/
        position: relative;
        margin: 0 auto;
        overflow: hidden;
      }
      p {
        width: 40px;
        height: 40px;
        border-radius: 50%;
        background-color: red;
        position: absolute;
        top: 0;
        left: 0;
        color: white;
        font-size: 25px;
        text-align: center;
        line-height: 40px;
      }
    </style>
  </head>
  <body>
    <div id="wrap">
    </div>
  </body>
  <!--<script src="js/common.js" type="text/javascript" charset="utf-8"></script>-->
  <script type="text/javascript">
    /**
     * 生成并返回一個(gè)從m到n全區(qū)間的隨機(jī)數(shù)
     * @param {Object} m
     * @param {Object} n
     */
    function randomNum(m, n) {
      return Math.floor(Math.random() * (n - m + 1) + m);
    }
    /**
     * 生成一個(gè)隨機(jī)顏色,并返回rgb字符串值
     */
    function randomColor() {
      var r = randomNum(0, 255);
      var g = randomNum(0, 255);
      var b = randomNum(0, 255);
      return "rgb(" + r + "," + g + "," + b + ")";
    }
    //獲得wrapDiv
    var wrapDiv = document.getElementById("wrap");
    //定義數(shù)組存儲所有的小球
    var balls = [];
    //生成小球函數(shù)
    function createBalls() {
      for (var i = 0; i < 20; i++) {
        var ball = document.createElement("p");
        //隨機(jī)小球起始的X坐標(biāo)和小球的Y坐標(biāo)
        ball.x = randomNum(0, 1200);
        ball.y = randomNum(0, 700);
        //隨機(jī)小球的移動速度
        ball.speed = randomNum(2, 5);
        //隨機(jī)小球移動的方向
        if (Math.random() - 0.5 > 0) {
          ball.xflag = true;
        } else {
          ball.xflag = false;
        }
        if (Math.random() - 0.5 > 0) {
          ball.yflag = true;
        } else {
          ball.yflag = false;
        }
        //隨機(jī)小球的背景顏色
        ball.style.backgroundColor = randomColor();
        ball.innerHTML = i + 1;
        //將小球插入當(dāng)wrapDiv中
        wrapDiv.appendChild(ball);
        //將所有的小球存儲到數(shù)組中
        balls.push(ball);
      }
    }
    createBalls();
    //小球移動函數(shù),判斷小球的位置
    function moveBalls(ballObj) {
      setInterval(function() {
        ballObj.style.top = ballObj.y + "px";
        ballObj.style.left = ballObj.x + "px";
        //判斷小球的標(biāo)志量,對小球作出相應(yīng)操作
        if (ballObj.yflag) {
          //小球向下移動
          ballObj.y += ballObj.speed;
          if (ballObj.y >= 800 - ballObj.offsetWidth) {
            ballObj.y = 800 - ballObj.offsetWidth;
            ballObj.yflag = false;
          }
        } else {
          //小球向上移動
          ballObj.y -= ballObj.speed;
          if (ballObj.y <= 0) {
            ballObj.y = 0;
            ballObj.yflag = true;
          }
        }
        if (ballObj.xflag) {
          //小球向右移動
          ballObj.x += ballObj.speed;
          if (ballObj.x >= 1300 - ballObj.offsetHeight) {
            ballObj.x = 1300 - ballObj.offsetHeight;
            ballObj.xflag = false;
          }
        } else {
          //小球向左移動
          ballObj.x -= ballObj.speed;
          if (ballObj.x <= 0) {
            ballObj.x = 0;
            ballObj.xflag = true;
          }
        }
        crash(ballObj);
      }, 10);
    }
    var x1, y1, x2, y2;
    //碰撞函數(shù)
    function crash(ballObj) {
      //通過傳過來的小球?qū)ο髞慝@取小球的X坐標(biāo)和Y坐標(biāo)
      x1 = ballObj.x;
      y1 = ballObj.y;
      for (var i = 0; i < balls.length; i++) {
        //確保不和自己對比
        if (ballObj != balls[i]) {
          x2 = balls[i].x;
          y2 = balls[i].y;
          //判斷位置的平方和小球的圓心坐標(biāo)的關(guān)系
          if (Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2) + 800 <= Math.pow(ballObj.offsetWidth + balls[i].offsetWidth, 2)) {
            //判斷傳過來的小球?qū)ο螅鄬τ谂鲎残∏虻哪膫€(gè)方位
            if (ballObj.x < balls[i].x) {
              if (ballObj.y < balls[i].y) {
                //小球?qū)ο笤诒慌鲂∏虻淖笊辖?
                ballObj.yflag = false;
                ballObj.xflag = false;
              } else if (ballObj.y > balls[i].y) {
                //小球?qū)ο笤诒慌鲂∏虻淖笙陆?
                ballObj.xflag = false;
                ballObj.yflag = true;
              } else {
                //小球?qū)ο笤诒蛔残∏虻恼蠓?
                ballObj.xflag = false;
              }
            } else if (ballObj.x > balls[i].x) {
              if (ballObj.y < balls[i].y) {
                //小球?qū)ο笤诒慌鲎残∏虻挠疑戏?
                ballObj.yflag = false;
                ballObj.xflag = true;
              } else if (ballObj.y > balls[i].y) {
                //小球?qū)ο笤诒慌鲎残∏虻挠蚁路?
                ballObj.xflag = true;
                ballObj.yflag = true;
              } else {
                //小球?qū)ο笤诒蛔残∏虻恼曳?
                ballObj.xflag = true;
              }
            } else if (ballObj.y > balls[i].y) {
              //小球?qū)ο笤诒蛔残∏虻恼路?
              ballObj.yflag = true;
            } else if (ballObj.y < balls[i].y) {
              //小球?qū)ο笤诒蛔残∏虻恼戏?
              ballObj.yflag = false;
            }
          }
        }
      }
    }
    for (var i = 0; i < balls.length; i++) {
      //將所有的小球傳到函數(shù)中,來實(shí)現(xiàn)對小球的移動
      moveBalls(balls[i]);
    }
  </script>
</html>

運(yùn)行效果:

更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript運(yùn)動效果與技巧匯總》、《JavaScript動畫特效與技巧匯總》、《JavaScript圖形繪制技巧總結(jié)》、《JavaScript切換特效與技巧總結(jié)》、《JavaScript錯誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)

希望本文所述對大家JavaScript程序設(shè)計(jì)有所幫助。

相關(guān)文章

最新評論

福贡县| 盐亭县| 定结县| 梁山县| 汽车| 右玉县| 丹江口市| 兴山县| 大庆市| 富宁县| 曲阳县| 莱州市| 玛纳斯县| 浦江县| 方城县| 齐河县| 中牟县| 富阳市| 杭州市| 玉田县| 杂多县| 天镇县| 定西市| 都兰县| 广宁县| 遂平县| 阿拉善左旗| 兴文县| 罗田县| 修武县| 江都市| 明水县| 塘沽区| 忻城县| 牙克石市| 黄浦区| 堆龙德庆县| 靖州| 社旗县| 榆中县| 长宁县|