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

首頁 > 語言 > JavaScript > 正文

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

2024-05-06 16:22:46
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了javascript實現10個球隨機運動、碰撞的方法,實例分析了javascript實現小球碰撞的原理與實現技巧,具有一定參考借鑒價值,需要的朋友可以參考下

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

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

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

思路:

1、10個小球是10個div;

2、碰窗口反彈,定義vx vy為小球的移動變量,以及一個彈力變量bounce(負值),小球碰窗口邊界時,vx vy分別乘以bounce,則改變了小球移動方向

3、小球相碰反彈,說簡單點,當兩個小球的圓心距變量dist小于其最小值(半徑之和)則改變球的移動方向,實現反彈

好了,代碼如下:

html和js是分開的文件喲

test.html文件如下:

 

 
  1. <html> 
  2. <head> 
  3. <title></title> 
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"
  5. <style type="text/css"
  6. body { 
  7. margin:0; 
  8. padding:0; 
  9. text-align: center; 
  10. #screen { width: 800px; height: 640px; position: relative; background: #ccccff;margin: 0 auto;vertical-align: bottom} 
  11. #inner { position: absolute; left:0px; top:0px; width:100%; height:100%; } 
  12. #screen p {color:white;font:bold 14px;} 
  13. .one { background-image:url('bubble.png'); background-position: -66px -58px; } 
  14. .two { background-image:url('bubble.png'); background-position: -66px -126px;} 
  15. .three { background-image:url('bubble.png'); background-position: -66px -194px; } 
  16. .four { background-image:url('bubble.png'); background-position: -66px -263px; } 
  17. .five { background-image:url('bubble.png'); background-position: -66px -331px; } 
  18. .six { background-image:url('bubble.png'); background-position: -66px -399px; } 
  19. .seven { background-image:url('bubble.png'); background-position: -66px -194px; } 
  20. .eight { background-image:url('bubble.png'); background-position: -66px -263px; } 
  21. .nine { background-image:url('bubble.png'); background-position: -66px -331px; } 
  22. .ten{ background-image:url('bubble.png'); background-position: -66px -399px; } 
  23. </style> 
  24. </head> 
  25. <body> 
  26. <div id="screen" > 
  27. <p>hi test it!</p> 
  28. <div id="inner"></div> 
  29. </div> 
  30. <input type="button" id="start" value="start" > 
  31. <input type="button" id="stop" value="stop"
  32. <br><br><br> 
  33. <script type="text/javascript" src="test.js"></script> 
  34. </body> 
  35. </html> 

test.js文件如下:

 

 
  1. var getFlag=function (id) { 
  2. return document.getElementByIdx_x(id); //獲取元素引用 
  3. var extend=function(des, src) { 
  4. for (p in src) { 
  5. des[p]=src[p]; 
  6. return des; 
  7. var clss=['one','two','three','four','five','six','seven','eight','nine','ten']; 
  8. var Ball=function (diameter,classn) { 
  9. var ball=document.createElement_x("div"); 
  10. ball.className=classn; 
  11. with(ball.style) { 
  12. width=height=diameter+'px';position='absolute'
  13. return ball; 
  14. var Screen=function (cid,config) { 
  15. //先創建類的屬性 
  16. var self=this
  17. if (!(self instanceof Screen)) { 
  18. return new Screen(cid,config) 
  19. config=extend(Screen.Config, config) //configj是extend類的實例 
  20. self.container=getFlag(cid); //窗口對象 
  21. self.ballsnum=config.ballsnum; 
  22. self.diameter=56; //球的直徑 
  23. self.radius=self.diameter/2; 
  24. self.spring=config.spring; //球相碰后的反彈力 
  25. self.bounce=config.bounce; //球碰到窗口邊界后的反彈力 
  26. self.gravity=config.gravity; //球的重力 
  27. self.balls=[]; //把創建的球置于該數組變量 
  28. self.timer=null//調用函數產生的時間id 
  29. self.L_bound=0; //container的邊界 
  30. self.R_bound=self.container.clientWidth; 
  31. self.T_bound=0; 
  32. self.B_bound=self.container.clientHeight; 
  33. }; 
  34. Screen.Config={ //為屬性賦初值 
  35. ballsnum:10, 
  36. spring:0.8, 
  37. bounce:-0.9, 
  38. gravity:0.05 
  39. }; 
  40. Screen.prototype={ 
  41. initialize:function () { 
  42. var self=this
  43. self.createBalls(); 
  44. self.timer=setInterval(function (){self.hitBalls()}, 30) 
  45. }, 
  46. createBalls:function () { 
  47. var self=this, num=self.ballsnum; 
  48. var frag=document.createDocumentFragment(); //創建文檔碎片,避免多次刷新  
  49. for (i=0;i<num;i++) { 
  50. var ball=new Ball(self.diameter,clss[ Math.floor(Math.random()* num )]); 
  51. ball.diameter=self.diameter; 
  52. ball.radius=self.radius; 
  53. ball.style.left=(Math.random()*self.R_bound)+'px'//球的初始位置, 
  54. ball.style.top=(Math.random()*self.B_bound)+'px'
  55. ball.vx=Math.random() * 6 -3; 
  56. ball.vy=Math.random() * 6 -3; 
  57. frag.appendChild(ball); 
  58. self.balls[i]=ball; 
  59. self.container.appendChild(frag); 
  60. }, 
  61. hitBalls:function () { 
  62. var self=this, num=self.ballsnum,balls=self.balls; 
  63. for (i=0;i<num-1;i++) { 
  64. var ball1=self.balls[i]; 
  65. ball1.x=ball1.offsetLeft+ball1.radius; //小球圓心坐標 
  66. ball1.y=ball1.offsetTop+ball1.radius; 
  67. for (j=i+1;j<num;j++) { 
  68. var ball2=self.balls[j]; 
  69. ball2.x=ball2.offsetLeft+ball2.radius; 
  70. ball2.y=ball2.offsetTop+ball2.radius; 
  71. dx=ball2.x-ball1.x; //兩小球圓心距對應的兩條直角邊 
  72. dy=ball2.y-ball1.y; 
  73. var dist=Math.sqrt(dx*dx + dy*dy); //兩直角邊求圓心距 
  74. var misDist=ball1.radius+ball2.radius; //圓心距最小值 
  75. if(dist < misDist) {  
  76. //假設碰撞后球會按原方向繼續做一定的運動,將其定義為運動A  
  77. var angle=Math.atan2(dy,dx); 
  78. //當剛好相碰,即dist=misDist時,tx=ballb.x, ty=ballb.y 
  79. tx=balla.x+Math.cos(angle) * misDist;  
  80. ty=balla.y+Math.sin(angle) * misDist; 
  81. //產生運動A后,tx > ballb.x, ty > ballb.y,所以用ax、ay記錄的是運動A的值 
  82. ax=(tx-ballb.x) * self.spring;  
  83. ay=(ty-ballb.y) * self.spring; 
  84. //一個球減去ax、ay,另一個加上它,則實現反彈 
  85. balla.vx-=ax;  
  86. balla.vy-=ay; 
  87. ballb.vx+=ax; 
  88. ballb.vy+=ay; 
  89. for (i=0;i<num;i++) { 
  90. self.moveBalls(balls[i]); 
  91. }, 
  92. moveBalls:function (ball) { 
  93. var self=this
  94. ball.vy+=self.gravity; 
  95. ball.style.left=(ball.offsetLeft+ball.vx)+'px'
  96. ball.style.top=(ball.offsetTop+ball.vy)+'px'
  97. //判斷球與窗口邊界相碰,把變量名簡化一下 
  98. var L=self.L_bound, R=self.R_bound, T=self.T_bound, B=self.B_bound, BC=self.bounce;  
  99. if (ball.offsetLeft < L) { 
  100. ball.style.left=L; 
  101. ball.vx*=BC; 
  102. else if (ball.offsetLeft + ball.diameter > R) { 
  103. ball.style.left=(R-ball.diameter)+'px'
  104. ball.vx*=BC; 
  105. else if (ball.offsetTop < T) { 
  106. ball.style.top=T; 
  107. ball.vy*=BC; 
  108. if (ball.offsetTop + ball.diameter > B) { 
  109. ball.style.top=(B-ball.diameter)+'px'
  110. ball.vy*=BC; 
  111. window.onload=function() { 
  112. var sc=null
  113. getFlag('start').onclick=function () { 
  114. document.getElementByIdx_x("inner").innerHTML=''
  115. sc=new Screen('inner',{ballsnum:10, spring:0.8, bounce:-0.9, gravity:0.05}); 
  116. sc.initialize(); 
  117. getFlag('stop').onclick=function() { 
  118. clearInterval(sc.timer); 

測試后的效果還是很不錯的,各位也許會覺得代碼挺長,但是其思路還是蠻清晰的:

首先創建Screen類,并在Screen的構造函數中給出了球移動、碰撞所需的各種屬性變量,如ballsnum、spring、bounce、gravity等等

然后用原型prototype給出相應的函數,如創建球,createBalls,球碰撞hitBalls,球移動moveBalls,給每個函數添加相應的功能、

最后用按鈕點擊事件調用函數,僅此而已。

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩成人激情视频| 日本精品久久中文字幕佐佐木| 欧美性在线观看| 97精品国产97久久久久久春色| 亚洲一区二区三区在线免费观看| 欧美在线影院在线视频| 欧美日韩亚洲视频| 日韩免费观看视频| 欧美激情在线一区| 91久久精品国产91久久| 日韩精品日韩在线观看| 亚州成人av在线| 亚洲色图色老头| 2019国产精品自在线拍国产不卡| 最近中文字幕mv在线一区二区三区四区| 亚洲午夜精品久久久久久久久久久久| 色哟哟入口国产精品| 日韩高清a**址| 精品久久久久久中文字幕一区奶水| 国产精品视频自拍| 激情av一区二区| 成人444kkkk在线观看| 日韩美女写真福利在线观看| 成人日韩av在线| 国产亚洲精品一区二区| 久久91精品国产91久久跳| 亚洲男人天堂古典| 亚洲一区中文字幕| 成人激情视频网| 国产福利精品视频| 国产精品美女免费| 一区二区三区精品99久久| 97久久超碰福利国产精品…| 国产激情综合五月久久| 国产欧美精品久久久| 欧美激情精品在线| 国产精品久久久久久av| 欧美电影第一页| 久热精品视频在线| 亚洲国产精品高清久久久| 精品久久久久久久大神国产| 色噜噜亚洲精品中文字幕| 夜夜嗨av一区二区三区四区| 亚洲风情亚aⅴ在线发布| 欧美韩国理论所午夜片917电影| 91国产精品91| 国产精品色午夜在线观看| 亚洲japanese制服美女| 成人黄色免费片| 精品久久久久人成| 成人免费大片黄在线播放| 中文字幕一区二区精品| 欧美人与性动交a欧美精品| 欧美自拍视频在线观看| 国产综合在线看| 亚洲精品久久久久久下一站| 亚洲欧美国产高清va在线播| 日本三级韩国三级久久| 亚洲男人第一网站| 精品国产一区二区三区久久久狼| 精品在线欧美视频| 欧美伊久线香蕉线新在线| 欧美性理论片在线观看片免费| 97超级碰碰碰| 26uuu久久噜噜噜噜| 午夜剧场成人观在线视频免费观看| 日韩电影视频免费| 亚洲欧洲偷拍精品| 亚洲综合av影视| 国产欧美最新羞羞视频在线观看| 91视频国产精品| 91av在线免费观看视频| 视频在线观看一区二区| 国产精品96久久久久久又黄又硬| 亚洲欧美日韩第一区| 国产91精品最新在线播放| 国产精品18久久久久久首页狼| 精品亚洲国产视频| 国产精品黄色av| 欧美专区福利在线| 国产精品av电影| 国产在线98福利播放视频| 欧美日韩福利在线观看| 97在线视频国产| 在线观看91久久久久久| 日韩免费av一区二区| 亚洲精品成人网| 精品久久久久久国产91| 中文字幕欧美视频在线| 在线色欧美三级视频| 午夜免费日韩视频| 成人97在线观看视频| 成人免费淫片aa视频免费| 久久这里只有精品99| 美女精品视频一区| 欧美日韩精品中文字幕| 国产日韩欧美影视| 久久久成人的性感天堂| 51色欧美片视频在线观看| 青草青草久热精品视频在线网站| 国产美女91呻吟求| 国产精品视频免费观看www| 欧美国产日韩一区二区| 成人精品久久一区二区三区| 欧美精品videos性欧美| 成人欧美一区二区三区在线| 69**夜色精品国产69乱| 精品久久久久久久中文字幕| 国产精品久久久一区| 久久91超碰青草是什么| 91精品在线观| 欧美成人精品h版在线观看| 欧美精品在线免费| 精品国产乱码久久久久久天美| 精品视频久久久久久久| 亚洲男人天堂九九视频| 亚洲国产精品人久久电影| 911国产网站尤物在线观看| www.美女亚洲精品| 国语自产精品视频在线看一大j8| 97香蕉久久超级碰碰高清版| 97在线看福利| 久久久久久97| 国产精品第3页| 日韩免费在线视频| 亚洲一区二区久久久久久久| 亚洲www在线| 成人免费视频xnxx.com| 久久久久久国产精品美女| 精品久久久999| 国产有码在线一区二区视频| 日韩成人性视频| 欧美在线免费观看| 亚洲福利视频网站| 91精品久久久久久久| 亚洲激情国产精品| 亚洲午夜精品久久久久久性色| 69精品小视频| 国产精品久久久久久久久久ktv| 秋霞成人午夜鲁丝一区二区三区| 欧美日韩第一页| 亚洲人成网站777色婷婷| 欧美大肥婆大肥bbbbb| 国产精品91久久| 欧美另类交人妖| 黑人巨大精品欧美一区二区三区| 亚洲午夜av电影| 欧美成人免费一级人片100| 亚洲免费一在线| 深夜福利一区二区| 日韩视频第一页| 欧美精品久久一区二区| 亚洲а∨天堂久久精品9966| 久久影院模特热| 日韩av综合中文字幕| 日韩欧美国产激情| 在线观看日韩专区| 欧美高清视频一区二区| 狠狠综合久久av一区二区小说| 精品调教chinesegay| 国产亚洲欧美日韩精品| 亚洲三级免费看| 国产精品久久久999| 欧美专区国产专区|