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

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

转载于:https://www.cnblogs.com/winderby/p/4259596.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值