LoginSignup
0
0

More than 3 years have passed since last update.

年末まで毎日webサイトを作り続ける大学生 〜56日目 Canvasを使って遊ぶ〜

Last updated at Posted at 2019-12-13

はじめに

こんにちは!@70days_jsです。

canvas内でボールが動き続けるものを作りました。
MDNにあるゲームを参考にしています。

今日は56日目。(2019/12/13)
よろしくお願いします。

サイトURL

やったこと

こんなことをやりました。(gif)↓
test3.gif

丸いボールがゆっくり動いています。
真ん中にある四角に入ると、ボールの色と大きさが変わり、軌道が消えます。
スペースキーを押すとボールのスピードが上がります。

html↓

  <body>
    <div>
      spaceを押した回数(ペースアップ): <span id="spaceClick">0</span></div>
    <canvas id="myCanvas" width="480" height="320"></canvas>
  </body>

canvasを使っています。

css↓

canvas {
  background: rgba(255, 255, 255, 0.5);
  border: solid 1px black;
}

canvasのレイアウトを変えたぐらいです。

JavaScript↓

var canvas = document.getElementById("myCanvas");
var ctx = canvas.getContext("2d");
var ballRadius = 5; //ボールの大きさ
var x = canvas.width / 2; //開始位置 X
var y = canvas.height / 3; //開始位置 Y
var dx = 1;
var dy = -1;
let color = "red";
let count = 0;
let spaceClick = document.getElementById("spaceClick");
document.addEventListener("keydown", space, false);

function drawBall() {
  ctx.beginPath();
  ctx.arc(x, y, ballRadius, 0, Math.PI * 2);
  ctx.rect(220, 140, 50, 50); //x, y , 幅、高さ

  if (x > 220 && x < 270 && (y > 140 && y < 190)) {
    randomBallSize();
    randomRGB();
    ctx.clearRect(0, 0, canvas.width, canvas.height);
  }
  ctx.fillStyle = color;
  ctx.fill(); //実行
  ctx.closePath();
}

function draw() {
  if (x + dx > canvas.width - ballRadius || x + dx < ballRadius) {
    dx = -dx;
  }
  if (y + dy > canvas.height - ballRadius || y + dy < ballRadius) {
    dy = -dy;
  }
  drawBall();
  x += dx;
  y += dy;
  requestAnimationFrame(draw);
}

//setInterval(draw, 10);

function space(e) {
  count++;
  spaceClick.innerHTML = count;
  if (e.keyCode == 32) {
    let fugou = Math.sign(dx);
    if (fugou === 1) {
      dx++;
    } else {
      dx--;
    }
    let fugou2 = Math.sign(dy);
    if (fugou2 === 1) {
      dy++;
    } else {
      dy--;
    }
    console.log("fugou: " + fugou);
  }
}

function randomRGB() {
  let r = Math.floor(Math.random() * 256);
  let g = Math.floor(Math.random() * 256);
  let b = Math.floor(Math.random() * 256);
  let rgb = "rgba(" + r + ", " + g + "," + b + ", .5)";
  color = rgb;
}

function randomBallSize() {
  let ball = Math.floor(Math.random() * 8);
  ballRadius = ball + 3;
}

draw();

drawBall()関数でボールを描いています。
中にあるif文は

if (x > 220 && x < 270 && (y > 140 && y < 190)) {

真ん中の四角の位置です。
この中に入ると

randomBallSize();
randomRGB();
ctx.clearRect(0, 0, canvas.width, canvas.height);

ボールのサイズを変更、色を変更、軌道を消します。

スペースキーの方はイベントリスナーで実装しています。

document.addEventListener("keydown", space, false);

変数dxとdyは速さを調整する変数で、これら絶対値を上げていくことでボールの速度を速くしています。

最後に、

requestAnimationFrame(draw);

この関数↑でアニメーションのフレームレートを自動で判断しています。
setInterval()よりこっちの方が効率よくていいですね。

感想

やっぱりゲームみたいな描画系はcanvasを使うべきなんだなと思いました。
canvasだとチャートとか、他にも色々作れそうなので勉強してみようかな。。

最後まで読んでいただきありがとうございます。明日も投稿しますのでよろしくお願いします。

参考

1.仕上げ - ゲーム開発 | MDN

MDNさん今回もお世話になりました!ありがとうございます!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0