动画原理——用户交互:移动物体

书籍名称:HTML5-Animation-with-JavaScript

书籍源码:https://github.com/lamberta/html5-animation1

1.物体内外的事件

判断物体内外的条件是判断鼠标位置和物体中心的位置。

01-mouse-events.html

<!doctype html>

<html>

  <head>

    <meta charset="utf-8">

    <title>Mouse Events</title>

    <link rel="stylesheet" href="../include/style.css">

  </head>

  <body>

    <header>

      Example from <a href="http://amzn.com/1430236655?tag=html5anim-20"><em>Foundation HTML5 Animation with JavaScript</em></a>

    </header>

    <canvas id="canvas" width="400" height="400"></canvas>

    <textarea id="log"></textarea>

    <aside>Move and press mouse inside and outside of circle.</aside>



    <script src="../include/utils.js"></script>

    <script src="./classes/ball.js"></script>

    <script>

    window.onload = function () {

      var canvas = document.getElementById('canvas'),

          context = canvas.getContext('2d'),

          mouse = utils.captureMouse(canvas),

          log = document.getElementById('log'),

          ball = new Ball();



      ball.x = canvas.width / 2;

      ball.y = canvas.height / 2;

      ball.draw(context);

      

      canvas.addEventListener('mousedown', function () {

        if (utils.containsPoint(ball.getBounds(), mouse.x, mouse.y)) {

          log.value = "in ball: mousedown";

        } else {

          log.value = "canvas: mousedown";

        }

      }, false);



      canvas.addEventListener('mousemove', function () {

        if (utils.containsPoint(ball.getBounds(), mouse.x, mouse.y)) {

          log.value = "in ball: mousemove";

        } else {

          log.value = "canvas: mousemove";

        }

      }, false);



      canvas.addEventListener('mouseup', function () {

        if (utils.containsPoint(ball.getBounds(), mouse.x, mouse.y)) {

          log.value = "in ball: mouseup";

        } else {

          log.value = "canvas: mouseup";

        }

      }, false);

    };

    </script>

  </body>

</html>
View Code

手机事件

02-touch-events.html

<!doctype html>

<html>

  <head>

    <meta charset="utf-8">

    <title>Touch Events</title>

    <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no">

    <link rel="stylesheet" href="../include/style.css">

  </head>

  <body>

    <header>

      Example from <a href="http://amzn.com/1430236655?tag=html5anim-20"><em>Foundation HTML5 Animation with JavaScript</em></a>

    </header>

    <canvas id="canvas" width="400" height="400"></canvas>

    <textarea id="log"></textarea>

    <aside>Press and move touch inside and outside of circle (touch-capable device required).</aside>



    <script src="../include/utils.js"></script>

    <script src="./classes/ball.js"></script>

    <script>

    window.onload = function () {

      var canvas = document.getElementById('canvas'),

          context = canvas.getContext('2d'),

          touch = utils.captureTouch(canvas),

          log = document.getElementById('log'),

          ball = new Ball();



      ball.x = canvas.width / 2;

      ball.y = canvas.height / 2;

      ball.draw(context);

      

      canvas.addEventListener('touchstart', function (event) {

        event.preventDefault();

        if (utils.containsPoint(ball.getBounds(), touch.x, touch.y)) {

          log.value = "in ball: touchstart";

        } else {

          log.value = "canvas: touchstart";

        }

      }, false);



      canvas.addEventListener('touchend', function (event) {

        event.preventDefault();

        log.value = "canvas: touchend";

      }, false);



      canvas.addEventListener('touchmove', function (event) {

        event.preventDefault();

        if (utils.containsPoint(ball.getBounds(), touch.x, touch.y)) {

          log.value = "in ball: touchmove";

        } else {

          log.value = "canvas: touchmove";

        }

      }, false);

    };

    </script>

  </body>

</html>
View Code

2.拖动

将鼠标的位置设置给物体的位置

03-mouse-move-drag.html

View Code

3.将拖动交互和运动效果合并

04-drag-and-move-1.html

<!doctype html>

