十八.2弹性动画 小球,悠悠球

先上demo

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script src="js/tools.js"></script>
    <script src="js/ball.js"></script>
    <script type="text/javascript">
        function $$(id) {
            return document.getElementById(id);
        }
        window.onload = function () {
            var cnv = $$("canvas");
            var cxt = cnv.getContext("2d");

            //初始化数据
            var ball = new Ball(0, cnv.height / 2);
            var targetX = cnv.width / 2;
            var spring = 0.02;
            var vx = 0;

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

                var ax = (targetX - ball.x) * spring;
                vx += ax;
                ball.x += vx;

                ball.fill(cxt);
            })();
        }
    </script>
</head>
<body>
    <canvas id="canvas" width="200" height="150" style="border:1px solid silver;"></canvas>
</body>
</html>

对比对比缓动动画在线demo:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script src="js/tools.js"></script>
    <script src="js/ball.js"></script>
    <script type="text/javascript">
        function $$(id) {
            return document.getElementById(id);
        }
        window.onload = function () {
            var cnv = $$("canvas");
            var cxt = cnv.getContext("2d");

            var ball = new Ball(0, cnv.height / 2);
            //定义终点的X轴坐标
            var targetX = cnv.width * (3 / 4);
            //定义缓动系数
            var easing = 0.05;

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

                var vx = (targetX - ball.x) * easing;
                ball.x += vx;

                ball.fill(cxt);
            })();
        }
    </script>
</head>
<body>
    <canvas id="canvas" width="200" height="150" style="border:1px solid silver;"></canvas>
</body>
</html>

差异(弹性动画修改的是加速度):

//缓动动画
var vx = (targetX - ball.x) * easing;
ball.x += vx;
//弹性动画
 var ax = (targetX - ball.x) * easing;
vx += ax;//弹性动画修改的是加速度
ball.x += vx;

关键地方已经打通,弹性动画中跟距离成正比的是加速度。物体距离终点越远,加速度越快(想想下橡皮筋拉着一个小球,小球距离手指越远的时候加速度越快)

过程:

1.由于加速度的影响,速度会增大(速度+加速度)

2.物体距离终点越大,加速度越大(目标值减去小球的位置)

3.当物体接近终点的时候,加速度变得很小,但是它还在加速运动,越过终点

4当越过目标距离几乎等于物体初始位置终点距离的的时候 (targetX - ball.x 小位置比目标值大,得到加速度为负值),加速度开始为负值,物体反方向运动

语法:

ax=(targetX-obj.x)*easing;

ay=(targetY-obj.y)*easing;

vx+=ax;

vy+=ay;

vx*=firction;

vy*=firction;

obj.x+=vx;

obj.y+=vy;

firction为摩擦力。文章第一个demo因为没有摩擦力所以一直不会停下来,下面我们看下添加了摩擦力的弹性运动

在线demo


<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script src="js/tools.js"></script>
    <script src="js/ball.js"></script>
    <script type="text/javascript">
        function $$(id) {
            return document.getElementById(id);
        }
        window.onload = function () {
            var cnv = $$("canvas");
            var cxt = cnv.getContext("2d");

            var ball = new Ball(0, cnv.height / 2);
            var targetX = cnv.width / 2;
            var spring = 0.02;
            var vx = 0;
            var friction = 0.95;

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

                var ax = (targetX - ball.x) * spring;
                vx += ax;
                vx *= friction;
                ball.x += vx;

                ball.fill(cxt);
            })();

        }
    </script>
</head>
<body>
    <canvas id="canvas" width="200" height="150" style="border:1px solid silver;"></canvas>
</body>
</html>

铛铛......铛铛......................是不是马上画风变了。。。。。。。。。。更真实了




猜你喜欢

转载自blog.csdn.net/u014071104/article/details/79427102