1. ホーム
  2. Web制作
  3. html5

キャンバスでDVDスタンバイのアニメーションを作成するコード

2022-02-07 09:56:18

免責事項

キャンバスを教えるつもりはありません。ただ、簡単に見てみると面白いと思っただけです。

若干荒いということなので、スプレーはしないでください。

効果

若干のフレームレートの低下、もちろん現実にはもっとスムーズです。

HTMLの実装

<!DOCTYPE html>
<head>
  <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum- scale=1.0">
  <style>
    * {margin: 0;padding: 0;}
    body {background-color: lightblue;}
    #canvas {background-color: black;width: 100vw;}
  </style>
</head>
<body>
  <canvas id="canvas"></canvas>
  <script>/* see below */</script>
</body>

JS

window.onload = function () {
  let
    // canvas
    ctx = document.getElementById('canvas').getContext('2d'),
    // canvas size
    canvas_width = document.getElementById('canvas').width,
    canvas_height = document.getElementById('canvas').height,
    // Text color, font, background color of DVD icons
    text_color = ['green', 'blue', 'purple', 'yellow', 'white', 'yellow', 'white'],
    text_font = 'italic bold 50px yahei',
    background_color = ['red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet'],
    // size of the background rectangle
    background_width = 110,
    background_height = 50,
    // The height is a bit off when adding text to the rectangle
    fix_height = 7,
    // speed, each redraw moves 0.5 px
    speed_x = 0.5,
    speed_y = 0.5,
    // direction of movement, initially 'r-b' right down
    direction = 'r-b',
    // icon x and y coordinates, initially 0
    position_x = 0,
    position_y = 0,
    // number of collisions, used to calculate background and text color
    count = 0

  dvd()

  function dvd() {
    // Direction of movement
    switch (direction) {
      // right down
      case 'r-b':
        position_x += speed_x
        position_y += speed_y
        break
      // top right
      case 'r-t':
        position_x += speed_x
        position_y -= speed_y
        break
      // Lower left
      case 'l-b':
        position_x -= speed_x
        position_y += speed_y
        break
      // top left
      case 'l-t':
        position_x -= speed_x
        position_y -= speed_y
        break
    }
    // Clear the canvas
    ctx.clearRect(0, 0, canvas_width, canvas_height)
    // Redraw
    ctx.fillRect(position_x, position_y, background_width, background_height)
    // Collision detection
    // Bottom
    if (position_y + background_height >= canvas_height) {
      direction = direction.replace('b', 't')
      // Collision count
      count += 1
    }
    // right
    if (position_x + background_width >= canvas_width) {
      direction = direction.replace('r', 'l')
      count += 1
    }
    // left
    if (position_x < 0) {
      direction = direction.replace('l', 'r')
      count += 1
    }
    // up
    if (position_y < 0) {
      direction = direction.replace('t', 'b')
      count += 1
    }
    // Text
    ctx.font = text_font
    ctx.fillStyle = text_color[count % 7]
    ctx.fillText("DVD", position_x, position_y + background_height - fix_height)
    // Background color
    ctx.fillStyle = background_color[count % 7]
    // Start the animation
    window.requestAnimationFrame(dvd)
  }
}

以上、本記事の全内容をご紹介しましたが、皆様の学習のお役に立てれば幸いです。また、Script Houseをより一層ご支援いただければ幸いです。