<html>

  <head>

    <meta charset="utf-8">

    <title>Drag and Move 1</title>

    <link rel="stylesheet" href="../include/style.css">

  </head>

  <body>

    <header>

      Example from <a href="http://amzn.com/1430236655?tag=html5anim-20"><em>Foundation HTML5 Animation with JavaScript</em></a>

    </header>

    <canvas id="canvas" width="400" height="400"></canvas>

    <aside>Press and drag circle with mouse.</aside>



    <script src="../include/utils.js"></script>

    <script src="./classes/ball.js"></script>

    <script>

    window.onload = function () {

      var canvas = document.getElementById('canvas'),

          context = canvas.getContext('2d'),

          mouse = utils.captureMouse(canvas),

          ball = new Ball(),

          vx = Math.random() * 10 - 5,

          vy = -10,

          bounce = -0.7,

          gravity = 0.2,

          isMouseDown = false;



      ball.x = canvas.width / 2;

      ball.y = canvas.height / 2;

      

      canvas.addEventListener('mousedown', function () {

        if (utils.containsPoint(ball.getBounds(), mouse.x, mouse.y)) {

          isMouseDown = true;

          canvas.addEventListener('mouseup', onMouseUp, false);

          canvas.addEventListener('mousemove', onMouseMove, false);

        }

      }, false);

      

      function onMouseUp () {

        isMouseDown = false;

        canvas.removeEventListener('mouseup', onMouseUp, false);

        canvas.removeEventListener('mousemove', onMouseMove, false);

      }

      

      function onMouseMove (event) {

        ball.x = mouse.x;

        ball.y = mouse.y;

      }



      function checkBoundaries () {

        var left = 0,

            right = canvas.width,

            top = 0,

            bottom = canvas.height;

        

        vy += gravity;

        ball.x += vx;

        ball.y += vy;

        //boundary detect and bounce

        if (ball.x + ball.radius > right) {

          ball.x = right - ball.radius;

          vx *= bounce;

        } else if (ball.x - ball.radius < left) {

          ball.x = left + ball.radius;

          vx *= bounce;

        }

        if (ball.y + ball.radius > bottom) {

          ball.y = bottom - ball.radius;

          vy *= bounce;

        } else if (ball.y - ball.radius < top) {

          ball.y = top + ball.radius;

          vy *= bounce;

        }

      }



      (function drawFrame () {

        window.requestAnimationFrame(drawFrame, canvas);

        context.clearRect(0, 0, canvas.width, canvas.height);

        

        if (!isMouseDown) {

          checkBoundaries();

        }

        ball.draw(context);

      }());

    };

    </script>

  </body>

</html>
View Code

05-drag-and-move-2.html

解决每次拖动速度不清零的问题

<!doctype html>

<html>

  <head>

    <meta charset="utf-8">

    <title>Drag and Move 2</title>

    <link rel="stylesheet" href="../include/style.css">

  </head>

  <body>

    <header>

      Example from <a href="http://amzn.com/1430236655?tag=html5anim-20"><em>Foundation HTML5 Animation with JavaScript</em></a>

    </header>

    <canvas id="canvas" width="400" height="400"></canvas>

    <aside>Press and drag circle with mouse.</aside>

    

    <script src="../include/utils.js"></script>

    <script src="./classes/ball.js"></script>

    <script>

    window.onload = function () {

      var canvas = document.getElementById('canvas'),

          context = canvas.getContext('2d'),

          mouse = utils.captureMouse(canvas),

          ball = new Ball(),

          vx = Math.random() * 10 - 5,

          vy = -10,

          bounce = -0.7,

          gravity = 0.2,

          isMouseDown = false;



      ball.x = canvas.width / 2;

      ball.y = canvas.height / 2;

      

      canvas.addEventListener('mousedown', function () {

        if (utils.containsPoint(ball.getBounds(), mouse.x, mouse.y)) {

          isMouseDown = true;

          vx = vy = 0;

          canvas.addEventListener('mouseup', onMouseUp, false);

          canvas.addEventListener('mousemove', onMouseMove, false);

        }

      }, false);

      

      function onMouseUp () {

        isMouseDown = false;

        canvas.removeEventListener('mouseup', onMouseUp, false);

        canvas.removeEventListener('mousemove', onMouseMove, false);

      }

      

      function onMouseMove (event) {

        ball.x = mouse.x;

        ball.y = mouse.y;

      }



      function checkBoundaries () {

        var left = 0,

            right = canvas.width,

            top = 0,

            bottom = canvas.height;

        

        vy += gravity;

        ball.x += vx;

        ball.y += vy;

        //boundary detect and bounce

        if (ball.x + ball.radius > right) {

          ball.x = right - ball.radius;

          vx *= bounce;

        } else if (ball.x - ball.radius < left) {

          ball.x = left + ball.radius;

          vx *= bounce;

        }

        if (ball.y + ball.radius > bottom) {

          ball.y = bottom - ball.radius;

          vy *= bounce;

        } else if (ball.y - ball.radius < top) {

          ball.y = top + ball.radius;

          vy *= bounce;

        }

      }



      (function drawFrame () {

        window.requestAnimationFrame(drawFrame, canvas);

        context.clearRect(0, 0, canvas.width, canvas.height);



        if (!isMouseDown) {

          checkBoundaries();

        }

        ball.draw(context);

      }());

    };

    </script>

  </body>

