当前位置:首页 > 日记 > 正文

10球随机运动与碰撞实例的javascript实现

10球随机运动与碰撞实例的javascript实现
本文介绍一种用javascript实现10球随机运动和碰撞的方法,供大家参考:

很长时间来学习javascript,做一些小的例子,最难的是10个球随机碰撞的效果,这个没有,翻起来和大家分享一下,我相信很多像我在这个系列的时候开始菜鸟编程的时候会有很多的困惑,希望能给一些人带来帮助。

效果要求:10个球在页面中随意移动,窗口或其他球的边框会反弹。

思想:

1和10个球都是10分

2、触摸窗口反弹,定义为VX VY球移动变量和弹性变量反弹(负值)。当球触及窗边,VX VY乘以反弹,它改变了方向的球移动。

3、球碰撞反弹,简单的说,当两球中心的距离小于可变区的最小值(移动方向的半径)来改变球的反弹

那么,代码如下:

HTML和js是独立的文档。
的test.html文件如下:

{体
保证金:0;
填充:0;
文本对齐:中心;
}
#屏幕{宽度:800px;身高:640px;位置:相对;背景:# ccccff;保证金:0汽车;垂直对齐:顾问
#内{位置:绝对;左:0px;顶部:0px;宽度:100%;高度:100%;}
#屏幕P {颜色:白色;字体:黑体14px;}
。一个{背景图像:URL(‘泡沫。png);背景位置:- 66px - 58px;}
。两{背景图像:URL(‘泡沫。png);背景位置:- 66px - 126px;}
三{背景图像:URL(‘泡沫。png);背景位置:- 66px - 194px;}
四{背景图像:URL(‘泡沫。png);背景位置:- 66px - 263px;}
五{背景图像:URL(‘泡沫。png);背景位置:- 66px - 331px;}
六{背景图像:URL(‘泡沫。png);背景位置:- 66px - 399px;}
七{背景图像:URL(‘泡沫。png);背景位置:- 66px - 194px;}
八{背景图像:URL(‘泡沫。png);背景位置:- 66px - 263px;}
九{背景图像:URL(‘泡沫。png);背景位置:- 66px - 331px;}
十{背景图像:URL(‘泡沫。png);背景位置:- 66px - 399px;}

嗨,测试一下!
的test.js文件如下:

无功getflag =功能(ID){
返回document.getelementbyidx_x(ID); / /获取元素参考
}
函数(DES,SRC){
对于(p在SRC){
des };
}
返回DES;
}
无功课= {,,,四,五,七,有6、8,'nine,间'也要十};
Var Ball =功能(直径、班){
VaR球= document.createelement_x(div);
球。类名=分类;
与(球,风格){
宽度=高度=直径+ 'px;位置=绝对的;
}
回球;
}
var屏幕=函数(CID,配置){
首先创建一个类属性
var =;
如果(!(自是屏幕)){
返回新屏幕(CID,配置)
}
配置=延长(screen.config,config) / / configj是扩展类的一个实例
自我。集装箱= getflag(CID); / /窗口对象
Self.ballsnum=config.ballsnum;
直径= 56;直径
半径= 2;
自我。春天= config.spring; / /碰撞弹跳的球
自我。反弹= config.bounce; / /球打在窗边后反弹
自我。重力= config.gravity; / /重力球
自动生成的球被放置在数组变量中。
时间ID生成的调用函数
自我。l_bound = 0; / /容器的边界
r_bound = self.container.clientwidth自我;
自t_bound = 0;
b_bound = self.container.clientheight自我;
};
属性初始化
Ballsnum:10,
春季:0.8,
弹跳力:- 0.9,
比重:0.05
};
屏幕。原型= {
初始化:函数(){
var =;
Self.createBalls();
自我。定时器= setInterval(函数(){ self.hitballs()},30)
},
CreateBalls:函数(){
VaR自=,= self.ballsnum num;
Var(破片=文件。createdocumentfragment); / /创建一个文件片段,避免反复刷新
对于(i = 0;i <数字;i + +){
var =新球球(self.diameter,CLSS { math.floor(Math.random()Num))))
球的直径为self.diameter;
球半径= self.radius;
球。风格。左=(数学,随机self.r_bound)*(+ 'px '); / /球的初始位置,
球。风格。=(Math.random()*自我。b_bound)+ 'px;
球。VX = Math.random()* 6-3;
球。vy = Math.random()* 6-3;
frag.appendchild(球);
自我,球{ } =球;
}
Self.container.appendChild(片段);
},
hitballs:函数(){
VaR自=,= = self.balls self.ballsnum num,球;
为(i = 0;i < num-1;i++){
无功ball1 =自我。球{我};
ball1。x = ball1。offsetleft + ball1.radius; / /球的中心坐标
ball1。Y = ball1 offsettop + ball1.radius;
对于(j = i + 1;j <数字;j + +){
VaR算=自我。球{,};
算,算offsetleft + ball2.radius x =;
算,算offsettop + ball2.radius y =;
DX =球游戏。x-ball1。X; / /两边缘对应的直角两球中心距离
DY =球游戏。y-ball1。Y;
VaR的距离= math.sqrt(DX DX + * *镝Dy); / /两直角边和中心距
无功misdist = ball1。半径+ ball2.radius; / /最小中心距
如果(距离< misdist){
碰撞后,球/假设会根据原来的方向做一些运动,这被定义为
功角= math.atan2(dy,dx);
只是当 / /碰撞,即距离= misdist,Tx = ballb。X,即ballb。Y
Tx =巴拉。x + math.cos(角)* misdist;
即巴拉。Y + math.sin(角)* misdist;
有 / /运动后,TX > ballb。X,TY > ballb。Y,斧头啊,所以记录的值
AX =(TX ballb。x)* self.spring;
AY =(TY ballb。y)* self.spring;
一个球减去斧头,另一个是反弹。
巴拉。VX - = AX;
巴拉。vy =是的;
Ballb。VX + = AX;
Ballb。vy + =是的;
}
}
}
对于(i = 0;i <数字;i + +){
Self.moveBalls(球{我});
}
},
moveballs:功能(球){
var =;
球。vy + = self.gravity;
球。风格。左=(球。offsetleft +球。VX)+ 'px;
球。风格。=(球。offsettop +球。vy)+ 'px;
判断球和窗口的边界以简化变量名。
var = self.l_bound,R = self.r_bound,T = self.t_bound,B = self.b_bound,BC = self.bounce;
如果(ball.offsetleft<L){
球。风格。左= L;
球。VX * = BC;
}
如果(ball.offsetleft + ball.diameter > R){
球。风格。左=(R-球直径)+ 'px;
球。VX * = BC;
}
如果(ball.offsettop < T){
球。风格;
球。vy=BC;
}
如果(ball.offsettop + ball.diameter > B){
球。风格。=(篮球。直径)+ 'px;
球。vy=BC;
}
}
}
窗口。指针函数(){
var = null;
getflag(开始的)。Onclick =函数(){
document.getelementbyidx_x(内).innerHTML =;
SC =新的屏幕(内心的,{ ballsnum:10、春季:0.8、反弹:0.9,比重:0.05 });
sc.initialize();
}
getflag(停止')。Onclick =函数(){
ClearInterval(sc.timer);
}
}
经过测试,效果非常好,你可能觉得代码很长,但思路相当清晰:

首先,我们创建屏幕类,并给出各种属性变量如ballsnum、弹簧、弹跳、重力等在屏幕的构造函数。

然后我们使用原型样机给相应的功能,如创建球,createballs,球碰撞hitballs,球移动moveballs,和每个功能添加相应的功能。

最后,使用按钮单击事件调用该函数,仅此。

希望本文能对大家的javascript程序设计有所帮助。

相关文章

excel2010如何设置文件的默认保存

excel2010如何设置文件的默认保存

文件,教程,默认,如何设置,格式,excel2010文件格式是xlsx,你不知道它,生成默认的格式是不好的低版本并没有安装一个兼容包案是不公开的,我们不想遇到这样的情况,那么如何避免它通常设置在保存选项保存类型,因为每一你想重复一遍,真是有点不耐烦了,…

Word2010的自定义设置Word2010教程

Word2010的自定义设置Word2010教程

自定义,教程,设置,电脑软件,在办公室的组件,我们使用的词最多。升级后,Word2010文本和表格处理功能更强大,外观更漂亮的界面,功能键布局更合理。如果你是一个字迷,而你恰巧是一个有个性的人,总是不想做同样的事情,请继续往下看,因为你来对地方了! 在…

