java小球碰撞界面設計_JavaScript實現小球碰撞特效

JavaScript實現小球碰撞特效。類似自由落體運動。實現原理非常簡單,就是動態的改變每個元素的坐標。使用radius屬性將圖片圓角化。使用left,top屬性動態的改變小球的位置。碰撞反彈球,當碰撞到容器的邊緣后,進行反彈,反向改變坐標。

首先創建Screen類,并在Screen的構造函數中給出了球移動、碰撞所需的各種屬性變量,如ballsnum、spring、bounce、gravity等等 ?然后用原型prototype給出相應的函數,如創建球,createBalls,球碰撞hitBalls,球移動moveBalls,給每個函數添加相應的功能、

最后用按鈕點擊事件調用函數,僅此而已。只是我這里把點擊的效果注釋掉了,直接刷新頁面就會隨機改變。

運行效果如下:

6d5301c57d5c54b10bff16734a8a7043.png

html代碼如下:html>

業余草:www.xttblog.com

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:url('images/QP1.png')?no-repeat;?background-size:?100%?auto;}

.two?{?background:url('images/QP2.png')?no-repeat;?background-size:?auto?100%;}

.three?{?background:url('images/QP3.png')?no-repeat;?background-size:?auto?100%;?}

.four?{?background:url('images/QP4.png')?no-repeat;?background-size:?auto?100%;}

.five?{?background:url('images/QP5.png')?no-repeat;?background-size:?auto?100%;}

.six?{?background:url('images/QP6.png')?no-repeat;?background-size:?auto?100%;}

.seven?{?background:url('images/QP7.png')?no-repeat;?background-size:?auto?100%;?}

.eight?{?background:url('images/QP8.png')?no-repeat;?background-size:?auto?100%;?}

.nine?{?background:url('images/QP9.png')?no-repeat;?background-size:?auto?100%;}

.ten{?background:url('images/QP10.png')?no-repeat;?background-size:?auto?100%;}

hi?test?it!

相關js代碼如下:var?getFlag=function?(id)?{

return?document.getElementById(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("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.container=getFlag(cid);

self.ballsnum=config.ballsnum;

self.diameter=80;???????????????????????//球的直徑

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;??//document.documentElement.clientWidth?||?document.body.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

var?ball=new?Ball(self.diameter,clss[i]);

//var?ball=new?Ball(self.diameter,clss[?Math.floor(Math.random()*?num?)]);//這里是隨機的10個小球的碰撞效果

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

var?ball1=self.balls[i];

ball1.x=ball1.offsetLeft+ball1.radius;??????//小球圓心坐標

ball1.y=ball1.offsetTop+ball1.radius;

for?(j=i+1;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?

//假設碰撞后球會按原方向繼續做一定的運動,將其定義為運動A

var?angle=Math.atan2(dy,dx);

//當剛好相碰,即dist=misDist時,tx=ballb.x,?ty=ballb.y

tx=ball1.x+Math.cos(angle)?*?misDist;

ty=ball1.y+Math.sin(angle)?*?misDist;

//產生運動A后,tx?>?ballb.x,?ty?>?ballb.y,所以用ax、ay記錄的是運動A的值

ax=(tx-ball2.x)?*?self.spring;

ay=(ty-ball2.y)?*?self.spring;

//一個球減去ax、ay,另一個加上它,則實現反彈

ball1.vx-=ax;

ball1.vy-=ay;

ball2.vx+=ax;

ball2.vy+=ay;

}

}

}

for?(i=0;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?

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?

ball.style.top=T;

ball.vy*=BC;

}

if?(ball.offsetTop?+?ball.diameter?>?B)?{

ball.style.top=(B-ball.diameter)+'px';

ball.vy*=BC;

}

}

}

window.οnlοad=function()?{

var?sc=null;

document.getElementById("inner").innerHTML='';

sc=new?Screen('inner',{ballsnum:10,?spring:0.3,?bounce:-0.9,?gravity:0.01});

sc.initialize();

getFlag('start').οnclick=function?()?{

document.getElementById("inner").innerHTML='';

sc=new?Screen('inner',{ballsnum:10,?spring:0.3,?bounce:-0.9,?gravity:0.01});

sc.initialize();

}

getFlag('stop').οnclick=function()?{

clearInterval(sc.timer);

}

}

