[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中加入数据扰动层 ...
随机推荐
- Android adb logcat使用技巧
前言 新买的笔记本E431装了最新版的Eclipse,搞定了Android开发环境,可是logcat里查看东西居然仅仅显示level,没有错误的具体信息.我本身也不是一个愿意折腾图形界面,更喜欢纯命令 ...
- Revit API切换三维视图
切换视图必须在事务结束之后,这个困惑了半天,记录一下. , , -));//斜视45度 ts.Commit(); //切换视图必须在事务结束后,否则会提 ...
- 如何给Windows Server 2012 R2 添加“磁盘清理”选项
最近想做一个试验,把我的Windows Server 2008 R2 升级为Server 2012 R2,因为手头没有Raid卡和网卡的驱动,所以做了升级安装,于是那个讨厌的Windows.old出现 ...
- UIImageView 详解
1.//设置 圆角 userhead.layer.masksToBounds = YES; userhead.layer.cornerRadius = 6.0; userhead.layer.bord ...
- C++ 继承体系中的名称覆盖
首先一个简单的样例: int x; int f() { double x; cin >> x; return x; } 在上述代码中.函数f的局部变量x掩盖了全局变量x.这得从 " ...
- 使用系统自带的 UIRefreshControl 实现下拉刷新
UIRefreshControl 为 UITableViewController 中的一个属性,从以下可以看出, IOS6.0 以上才支持. @property (nonatomic,retain) ...
- maven的groupid和artifactId
groupid和artifactId被统称为“坐标”是为了保证项目唯一性而提出的,如果你要把你项目弄到maven本地仓库去,你想要找到你的项目就必须根据这两个id去查找. groupId一般分为多个段 ...
- Mac与Mac之中的共享方式
前往 ---> 连接服务器 ---> 输入smb://带连接的服务器地址(smb://192.168.1.40)即可
- ArcGIS教程:树状图
摘要 构造可显示特征文件里连续合并类之间的属性距离的树示意图(树状图). 使用方法 · 输入特征文件必须採用预定的特征文件格式. 特征文件可使用 Iso 聚类或创建特征工具来创建.该文件必须至少包括两 ...
- 详细解读Volley(一)—— 基本Request对象 & RequestQueue
Volley它非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕.所以不建议用它去进行下载文件.加载大图的操作.有人可能会问,如 ...