Canvas实现物体抛掷

  接着上一篇文章,基于参考文献,继续学习在Canvas中实现物体抛掷,为了不使物体一直运动下去,程序中还增加了重力及反弹损耗的影响。
  物体抛掷的逻辑是用户用鼠标拖拽物体,拖拽一段距离后松开鼠标,而后物体根据惯性移动,受重力、反弹消耗及四周边界的限制,物体最终停止移动。在此过程中主要包括以下功能点:

  • 物体捕获:该功能参照上一篇文章即可实现;
  • 物体拖拽:同样参考上一篇文章实现;
  • 物体加速度:在物体拖拽过程中,通过计算当前帧和上一帧中的物体圆心位置差值而来,包括x方向和y方向的加速度;
  • 边界限制:物体移动过程中(不论是拖拽还是自由运动)不能超出边界范围,主要通过计算物体的圆心、半径及Canvas的边界值得出;
  • 松开鼠标后的物体速度:通过综合计算物体加速度、重力和反弹损耗得出。

  程序的关键代码如下所示(主要借鉴自参考文献):

			var cnv=$$("canvas");
            var cxt=cnv.getContext("2d");            
            var mouse=tools.getMouse(cnv);
            ...
            ...
            var ballX=cnv.width/2;
            var ballY=cnv.height/2;
            var ballR=20;
            var isMouseDown=false;
            ...
            var oldballX,oldballY;//记录上一帧中的物体圆心位置
            var vx=0,vy=0;//记录物体x、y方向的加速度
            var gravity=1.5;//重力值
            var bounce=-0.8;//反弹消耗系数
            ...
            ...            

            cnv.addEventListener("mousedown",function()
            {
                if(window.tools.CheckMouse(mouse,ballX,ballY,ballR))
                {
                    isMouseDown=true;
                    oldballX=ballX;
                    oldballY=ballY;
                    ...
					...
                    txt.innerHTML="捕获成功";
                }  
                else
                {
                    txt.innerHTML="";
                }              
            },false);            

            function onMouseUp()
            {
                isMouseDown=false;
                ...
                ...
            }

            (function frame()
            {
                window.requestAnimationFrame(frame);
                cxt.clearRect(0,0,cnv.width,cnv.height);

                if(isMouseDown)//拖拽物体运动
                {
                	//计算加速度
                    vx=ballX-oldballX;
                    vy=ballY-oldballY;
					
					//记录本帧中的圆心位置
                    oldballX=ballX;
                    oldballY=ballY;
                }
                else//物体自由运动
                {
                    vy+=gravity;
                    ballX+=vx;
                    ballY+=vy;
					
					//边界限制,同时反弹时基于反弹消耗系数降低加速度
                    if(ballX<ballR)
                    {
                        ballX=ballR;
                        vx=vx*bounce;
                    }
                    else if(ballX>cnv.width-ballR)
                    {
                        ballX=cnv.width-ballR;
                        vx=vx*bounce;
                    }

                    if(ballY<ballR)
                    {
                        ballY=ballR;
                        vy=vy*bounce;;
                    }
                    else if(ballY>cnv.height-ballR)
                    {
                        ballY=cnv.height-ballR;
                        vy=vy*bounce;;
                    }					
                }
				...
				...
            })();        

  物体抛掷效果如下所示:
在这里插入图片描述

参考文献:
[1]从0到1 HTML5 Canvas动画开发

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Canvas是HTML5中新增的元素,它可以用来在网页上绘制图形,制作动画等。通过JavaScript脚本,我们可以在Canvas上绘制各种图形,如线条、矩形、圆形、文字等。CanvasCanvas是HTML5中新增的元素,它可以用来在网页上绘制图形,制作动画等。通过JavaScript脚本,我们可以在Canvas上绘制各种图形,如线条、矩形、圆形、文字等。Canvas的绘图原理是在网页上创建一个画布,然后通过JavaScript脚本来控制画布上的像素,从而实现各种绘图效果。Canvas的使用非常灵活,可以通过CSS样式来设置画布的大小和位置,也可以通过JavaScript脚本来动态地改变画布的属性和内容。 下面是一个简单的Canvas绘图示例: 引用: <canvas id="tutorial" width="300" height="300"></canvas> <script type="text/javascript"> function draw(){ var canvas = document.getElementById('tutorial'); if(!canvas.getContext) return; var ctx = canvas.getContext("2d"); //开始代码 ctx.fillStyle = "red"; ctx.fillRect(10, 10, 50, 50); //结束代码 } draw(); </script> 这段代码创建了一个300x300的Canvas画布,并在画布上绘制了一个红色的矩形。其中,ctx是Canvas的上下Canvas是HTML5中新增的元素,它可以用来在网页上绘制图形,制作动画等。通过JavaScript脚本,我们可以在Canvas上绘制各种图形,如线条、矩形、圆形、文字等。Canvas的绘图原理是在网页上创建一个画布,然后通过JavaScript脚本来控制画布上的像素,从而实现各种绘图效果。Canvas的使用非常灵活,可以通过CSS样式来设置画布的大小和位置,也可以通过JavaScript脚本来动态地改变画布的属性和内容。 下面是一个简单的Canvas绘图示例: 引用: <canvas id="tutorial" width="300" height="300"></canvas> <script type="text/javascript"> function draw(){ var canvas = document.getElementById('tutorial'); if(!canvas.getContext) return; var ctx = canvas.getContext("2d"); //开始代码 ctx.fillStyle = "red"; ctx.fillRect(10, 10, 50, 50); //结束代码 } draw(); </script> 这段代码创建了一个300x300的Canvas画布,并在画布上绘制了一个红色的矩形。其中,ctx是Canvas的上下文对象,通过它可以控制画布上的像素。 另外,Canvas还可以通过JavaScript脚本来实现动态效果,如引用所示。这段代码创建了一个1000x1000的Canvas画布,并通过JavaScript脚本来实现动态效果。 引用展示了如何使用for循环来实现Canvas的绘图。在这段代码中,我们使用循环来重复绘制一条线段,从而实现了一种简单的图形效果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值