如何excel2013迅速打开文件夹WPS表

如何excel2013迅速打开文件夹WPS表

教程,表格,工作,电脑软件,WPS,还记得使用Excel将打开;路径命令或单击文件图标,打开一个工作簿,再次使用打开命令;;直接打开文件夹,但有时不一定是当前工作簿打开文件夹,这是因为在编辑文件或最近使用过的工作簿;;列表中打开一个文件,编辑文件会打开文…

经典签名的签名在5月20日的爱。

经典签名的签名在5月20日的爱。

经典,电脑软件,520 5月20日,我爱你浪漫的日子。相对于她,他在你心中表现你的感情吗我希望你有喜欢的人物签名,欢迎阅读。 今天是5月20日,一个非常特殊的节日mdash;mdash;网络情人节,一个固定的节日,互联网用户组织的。今天有关爱情的个性签名是特别…

Word2003无法打印多个文档属性信息

Word2003无法打印多个文档属性信息

属性,教程,文档,多个,电脑软件,在微软Word的早期版本中,可以使用;印;对话框使词同时打印多个文档。现在Word打印功能已更新,与其他微软Windows程序一致,不能同时打印多个文档,但对文档的属性信息还可以打印一次。…

简要介绍了测试()方法在Javascript正则表达

简要介绍了测试()方法在Javascript正则表达

正则表达式,方法,简要,测试,电脑软件,测试方法是一个与正则表达式匹配的文本搜索字符串。如果找到匹配,则返回真值;否则返回false。 语法 regexpobject.test(字符串); 下面是参数的详细信息: 字符串:要搜索的字符串 返回值: 如果找到匹配项,如果…

对getutcminutes使用详解()方法在Jav

对getutcminutes使用详解()方法在Jav

方法,详解,电脑软件,getutcminutes,Javascript,Javascript date.getutcminutes()方法返回到分钟在指定的日期按照一般的时间,返回的值getutcminutes是一个0到59之间的整数。 语法 Date.getUTCMinutes() 下面是参数的详细信息: Na 返回值: 按一般时间…

如何调整颜色和大小的pscs6网格线

如何调整颜色和大小的pscs6网格线

网格,调整,大小,颜色,电脑软件,如何调整颜色和大小的pscs6网格线当图片处理与PS图象处理软件,你经常需要使用网格,那么你如何设置颜色或网格的大小,如果你需要调整吗现在让我们简单介绍一下。 当图片处理与PS图象处理软件,你经常需要使用网格,那…

WPS文本制作教程教程WPS演示教程

WPS文本制作教程教程WPS演示教程

教程,文本,演示,制作教程,电脑软件,这个WPS写目录教程是一个专门为大家安排的小编辑器,希望能对大家有所帮助! 一般来说,论文需要一个目录。事实上,增加纸张目录并不困难。只要为文件设置标题样式,它们就可以直接插入目录中。 操作步骤 1,准备WPS…

手机令牌和密保卡有什么区别QQ常见

手机令牌和密保卡有什么区别QQ常见

常见问题,令牌,有什么区别,电脑软件,密保卡,帐号安全保护工具的手机令牌、密保卡,区别在于手机动态密码技术,安全性远远高于密保卡;手机令牌每30秒就有6位,而且只能用一次,和一个密保卡实体、手机、闪光,图片和其他四种密保卡,每个秘密卡包含64个…

520个真正浪漫的美学人物签名经典

520个真正浪漫的美学人物签名经典

美学,人物,浪漫,经典,电脑软件,520 5月20日,我爱你浪漫的日子。相对于她,他在你心中表现你的感情吗我希望你有喜欢的人物签名,欢迎阅读。 虽然这是注定的,我希望在未来,我能在你的记忆中添加一个美好的回忆,通过此生的努力,修满来世的情。 因为爱…

唯美爱情英语QQ个性签名情侣签名

唯美爱情英语QQ个性签名情侣签名

英语,唯美,个性签名,情侣,爱情,QQ个性与美丽的爱情英文签名,写下人生的快乐,酸甜,记录自己的心情变化。 1、把自己当女王,你就会吸引国王。你像女王一样生活,你可以吸引国王。 2。是否幸福;的友谊或关系,所有的债券都建成,和债券,无论友情还是爱情是…