canvas弹动2
在上一次的例子上加深一点点,这次我们选择动态的绑定目标点,三个目标相互转化,实现的思路是以拖拽点为目标计算出除了拖拽点以外的两个圆球的位置
以上个案例的公式,设点分别为A,B,C,当我拖拽点A时其余两个点都以A为目标点,所以会有种三角铁的感觉,但是因为我们在计算目标点之前会先计算角度,所以呈现出的是等边三角形的样子
还是老规矩,代码贴上
var canvas=document.getElementById("canvas");
var cxt=canvas.getContext("2d");
var spring=0.03;
var friction=0.95;
var springLength=100;
var targetX=targetY=0;
function Ball(x,y,radius,speed){
this.x=x;
this.y=y;
this.radius=radius;
this.vx=0;
this.vy=0;
}
var dx=dy=0;
var ball1=new Ball(Math.random()*canvas.width,Math.random()*canvas.height,10);
var ball2=new Ball(Math.random()*canvas.width,Math.random()*canvas.height,10);
var ball3=new Ball(Math.random()*canvas.width,Math.random()*canvas.height,10);
var ball1_dragging=false;
var ball2_dragging=false;
var ball3_dragging=false;
balles=[];
balles.push(ball1,ball2,ball3);
function animation(){
cxt.clearRect(0,0,canvas.width,canvas.height)
if(!ball1_dragging){
springTo(ball1,ball2);
springTo(ball1,ball3);
}
if(!ball2_dragging){
springTo(ball2,ball1);
springTo(ball2,ball3);
}
if(!ball3_dragging){
springTo(ball3,ball1);
springTo(ball3,ball2);
}
// if(ball1.x>canvas.width || ball1.x<0 || ball1.y<0 || ball1.y>canvas.height){
// ball1.x=canvas.width/2
// ball1.y=canvas.height/2
// ball2.x=canvas.width/2
// ball2.y=canvas.height/2
// ball3.x=canvas.width/2
// ball3.y=canvas.height/2
// }
balles.forEach(function(ball,i){
cxt.fillStyle="#EFEFEF"
cxt.beginPath();
cxt.arc(ball.x,ball.y,ball.radius,0,Math.PI*2,true);
cxt.fill();
})
cxt.beginPath();
cxt.strokeStyle="#fff";
cxt.moveTo(ball1.x,ball1.y);
cxt.lineTo(ball2.x,ball2.y);
cxt.lineTo(ball3.x,ball3.y);
cxt.lineTo(ball1.x,ball1.y);
cxt.stroke();
cxt.closePath();
requestAnimationFrame(animation);
}
function springTo(ballA,ballB){
dx=ballA.x-ballB.x;
dy=ballA.y-ballB.y;
var angle=Math.atan2(dy,dx);
targetX=ballB.x+Math.cos(angle)*springLength;
targetY=ballB.y+Math.sin(angle)*springLength;
ballA.vx+=(targetX-ballA.x)*spring;
ballA.vy+=(targetY-ballA.y)*spring;
ballA.vx*=friction;
ballA.vy*=friction;
ballA.x+=ballA.vx;
ballA.y+=ballA.vy;
}
function move(event){
if(ball1_dragging){
ball1.x=event.point.x;
ball1.y=event.point.y;
}
if(ball2_dragging){
ball2.x=event.point.x;
ball2.y=event.point.y;
}
if(ball3_dragging){
ball3.x=event.point.x;
ball3.y=event.point.y;
}
}
function down(event){
if(tool.isMoveRadius(event.point,ball1,ball1.radius))
ball1_dragging=true;
if(tool.isMoveRadius(event.point,ball2,ball2.radius))
ball2_dragging=true;
if(tool.isMoveRadius(event.point,ball3,ball3.radius))
ball3_dragging=true;
}
function up(event){
ball1_dragging=false;
ball2_dragging=false;
ball3_dragging=false;
}
window.onload=function(){
animation();
tool.MT(canvas,move,down,up)
}
canvas弹动2的更多相关文章
- canvas弹动
弹动,和缓动类似,不过是在终点前反复运动几次达到反弹的效果,具体的算法就是用目标点(target)和物体(mouse)的距离乘以系数累加至坐标上,这样就会有简单的弹动效果,但是一般的弹动效果都是慢慢变 ...
- canvas弹动效果
弹动效果,用物体与目标的距离乘上系数再累加至速度上,让物体呈加速度运动,再让速度乘与摩擦力系数,让物体最终停止运动 代码如下所示 var canvas = document.getElementByI ...
- canvas检测边界和弹动的实例
如图所示的效果,小球相互碰撞会相互弹开,这时要干的事就只有两件事了,一:用二次循环遍历小球是否互相碰撞,二:碰撞之后会弹向什么地方和弹出多少距离,第一件事我想学过二维数组循环的都没问题,第二件事也只是 ...
- Canvas学习笔记——弹动
如果有一根橡皮筋拴住一个小球,将小球拉开一定距离后释放,小球将会弹动.距离越远,橡皮筋对小球施加的外力越大,小球的加速度就越大.也就是说,小球的加速度与距离是成正比例关系的.这和缓动很相似,缓动是速度 ...
- SkiaSharp 之 WPF 自绘 弹动小球(案例版)
没想到粉丝对界面效果这么喜欢,接下来就尽量多来点特效,当然,特效也算是动画的一部分了.WPF里面已经包含了很多动画特效的功能支持了,但是,还是得自己实现,我这边就来个自绘实现的. 弹动小球 弹动小球是 ...
- SkiaSharp 之 WPF 自绘 五环弹动球(案例版)
此案例基于拖曳和弹动球两个技术功能实现,如有不懂的可以参考之前的相关文章,属于递进式教程. 五环弹动球 好吧,名字是我起的,其实,你可以任意个球进行联动弹动,效果还是很不错的,有很多前端都是基于这个特 ...
- swift皮筋弹动发射飞机
今天在那个ios教程网上看到了一个不错的ios游戏源码,这是一个款采用swift实现的皮筋弹动发射飞机游戏源码,游戏源码比较详细,大家可以研究学习一下吧. <ignore_js_op> & ...
- 一款jQuery实现重力弹动模拟效果特效,弹弹弹,弹走IE6
一款jQuery实现重力弹动模拟效果特效 鼠标经过两块黑色div中间的红色线时,下方的黑快会突然掉落, 并在掉落地上那一刻出现了弹跳的jquery特效效果,非常不错,还兼容所有的浏览器, 适用浏览器: ...
- 移动端touch事件实现页面弹动--小插件
动手之前的打盹 说实话真的是好久没有更新博客了,最近一直赶项目,身心疲惫:最关键的是晚上还要回去上一波王者,实在是忙啊! 这周下来,清闲了些许,或许是因为要到国庆的缘故吧,大家都显得无精打采.俗话说的 ...
随机推荐
- Linux学习心得之 Linux下命令行Android开发环境的搭建
作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Linux学习心得之 Linux下命令行Android开发环境的搭建 1. 前言2. Jav ...
- 使用 Arduino 和 LM35 温度传感器监测温度
上一篇玩儿了一下Arduino入门,这次再进一步,用一下LM35温度传感器来监测当前温度.LM35温度传感器已经在Arduino入门套件里包含了,就是那个有三个脚的小黑块儿. 我们先把这些东西连起来. ...
- eclipse启动的时候报错 出现Java was started but returned exit code=13
eclipse启动的时候出现 这是你的jdk环境与你eclipse版本不匹配, 如果你的eclipse是32位的 jdk也得是32位的 重新安装一个比配的jdk就好了 如果你的jdk是解压版的 ...
- android常犯错误记录
错误:Error:Error: Found item Attr/border_width more than one time 这个容易,属性相同了,按照提示查询一下找出来删了就行了,注意大小写很容易 ...
- (转)[原] Android 自定义View 密码框 例子
遵从准则 暴露您view中所有影响可见外观的属性或者行为. 通过XML添加和设置样式 通过元素的属性来控制其外观和行为,支持和重要事件交流的事件监听器 详细步骤见:Android 自定义View步骤 ...
- 数据结构->冒泡排序
数据结构->冒泡排序 实现效果 从小到大排序 算法原理 重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到不再需要交换,也就是说该数列 ...
- 解决 安装cocoapods失败,提示 requires Ruby version >=2.2.2
步骤如下: rvm install ruby-2.2 但是,但是竟然报错了,具体我忘记额,但是是权限和brew的问题,那么我又转向修复brew: // 清理原来brew rm -rf /usr/loc ...
- MySQL 复制表
MySQL 复制表 如果我们需要完全的复制MySQL的数据表,包括表的结构,索引,默认值等. 如果仅仅使用CREATE TABLE ... SELECT 命令,是无法实现的. 本文将为大家介绍如何完整 ...
- 深入解析SQL Server并行执行原理及实践(下)
谈完并行执行的原理,咱们再来谈谈优化,到底并行执行能给我们带来哪些好处,我们又应该注意什么呢,下面展开. Amdahl’s Law 再谈并行优化前我想有必要谈谈阿姆达尔定律,可惜老爷子去年已经驾鹤先 ...
- thrift的lua实现
最近要进行系统升级,后台的数据是根据城市区分的.担心新系统的稳定性及新数据的准确性,计划部分城市采用新接口.接口的入参里没有城市信息,只有经纬度坐标,需要调用一个thrift接口来根据坐标获取城市信息 ...