[Canvas]碰撞球 增加小球间碰撞检测
请点此下载代码并用Chrome或是Firefox打开index.html
图例:


代码:
<!DOCTYPE html>
<html lang="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<head>
<title>碰撞球 19.3.3 18:11 by:逆火 horn19782016@163.com</title>
<style>
#canvas{
background:#ffffff;
cursor:pointer;
margin-left:10px;
margin-top:10px;
-webkit-box-shadow:3px 3px 6px rgba(0,0,0,0.5);
-moz-box-shadow:3px 3px 6px rgba(0,0,0,0.5);
box-shadow:3px 3px 6px rgba(0,0,0,0.5);
}
#controls{
margin-top:10px;
margin-left:15px;
}
</style>
</head>
<body onload="init()">
<div id="controls">
<input id='animateBtn' type='button' value='运动'/>
</div>
<canvas id="canvas" width="750px" height="500px" >
出现文字表示你的浏览器不支持HTML5
</canvas>
</body>
</html>
<script type="text/javascript">
<!--
var paused=true;
animateBtn.onclick=function(e){
paused=! paused;
if(paused){
animateBtn.value="运动";
}else{
animateBtn.value="暂停";
window.requestAnimationFrame(animate);
}
}
var ctx;// 绘图环境
var balls;// 球数组
function init(){
var canvas=document.getElementById('canvas');
canvas.width=750;
canvas.height=500;
ctx=canvas.getContext('2d');
balls=[
{
x:150,
y:250,
vx:-7.2,
vy:3.8,
radius:25,
innerColor:'rgba(255,25,0,1)',
middleColor:'rgba(255,25,0,0.7)',
outerColor:'rgba(255,25,0,0.5)',
strokeStyle:'gray',
},
{
x:650,
y:50,
vx:-8.2,
vy:2.5,
radius:25,
innerColor:'rgba(113,232,227,1)',
middleColor:'rgba(113,232,227,0.7)',
outerColor:'rgba(113,232,227,0.5)',
strokeStyle:'red',
},
{
x:50,
y:150,
vx:12,
vy:-14,
radius:25,
innerColor:'rgba(23,45,227,1)',
middleColor:'rgba(23,45,227,0.7)',
outerColor:'rgba(23,45,227,0.5)',
strokeStyle:'blue',
},
{
x:30,
y:60,
vx:8,
vy:-24,
radius:25,
innerColor:'rgba(23,45,69,1)',
middleColor:'rgba(23,45,69,0.7)',
outerColor:'rgba(23,45,69,0.5)',
strokeStyle:'yellow',
},
{
x:300,
y:300,
vx:80,
vy:-34,
radius:25,
innerColor:'rgba(123,45,69,1)',
middleColor:'rgba(123,45,69,0.7)',
outerColor:'rgba(123,45,69,0.5)',
strokeStyle:'navy',
},
];
};
function update(){
for(var i=0;i<balls.length;i++){
var ball=balls[i];
// 与左右墙壁的碰撞检测
if(ball.x+ball.vx+ball.radius>ctx.canvas.width || ball.x+ball.vx-ball.radius<0){
ball.vx=-ball.vx;
}
// 与上下墙壁的碰撞检测
if(ball.y+ball.vy+ball.radius>ctx.canvas.height || ball.y+ball.vy-ball.radius<0){
ball.vy=-ball.vy;
}
// 小球之前的碰撞检测
for(var j=0;j<balls.length;j++){
if(i!=j){
var other=balls[j];
var distance=Math.sqrt( Math.pow((ball.x+ball.vx-other.x-other.vx),2)+Math.pow((ball.y+ball.vy-other.y-other.vy),2));
if(distance<ball.radius+other.radius){
// 如果两个碰撞小球的质量相等,联立动量守恒和能量守恒方程时可解得:两个小球碰撞后交换速度。
var x=ball.vx;
ball.vx=other.vx;
other.vx=x;
var y=ball.vy;
ball.vy=other.vy;
other.vy=y;
}
}
}
ball.x+=ball.vx;
ball.y+=ball.vy;
}
}
function draw(){
ctx.clearRect(0,0,ctx.canvas.width,ctx.canvas.height);
for(var i=0;i<balls.length;i++){
var ball=balls[i];
gradient=ctx.createRadialGradient(ball.x,ball.y,0,ball.x,ball.y,ball.radius);
gradient.addColorStop(0.3,ball.innerColor);
gradient.addColorStop(0.5,ball.middleColor);
gradient.addColorStop(1.0,ball.outerColor);
ctx.save();
ctx.beginPath();
ctx.arc(ball.x,ball.y,ball.radius,0,Math.PI*2,false);
ctx.fillStyle=gradient;
ctx.strokeStyle=ball.strokeStyle;
ctx.fill();
ctx.stroke();
ctx.restore();
}
}
function animate(){
if(!paused){
update();
draw();
setTimeout( function(){
window.requestAnimationFrame(animate); /// 让浏览器自行决定帧速率
}, 0.10 * 1000 );// 延时执行
}
}
//-->
</script>
2019年3月3日20点17分
[Canvas]碰撞球 增加小球间碰撞检测的更多相关文章
- [Canvas]碰撞球
观赏动态效果请点此下载并用Chrome/Firefox打开index.html 图例: 代码: <!DOCTYPE html> <html lang="utf-8" ...
- 2017了,回家前 "年末" 分享:下雨,飘雪,红包雨,碰撞球,自定义View
(本博客为原创:http://www.cnblogs.com/linguanh/) 目录: 效果展示 感想 代码拆解 开源地址 效果展示 有没有兴趣继续看下去,直接看下"颜值"是第 ...
- [原创]基于html5新标签canvas写的一个小画板
最近刚学了canvas,写个小应用练习下 源代码 <!DOCTYPE> <html> <head> <meta http-equiv="Conten ...
- Html5 Canvas动画旋转的小方块;
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- canvas学习笔记、小函数整理
http://bbs.csdn.net/topics/391493648 canvas实例分享 2016-3-16 http://bbs.csdn.net/topics/390582151 html5 ...
- 利用canvas写一个验证码小功能
刚刚开始接触canvas,写个验证码小功能练练手,实现效果图如下: 主要代码如下: html <!DOCTYPE html> <html lang="en"> ...
- 第八讲:HTML5中canvas实现小球击打小方块游戏
源码:http://download.csdn.net/detail/liumingm900913/7469969 游戏开发流程: 1.创建画布: 将画布放在div标签里面,这样能够控制画布居中的位置 ...
- canvas写的一个小时钟demo
<!DOCTYPE html> <html> <head> <title>HTML5 Canvas Demo of clock</title> ...
- opencv(4)实现数据增加小工具
数据增加(data augmentation),作为一种深度学习中的常用手段,数据增加对模型的泛化性和准确性都有帮助.数据增加的具体使用方式一般有两种,一种是实时增加,比如在Caffe中加入数据扰动层 ...
随机推荐
- js文件改变之后浏览器缓存问题怎么解决?
升级了js文件,很多页面都引用了这个文件,需要主动清除浏览器缓存才会生效,有没有什么办法可以不主动清除就可以? 修改文件名,加上版本号,或 xxx.js?v=0.101
- 液晶电视插有线电视信号线的是哪个接口 HDMI是什么接口
1.液晶电视插有线电视信号线的接口(模拟信号)是射频接口(也叫RF接口,同轴电缆接口,闭路线接口),数字信号就得通过机顶盒转换成模拟信号视频输出至电视,才能正常收看电视节目. 2.电视机或高清机顶盒上 ...
- DbContextScope,A simple and flexible way to manage your Entity Framework DbContext instances,by mehdime
DbContextScope A simple and flexible way to manage your Entity Framework DbContext instances. DbCont ...
- 使用HTML5和CSS3碎语
当我们使用HTML5, CSS3,甚至Bootstrap设计网站的时候,有些方面是必须考虑的,比如字体大小,标题大小,行间距,每行字数,字体,颜色,背景图片和文字的搭配,图标,留白和布局......所 ...
- eclipse 中 import sun.misc.BASE64Decoder; 报错
from://http://blog.sina.com.cn/s/blog_48964b120101ahrf.html 在android做3DES加密功能时 eclipse 中 import sun. ...
- 一个exception
今天调错,发生了一个错误:java.lang.IllegalStateException: ApplicationEventMulticaster not initialized [closed] 后 ...
- Universal-Image-Loader解析(一)——ImageLoaderConfiguration的详细配置
Universal-Image-Loader这个开源框架又来给我们造福了,它是一个图片加载框架,主要强大在于可以用于网络等图片源的加载,并且有多重缓存机制.先给出其项目地址:https://githu ...
- 开源项目PullToRefresh详解(一)——PullToRefreshListView
开源项地址:https://github.com/chrisbanes/Android-PullToRefresh 下拉刷新这个功能我们都比较常见了,今天介绍的就是这个功能的实现.我将按照这个开 ...
- Plupload设置自定义参数
在HTML 5比较流行的当下,Plupload是文件上传的不二之选,特别是Adobe宣布2020年将停止对Flash的更新支持.本文记录一下如何在上传文件的时候,传递自定义参数. 了解到两种方式,一种 ...
- 14 道 JavaScript 题?
http://perfectionkills.com/javascript-quiz/ https://www.zhihu.com/question/34079683 著作权归作者所有.商业转载请联系 ...