看起來很簡單吧!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370353.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370353.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370353.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

es6常用基礎合集

es6常用基礎合集 在實際開發中,ES6已經非常普及了。掌握ES6的知識變成了一種必須。盡管我們在使用時仍然需要經過babel編譯。 ES6徹底改變了前端的編碼風格,可以說對于前端的影響非常巨大。值得高興的是,如果你熟悉ES5,學習ES6并不…

java接口開發_如果你想學好Java,這些你需要了解

01基本知識  在學習Java之前,您需要了解計算機的基本知識,然后再學習Java。同時,您需要熟悉DOS命令、Java概述、JDK環境安裝配置、環境變量配置。JDK和環境變量配置完成后,就可以編寫Java程序了。02編程格式  此時&#xff0c…

從Java程序生成QR碼圖像

如果您精通技術和小工具,則必須了解QR碼。 這些天,到處都可以找到它-在博客,網站,甚至在某些公共場所。 這在移動應用程序中非常流行,在移動應用程序中,您可以使用QR Code掃描儀應用程序掃描QR Code&#x…

LintCode-最長公共子串

給出兩個字符串,找到最長公共子串。并返回其長度。 您在真實的面試中是否遇到過這個題? Yes例子 給出A“ABCD”,B“CBCE”,返回 2 注意 子串的字符應該連續的出如今原字符串中,這與子序列有所不同。標簽 Expand 相關…

課時67.標簽選擇器(掌握)

通過上節課的學習我們明白了如何通過十六進制來表示顏色 例如:紅色的幾種表示方法 我們發現在學習CSS當中的一些屬性的時候,它都有一些套路 只要知道屬性的名稱,屬性有什么作用,它有哪些取值,這個屬性有什么注意點 …

計算幾何問題 java_【轉載】ACM計算幾何題目推薦

2107 Quoit Design 典型最近點對問題POJ 3714 Raid 變種最近點對問題B,最小包圍圓最小包圍圓的算法是一種增量算法,期望是O(n)。ZOJ 1450 Minimal CircleHDU 3007 Buried memoryC,旋轉卡殼POJ 3608 Bridge Acr…

jdbc連接oracle的幾種格式

1. SID的方式。已經不推薦使用這種方式了。 jdbc:oracle:thin:[<user>/<password>]<host>[:<port>]:<SID> 2.Service Name的方式。 jdbc:oracle:thin:[<user>/<password>]//<host>[:<port>]/<service> 3.TNSNames…

Java 7:使用NIO.2進行文件過濾-第1部分

NIO.2是自Java 7起JDK中包含的用于I / O操作的新API。使用此新API&#xff0c;您可以執行與 java.io以及許多出色的功能&#xff0c;例如&#xff1a;訪問文件元數據和監視目錄更改等。 顯然&#xff0c;由于向后兼容&#xff0c;java.io包不會消失&#xff0c;但是我們鼓勵為…

第十三周活動進度表

學習進度表&#xff1a; 第三周內容時間周一&#xff08;4&#xff1a;10-6&#xff1a;00&#xff09;上課&#xff0c;周二晚上&#xff08;8&#xff1a;00-9&#xff1a;00&#xff09;&#xff0c;周四晚上&#xff08;8&#xff1a;00-8&#xff1a;30&#xff09;&#…

課時66.顏色控制屬性下(理解)

今天來講解十六進制控制屬性的方法&#xff0c;其實用十六進制表示的方式本質就是rgb&#xff0c;只不過它們的格式不一樣而已&#xff0c;十六進制中是通過每兩位表示一種顏色的方式來給顏色賦值。 如 #FF0000 FF----r 00----g 00----b 修改前兩位相當于修改rgb中的第一…

idea復制java_IntelliJ IDEA的剪切、復制和粘貼

