Canvas 애니메이션의 요점

소개



지금은 HTML5 Canvas 공부를 시작했습니다.
Canvas API를 사용한 애니메이션 구현은 jQuery animate()css3 keyframes 라는 것과는 생각이 다릅니다. 처음 조사했을 때는 상당히 당황했기 때문에, 같은 분들을 위해 메모하고 싶습니다.

애니메이션 = 다시 그리기



Canvas에서는 편리한 애니메이션 방법은 없고, 단순히 그리기 자체를 반복하는 것으로 애니메이션을 실현시킵니다. 이미지로서는, 파라파라 만화와 같이 화면 자체가 차례차례로 바뀌어 가는 것일까요.

애니메이션 샘플





또한 ↓ 페이지에서 실제 움직임을 확인할 수 있습니다
h tp : //네코네코 완완. 기주 b. 이오/그래도/칸ゔぁs/아니마치온/

Canvas 애니메이션 절차



조금씩 다음과 같은 흐름이됩니다.
  • 요소 삭제
  • 요소 그리기
  • 요소 이동 (이동하는 위치 좌표 재정의)
  • 종료 플래그가 없으면 1.로 돌아온다

  • 샘플 코드



    index.html
    <canvas id="myCanvas" width="100" height="100"></canvas>
    

    script.js
    function drawLoopSquare() {
        /* Canvas要素の定義など */
        var cs  = document.getElementById('myCanvas');
        var ctx = cs.getContext('2d');
        var w = cs.width;
        var h = cs.height;
        var x = 0;
    
        /* 描画フロー */
        function render() {
            // Canvas全体をクリア
            ctx.clearRect(0, 0, w, h);
    
            // 要素を描画する
            ctx.beginPath();
            ctx.strokeRect(x, 0, 10, 10);
    
            // 要素を動かす
            // 四角形のx座標がCanvasの横幅を超えたら初期位置(x座標を0)へ
            // そうでなければ、x座標を1増やす
            if (x > cs.width) {
                x = 0;
            } else {
                x += 1;
            }
    
            // このrender関数を繰り返す
            // 下記どちらかを使った場合は、外側でrender()を実行する※1(もしくは即時実行)
            // setTimeout(render, 100);
            // requestAnimationFrame(render);
        }
        /* ※1 */
        // render();
    
        /* render()関数を繰り返す */
        /* setTimeout、requestAnimationFrameではなく、setIntervalを使う場合 */
        setInterval(render, 100);
    }
    drawLoopSquare();
    

    재묘화를 실시하기 위한 루프 메소드로서,
  • setInterval()
  • setTimeout()
  • requestAnimationFrame()

  • 가 자주 사용됩니다. 각각 다음과 같이 구분할 수 있습니다.
  • 정해진 시간에 루프를 하고 싶다: setInterval(), setTimeout()
  • 드로잉 부하를 억제하고 싶다.

  • requestAnimationFrame() 정보



    requestAnimationFrame()은 빠르고 CPU 친화적이지만 지원되지 않는 브라우저도 존재합니다.
    대응하기 위한 polyfill는 이하가 됩니다.
    window.requestAnimFrame = (function() {
      return (
          window.requestAnimationFrame       || 
          window.webkitRequestAnimationFrame || 
          window.mozRequestAnimationFrame    || 
          window.oRequestAnimationFrame      || 
          window.msRequestAnimationFrame     || 
          function(callback, time) {
            var time = time ? time: 1000 / 60;
            window.setTimeout(callback, time);
        }
      );
    })();
    

    또한 requestAnimationFrame은 글로벌이므로 경우에 따라 bind에서 this를 바인딩해야합니다.
    {
        update: function() {
            // 座標を変更する処理など
        },
        draw: function() {
            // 要素を描画する処理など
        },
        render: function() {
            this.update();
            this.draw();
            requestAnimationFrame(this.render.bind(this));  // 引数にthisを使うためにbind
        }
    }
    

    결론



    아직 알려지지 않은 것뿐이므로, 부정확한 곳이 있으면 코멘트나 편집 요구를 부탁합니다

    추가: 2015년 5월 19일



    Canvas 이벤트에 대해 별도의 기사를 썼습니다.
    h tp : // 쿠이타. 코 m / 고양이 고양이 완완 / ms / 9 a f7fb34d0fb7f9fc870 )

    좋은 웹페이지 즐겨찾기