zoukankan      html  css  js  c++  java
  • 动画原理——用户交互:移动物体

    书籍名称: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

  • 相关阅读:
    聚会
    Wannafly summer camp Day2
    HDU6627 equation
    2019牛客暑期多校D.Big Integer
    对主席树的理解以及使用
    2019牛客暑期多校训练营(第四场)C.sequence(单调栈+线段树)
    2019 Multi-University Training Contest 1
    浅谈序列自动机
    2019江西省程序设计竞赛
    拉格朗日插值的应用
  • 原文地址:https://www.cnblogs.com/winderby/p/4259596.html
Copyright © 2011-2022 走看看