IntelliJ IDEA的剪切、復制和粘貼本節內容概覽&#xff1a;? 剪切、復制和粘貼的基本使用? 復制選定的文本片段? 將路徑復制到文件? 將引用復制到一行或一個符號? 剪切選定的文本片段? 從剪貼板粘貼最后一個條目? 將最后一個條目從剪貼板粘貼為純文本? 從剪貼板粘貼特定…

python方差的計算公式為什么減一_樣本標準差分母為何是n-1

歡迎各位學習從0到1Python數據科學之旅&#xff0c;騰訊課堂和網易云課堂入口分別如下&#xff1a;(騰訊課堂新營業&#xff0c;報名可領取20元優惠券)微信公眾號&#xff1a;pythonEducation模型和統計項目QQ&#xff1a;231469242大家好&#xff0c;今天給大家介紹標準差。標…

pxe+kickstart 自動化部署linux操作系統

kickstart 是什么&#xff1f; 批量部署Linux服務器操作系統 運行模式&#xff1a; C/S client/server 服務器上要部署&#xff1a; DHCP tftp&#xff08;非交互式文件共享&#xff09; 安裝系統的三個步驟&#xff1a; 1、加載vmlinuz、 initrd (微型啟動根目錄&#xff0c;它…

課時57.HTML被廢棄的標簽(掌握)

1.為什么HTML中有一部分標簽會被廢棄&#xff1f; 因為當前HTML中的標簽只有一個作用&#xff0c;就是用來添加語義&#xff0c;而早期的HTML標簽中有一部分標簽是沒有語義的 有一部分標簽是用來修改樣式的 所以這部分標簽就被淘汰了 <br><hr><font> <…

Java編碼約定被認為是有害的

在Oracle網站上有Java編程語言指南的正式代碼約定 。 您可能希望這份超過20頁的文檔將是有關Java語言的最佳實踐&#xff0c;提示和技巧的最完整&#xff0c;最全面和最權威的來源。 但是一旦你開始閱讀它&#xff0c;失望和憤怒就會增加。 我想指出本指南中最明顯的錯誤&#…

flash php socket通信_php socket通信機制實例說明

php socket通信機制實例說明與代碼----什么是socket 所謂socket一般也稱作"套接字"&#xff0c;用于描述ip地址和端口&#xff0c;是一個通訊鏈的句柄。使用程序一般經過"套接字"向network發出請求也許應對network請求。說白了就是一種通訊機制。它類似于銀…

python的ogr模塊_python GDAL/OGR模塊安裝注意事項

軟件準備&#xff1a;首先&#xff0c;確保電腦里已安裝python2.7(2.x版本的比較好用&#xff0c;因為還使用ArcGIS)&#xff0c;然后從http://www.gisinternals.com網站上下載這兩個文件GDAL-2.1.3.win32-py2.7.msi和gdal-201-1500-core.msi。軟件安裝&#xff1a;首先安裝gda…

課時55.詳情和概要標簽(理解)

1.什么是詳情和概要標簽&#xff1f; 作用&#xff1a;利用summary標簽來描述概要信息&#xff0c;利用details標簽來描述詳情信息 默認情況下是折疊展示&#xff0c;想看見詳情必須點擊 格式&#xff1a; <details> <summary>概要信息</summary> 詳情信…

Spring Security可以做的十件事

一 您可以在Spring XML配置文件中指定您選擇的授權提供者。 您可以通過配置Spring的http://www.springframework.org/schema/security/spring-security-3.1.xsd模式中定義的authentication-manager來實現。 簡化的authentication-manager元素定義看起來像這樣&#xff1a; &l…

python編寫自定義函數判斷n1-n2范圍內的素數_【每日道代碼題001】- PYTHON基礎復習...

問題001-1&#xff1a;請對輸入三個整數a,b,c,判斷能否以它們為三個邊長構成三角形。若能&#xff0c;輸出YES和面積&#xff0c;否則輸出NOa float(input())b float(input())c float(input())if a > 0 and b > 0 and c > 0: #判斷邊長是否為正if (a b > c) an…