亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

javascript實現10個球隨機運動、碰撞實例詳解

2019-11-20 12:04:46
字體:
來源:轉載
供稿:網友

本文實例講述了javascript實現10個球隨機運動、碰撞的方法。分享給大家供大家參考。具體如下:

學了一段時間的javascript了,做過一些小案例,目前最有難度的就是10個小球隨機碰撞效果,這不,把它上上來與大家分享一下,相信不少和我一樣的菜鳥在開始上手編程時都會有不少的困惑,希望它能給一些人帶來幫助。

效果要求:10個小球在頁面隨機移動,碰到窗口邊界或其他小球都會反彈

思路:

1、10個小球是10個div;
2、碰窗口反彈,定義vx vy為小球的移動變量,以及一個彈力變量bounce(負值),小球碰窗口邊界時,vx vy分別乘以bounce,則改變了小球移動方向
3、小球相碰反彈,說簡單點,當兩個小球的圓心距變量dist小于其最小值(半徑之和)則改變球的移動方向,實現反彈

好了,代碼如下:

html和js是分開的文件喲
 
test.html文件如下:

<html> <head>  <title></title>  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">   <style type="text/css">body {    margin:0;    padding:0;    text-align: center;}#screen { width: 800px; height: 640px; position: relative; background: #ccccff;margin: 0 auto;vertical-align: bottom}#inner { position: absolute; left:0px; top:0px; width:100%; height:100%; }#screen p {color:white;font:bold 14px;}.one { background-image:url('bubble.png'); background-position: -66px -58px; }.two { background-image:url('bubble.png'); background-position: -66px -126px;}.three { background-image:url('bubble.png'); background-position: -66px -194px; }.four { background-image:url('bubble.png'); background-position: -66px -263px; }.five { background-image:url('bubble.png'); background-position: -66px -331px; }.six { background-image:url('bubble.png'); background-position: -66px -399px; }.seven { background-image:url('bubble.png'); background-position: -66px -194px; }.eight { background-image:url('bubble.png'); background-position: -66px -263px; }.nine { background-image:url('bubble.png'); background-position: -66px -331px; }.ten{ background-image:url('bubble.png'); background-position: -66px -399px; }  </style> </head> <body>   <div id="screen" >     <p>hi test it!</p>     <div id="inner"></div>   </div>   <input type="button" id="start" value="start" >   <input type="button" id="stop" value="stop">   <br><br><br><script type="text/javascript" src="test.js"></script> </body></html>

test.js文件如下:

var getFlag=function (id) {     return document.getElementByIdx_x(id);  //獲取元素引用}var extend=function(des, src) {     for (p in src) {       des[p]=src[p];   }  return des; }var clss=['one','two','three','four','five','six','seven','eight','nine','ten'];var Ball=function (diameter,classn) {  var ball=document.createElement_x("div");  ball.className=classn;  with(ball.style) {    width=height=diameter+'px';position='absolute';  }  return ball;}var Screen=function (cid,config) {  //先創建類的屬性  var self=this;  if (!(self instanceof Screen)) {    return new Screen(cid,config)  }  config=extend(Screen.Config, config)  //configj是extend類的實例  self.container=getFlag(cid);      //窗口對象  self.ballsnum=config.ballsnum;  self.diameter=56;            //球的直徑  self.radius=self.diameter/2;  self.spring=config.spring;       //球相碰后的反彈力  self.bounce=config.bounce;       //球碰到窗口邊界后的反彈力  self.gravity=config.gravity;      //球的重力  self.balls=[];             //把創建的球置于該數組變量  self.timer=null;            //調用函數產生的時間id  self.L_bound=0;            //container的邊界  self.R_bound=self.container.clientWidth;  self.T_bound=0;  self.B_bound=self.container.clientHeight;};Screen.Config={             //為屬性賦初值  ballsnum:10,  spring:0.8,  bounce:-0.9,  gravity:0.05};Screen.prototype={  initialize:function () {    var self=this;    self.createBalls();    self.timer=setInterval(function (){self.hitBalls()}, 30)  },  createBalls:function () {    var self=this, num=self.ballsnum;    var frag=document.createDocumentFragment();  //創建文檔碎片,避免多次刷新         for (i=0;i<num;i++) {      var ball=new Ball(self.diameter,clss[ Math.floor(Math.random()* num )]);      ball.diameter=self.diameter;      ball.radius=self.radius;      ball.style.left=(Math.random()*self.R_bound)+'px'; //球的初始位置,      ball.style.top=(Math.random()*self.B_bound)+'px';      ball.vx=Math.random() * 6 -3;      ball.vy=Math.random() * 6 -3;      frag.appendChild(ball);      self.balls[i]=ball;    }    self.container.appendChild(frag);  },  hitBalls:function () {    var self=this, num=self.ballsnum,balls=self.balls;    for (i=0;i<num-1;i++) {      var ball1=self.balls[i];      ball1.x=ball1.offsetLeft+ball1.radius;   //小球圓心坐標      ball1.y=ball1.offsetTop+ball1.radius;      for (j=i+1;j<num;j++) {        var ball2=self.balls[j];        ball2.x=ball2.offsetLeft+ball2.radius;        ball2.y=ball2.offsetTop+ball2.radius;        dx=ball2.x-ball1.x;           //兩小球圓心距對應的兩條直角邊        dy=ball2.y-ball1.y;        var dist=Math.sqrt(dx*dx + dy*dy);    //兩直角邊求圓心距        var misDist=ball1.radius+ball2.radius;  //圓心距最小值       if(dist < misDist) {                    //假設碰撞后球會按原方向繼續做一定的運動,將其定義為運動A            var angle=Math.atan2(dy,dx);         //當剛好相碰,即dist=misDist時,tx=ballb.x, ty=ballb.y          tx=balla.x+Math.cos(angle) * misDist;             ty=balla.y+Math.sin(angle) * misDist;         //產生運動A后,tx > ballb.x, ty > ballb.y,所以用ax、ay記錄的是運動A的值            ax=(tx-ballb.x) * self.spring;             ay=(ty-ballb.y) * self.spring;         //一個球減去ax、ay,另一個加上它,則實現反彈            balla.vx-=ax;                         balla.vy-=ay;            ballb.vx+=ax;            ballb.vy+=ay;          }      }    }    for (i=0;i<num;i++) {      self.moveBalls(balls[i]);    }  },  moveBalls:function (ball) {    var self=this;    ball.vy+=self.gravity;    ball.style.left=(ball.offsetLeft+ball.vx)+'px';    ball.style.top=(ball.offsetTop+ball.vy)+'px';    //判斷球與窗口邊界相碰,把變量名簡化一下    var L=self.L_bound, R=self.R_bound, T=self.T_bound, B=self.B_bound, BC=self.bounce;     if (ball.offsetLeft < L) {      ball.style.left=L;      ball.vx*=BC;    }    else if (ball.offsetLeft + ball.diameter > R) {      ball.style.left=(R-ball.diameter)+'px';      ball.vx*=BC;    }    else if (ball.offsetTop < T) {      ball.style.top=T;      ball.vy*=BC;    }    if (ball.offsetTop + ball.diameter > B) {      ball.style.top=(B-ball.diameter)+'px';      ball.vy*=BC;    }  }}window.onload=function() {  var sc=null;  getFlag('start').onclick=function () {    document.getElementByIdx_x("inner").innerHTML='';    sc=new Screen('inner',{ballsnum:10, spring:0.8, bounce:-0.9, gravity:0.05});    sc.initialize();  }  getFlag('stop').onclick=function() {    clearInterval(sc.timer);  }}

測試后的效果還是很不錯的,各位也許會覺得代碼挺長,但是其思路還是蠻清晰的:
首先創建Screen類,并在Screen的構造函數中給出了球移動、碰撞所需的各種屬性變量,如ballsnum、spring、bounce、gravity等等
然后用原型prototype給出相應的函數,如創建球,createBalls,球碰撞hitBalls,球移動moveBalls,給每個函數添加相應的功能、
最后用按鈕點擊事件調用函數,僅此而已。

希望本文所述對大家的javascript程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国内免费精品永久在线视频| 欧美成人性色生活仑片| 欧美成人国产va精品日本一级| 国产成人综合一区二区三区| 九九热这里只有精品免费看| 欧美性猛交xxxx乱大交| 91精品国产成人www| 亚洲毛片在线免费观看| 高清视频欧美一级| 久久青草福利网站| 国产亚洲美女久久| 亚洲精品videossex少妇| 日韩麻豆第一页| 97视频在线观看免费高清完整版在线观看| 久久久久这里只有精品| 国产精品吴梦梦| 色偷偷av一区二区三区乱| 久久在线视频在线| www.日韩不卡电影av| 欧美精品九九久久| 91豆花精品一区| 成人黄在线观看| 久久国产精品久久久久久久久久| 亚洲free嫩bbb| 在线免费观看羞羞视频一区二区| 伊人伊成久久人综合网站| 俺去了亚洲欧美日韩| 久久精品国产久精国产思思| 色婷婷**av毛片一区| 欧美在线播放视频| 国产美女久久久| 亚洲欧洲高清在线| 欧美黄色片视频| 4438全国亚洲精品在线观看视频| 欧美黑人视频一区| 日韩电影中文字幕在线观看| 中文字幕久久精品| 免费99精品国产自在在线| 亚洲欧洲偷拍精品| 91精品免费久久久久久久久| 久久久久久久久综合| 成人免费网视频| 午夜精品www| 热99精品里视频精品| 国语自产精品视频在免费| 国产精品久久激情| 亚洲一区二区三区视频| 91丨九色丨国产在线| 91精品国产色综合久久不卡98| 97在线视频免费播放| 国产精品亚洲视频在线观看| 2019中文字幕在线观看| 日韩大片在线观看视频| 欧美电影免费观看高清完整| 亚洲第一区第二区| 欧美夫妻性生活视频| 98精品国产高清在线xxxx天堂| 亚洲free性xxxx护士白浆| 午夜精品美女自拍福到在线| 亚洲激情视频在线播放| 欧美午夜www高清视频| 黄色精品一区二区| 91精品久久久久久久久青青| 国产欧美一区二区白浆黑人| 国产精品一区二区三区久久久| 国产精品久久久久久久久久久新郎| **欧美日韩vr在线| www.日韩.com| 69av视频在线播放| 国产精品一区=区| 日韩成人xxxx| 久久久亚洲影院你懂的| 欧美日韩国产综合视频在线观看中文| 精品国产鲁一鲁一区二区张丽| 久久久999精品视频| 欧美日韩视频免费播放| 欧美日韩国产在线| 国产精品国产三级国产aⅴ浪潮| 欧洲成人性视频| 欧美高清理论片| 国产精品电影久久久久电影网| 国产一区二区日韩精品欧美精品| 久久久噜噜噜久久| 色诱女教师一区二区三区| 久久久国产精品免费| 国产精品久久在线观看| 亚洲精品中文字| 国产91对白在线播放| 久久天堂电影网| 国产精品日韩专区| 91亚洲精华国产精华| 欧美黑人一级爽快片淫片高清| 97国产真实伦对白精彩视频8| 国产成人久久久精品一区| 精品久久久久久亚洲精品| 亚洲精品久久久久中文字幕欢迎你| 播播国产欧美激情| 日韩经典中文字幕在线观看| 97超视频免费观看| 91成人在线视频| 红桃视频成人在线观看| 91超碰中文字幕久久精品| 51ⅴ精品国产91久久久久久| 日韩欧美在线看| 亚洲精品久久在线| 68精品久久久久久欧美| 不卡av电影院| 中文字幕日韩精品在线| 久久手机免费视频| 国产美女精彩久久| 欧美日韩性生活视频| 色伦专区97中文字幕| 国产噜噜噜噜噜久久久久久久久| 欧美福利小视频| 米奇精品一区二区三区在线观看| 欧美亚洲一级片| 97视频在线观看网址| 国产一区二区三区视频| 欧美日韩免费区域视频在线观看| 亚洲视频在线免费观看| 色综合久久天天综线观看| 亚洲人av在线影院| 欧美日韩一区二区三区在线免费观看| 8050国产精品久久久久久| 欧美激情免费看| 亚洲色图35p| www高清在线视频日韩欧美| 欧美激情视频一区| 精品久久久久久亚洲国产300| 亚洲欧美日韩国产中文专区| 欧美性少妇18aaaa视频| 亚洲人高潮女人毛茸茸| 欧洲成人免费视频| 精品欧美aⅴ在线网站| 国产美女搞久久| 琪琪亚洲精品午夜在线| 欧美日产国产成人免费图片| 国产精品久久久久久久9999| 国产精品羞羞答答| 久久久国产一区二区三区| 中文国产亚洲喷潮| 欧美性猛交xxxx乱大交极品| 日韩欧美在线第一页| 亚洲国内高清视频| 日韩av免费在线观看| 精品国内自产拍在线观看| 亚洲最大成人在线| 国产在线视频欧美| 精品性高朝久久久久久久| 91成人免费观看网站| 97av在线影院| 成人午夜高潮视频| 国产精品亚洲第一区| 成人av.网址在线网站| 亚洲久久久久久久久久| 日本一区二区三区四区视频| 成人美女av在线直播| 久久人人爽人人| 国产精品视频男人的天堂| 欧美一区亚洲一区| 一本大道久久加勒比香蕉| 色综合久久88色综合天天看泰| 国产一区视频在线播放| 国产精品激情av在线播放|