麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 語言 > 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程序設計有所幫助。

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

圖片精選

主站蜘蛛池模板: 一区二区三区视频在线播放 | 91,视频免费看 | 娇妻被各种姿势c到高潮小说 | 成人精品视频在线 | 亚洲一区二区三区高清视频 | 成年人观看免费视频 | 91久久久久久亚洲精品禁果 | 国产一级在线免费观看 | 狠狠干夜夜操 | 性猛aa久久久 | 日韩专区在线 | 欧美一区二区三区中文字幕 | 久久久久久久久久综合 | av在线浏览| 欧美一级毛片欧美一级成人毛片 | 天天操天天看 | 成年片在线观看 | 久久免费视频3 | 福利在线免费 | 精品国产一区二区久久 | 中文有码一区二区 | 欧美国产精品久久 | 91精品国产91久久久 | 久久国产精品久久久久久久久久 | 毛片大全在线观看 | 国产精选久久 | 成人毛片100部 | 国产精品亚洲精品日韩已方 | 久久精品亚洲精品国产欧美kt∨ | 动漫孕妇被羞羞视频 | 91九色精品国产 | 国产一区二区三区四区五区精品 | 亚洲精品欧美在线 | 欧美精品久久久久久久久久 | 毛片福利 | 亚洲精品一区二区三区在线看 | 日韩毛片网 | 黄色羞羞| 亚洲成人综合网站 | 中国洗澡偷拍在线播放 | 欧美精品日日鲁夜夜添 |