当前位置: 首页 > Web前端 > HTML5

[Fes]基于Canvas的前端动画-游戏介绍(四)

时间:2023-04-05 16:57:50 HTML5

越界检测假设物体是一个圆,如图,圆心坐标为x对象的-轴和y轴坐标。越界是一种常见的场景,一般有两种越界场景:一种是整个物体移出区域;另一种是物体触及区域的边界。下面以画布边界为例进行讨论。在例子中,矩形边界是:lettop=0;让bottom=canvas.height;让左=0;让right=canvas.width;如果是出界,则出界条件可以如下获取,下列任意一项为真判定出界。//右侧超出范围object.x-object.width/2>right//左侧超出范围object.x+object.width/2bottom物体触及区域边界,即使物体触及区域边界也是出界,并且出界条件如下,下列任何一项为真判定出界。//右侧超出范围object.x+object.width/2>right//左侧超出范围object.x-object.width/2bottomoutofbounds怎么办?移走物体是最简单的处理方式,属于整个物体移出区域才算越界的情况。下面的例子会先批量创建球,保存在balls数组中。每个动画循环都会遍历这个数组,依次输入draw()函数,改变小球的位置,检查是否出界。下面只列出draw()函数的代码。完整示例:清除界外圆functiondraw(ball,pos){//根据球的速度改变球的位置ball.x+=ball.vx;ball.y+=ball.vy;//检查是否(ball.x-ball.radius>canvas.width||ball.x+ball.radius<0||ball.y-ball.radius>canvas.height||ball.y+ball.radius<0){//在清空数组balls.splice(pos,1)中的越界球;//打印提示if(balls.length>0){log.value+=`Removed${ball.id}\n`;log.scrollTop=log.scrollHeight;}else{log.value+='全部消失!\n';}}//画球ball.draw(context);}把它的对象放回边界内,这是整个对象移出区域才算越界的情况。下面的例子同样将创建的球保存在balls数组中,但是球的初始位置是画布中间的下部。如果检测到球出界,球的位置将被重置。下面只列出draw()函数的代码。完整示例:colorfountainfunctiondraw(ball){//根据球的速度改变球的位置,包括伪重力ball.vy+=gravity;ball.x+=ball.vx;ball.y+=球。维;//检查是否越界if(ball.x-ball.radius>canvas.width||ball.x+ball.radius<0||ball.y-ball.radius>canvas.height||ball.y+ball.radius<0){//重置球的位置ball.x=canvas.width/2;ball.y=canvas.height;//重置球的速度ball.vx=Math.random()*6-3;ball.vy=Math.random()*-10-10;//打印提示log.value=`Reset${ball.id}\n`;}//画球ball.draw(context);}ScreenSurround这是整个对象在被认为越界之前移出区域的情况。屏幕环绕就是让同一个物体出现在边界内的另一个位置,如果一个物体离开屏幕的左侧,它会重新出现在屏幕的右侧,反之亦然,上下也是如此.这里比上一个稍微复杂一点,判断物体跳跃的边界。伪代码如下:if(object.x-object.width/2>right){object.x=left-object.width/2;}elseif(object.x+object.width/2bottom){object.y=top-object.height/2;}elseif(object.y+object.height/2right){ball.x=right-ball.radius;vx*=-1;}elseif(ball.x-ball.radiusbottom){ball.y=bottom-ball.radius;vy*=-1;}elseif(ball.y-ball.radiusright){constdx=ball.x-(right-ball.radius);constdy=Math.tan(角度)*dx;ball.x=right-ball.radius;球.y+=dy;vx*=弹跳;}elseif(ball.x-ball.radiusbottom){constdy=ball.y-(bottom-ball.radius);constdx=dy/Math.tan(角度);ball.y=bottom-ball.radius;ball.x+=dx;vy*=弹跳;}elseif(ball.y-ball.radiusrect.x+rect.width||yrect.y+rect.height);};distance-basedcollisiondetection一般用于检测圆形碰撞。原理是判断两个物体距离是否足够近而发生碰撞。对于一个圆,只要两个圆心之间的距离小于两个圆的半径之和,我们就可以判断为碰撞。中心距可以通过勾股定理求得。核心代码如下:完整示例:两圆基于距离的碰撞演示constdx=ballB.x-ballA.x;constdy=ballB.y-ballA.y;constdist=Math.sqrt(dx**2+dy**2);if(dist