首页 > 代码库 > 动画原理——用户交互:移动物体

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

书籍名称: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, onm ouseUp, false);          canvas.addEventListener(mousemove, onm ouseMove, false);        }      }, false);            function onm ouseUp () {        isMouseDown = false;        canvas.removeEventListener(mouseup, onm ouseUp, false);        canvas.removeEventListener(mousemove, onm ouseMove, false);      }            function onm ouseMove (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, onm ouseUp, false);          canvas.addEventListener(mousemove, onm ouseMove, false);        }      }, false);            function onm ouseUp () {        isMouseDown = false;        canvas.removeEventListener(mouseup, onm ouseUp, false);        canvas.removeEventListener(mousemove, onm ouseMove, false);      }            function onm ouseMove (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, onm ouseUp, false);          canvas.addEventListener(mousemove, onm ouseMove, false);        }      }, false);            function onm ouseUp () {        isMouseDown = false;        canvas.removeEventListener(mouseup, onm ouseUp, false);        canvas.removeEventListener(mousemove, onm ouseMove, false);      }            function onm ouseMove (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

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