</html>
View Code

4.抛

存储物体的位置,两帧中两个物体的位移即为物体的初始速度。

<!doctype html>

<html>

  <head>

    <meta charset="utf-8">

    <title>Throwing</title>

    <link rel="stylesheet" href="../include/style.css">

  </head>

  <body>

    <header>

      Example from <a href="http://amzn.com/1430236655?tag=html5anim-20"><em>Foundation HTML5 Animation with JavaScript</em></a>

    </header>

    <canvas id="canvas" width="400" height="400"></canvas>

    <aside>Press, drag, and throw circle with mouse.</aside>



    <script src="../include/utils.js"></script>

    <script src="./classes/ball.js"></script>

    <script>

    window.onload = function () {

      var canvas = document.getElementById('canvas'),

          context = canvas.getContext('2d'),

          mouse = utils.captureMouse(canvas),

          ball = new Ball(),

          vx = Math.random() * 10 - 5,

          vy = -10,

          bounce = -0.7,

          gravity = 0.2,

          isMouseDown = false,

          oldX, oldY;



      ball.x = canvas.width / 2;

      ball.y = canvas.height / 2;

      

      canvas.addEventListener('mousedown', function () {

        if (utils.containsPoint(ball.getBounds(), mouse.x, mouse.y)) {

          isMouseDown = true;

          oldX = ball.x;

          oldY = ball.y;

          canvas.addEventListener('mouseup', onMouseUp, false);

          canvas.addEventListener('mousemove', onMouseMove, false);

        }

      }, false);

      

      function onMouseUp () {

        isMouseDown = false;

        canvas.removeEventListener('mouseup', onMouseUp, false);

        canvas.removeEventListener('mousemove', onMouseMove, false);

      }

      

      function onMouseMove (event) {

        ball.x = mouse.x;

        ball.y = mouse.y;

      }



      function trackVelocity () {

        vx = ball.x - oldX;

        vy = ball.y - oldY;

        oldX = ball.x;

        oldY = ball.y;

      }



      function checkBoundaries () {

        var left = 0,

            right = canvas.width,

            top = 0,

            bottom = canvas.height;

        

        vy += gravity;

        ball.x += vx;

        ball.y += vy;

        //boundary detect and bounce

        if (ball.x + ball.radius > right) {

          ball.x = right - ball.radius;

          vx *= bounce;

        } else if (ball.x - ball.radius < left) {

          ball.x = left + ball.radius;

          vx *= bounce;

        }

        if (ball.y + ball.radius > bottom) {

          ball.y = bottom - ball.radius;

          vy *= bounce;

        } else if (ball.y - ball.radius < top) {

          ball.y = top + ball.radius;

          vy *= bounce;

        }

      }



      (function drawFrame () {

        window.requestAnimationFrame(drawFrame, canvas);

        context.clearRect(0, 0, canvas.width, canvas.height);

        

        if (isMouseDown) {

          trackVelocity();

        } else {

          checkBoundaries();

        }

        ball.draw(context);

      }());

    };

    </script>

  </body>

</html>
View Code

 

06-throwing.html

你可能感兴趣的:(用户)