自動で動くノーツに合わせてスペースキーを押すと「HIT!」と表示されるjavascript

音楽ゲームをつくりたいので、勉強します。

下記のサイトのコードがそれぞれどういう理由で書かれているか考えようと思います。
「ツナドーナツ・技術メモ帳 音ゲーを作りたい1」
https://iwanax.hatenadiary.jp/entry/2017/05/09/231559

 function SquareLoop() {
    var canvas = document.getElementById("canvas");
    var ctx = canvas.getContext('2d');
    var x = 240;
    var y = 0;
    var bottom = canvas.height - 80;
    var speed = 5;
    var sizeX = 40;
    var sizeY = 12;
    var hitSizeY = 15;
    var spaceFlag = false;
    var num = 0;
    /*キーボード操作の制御*/
    document.addEventListener("keydown", KeyDownFunc);
    document.addEventListener("keyup", KeyUpFunc);
    ctx.font = "16px Arial";

    function render() {
      if(y >= canvas.height - 50){
        y = 0;
      }else{
        y += speed;
      }
      ctx.clearRect(0, 0, canvas.width, canvas.height - 38);
      ctx.strokeRect(x, bottom, sizeX, sizeY);
      ctx.beginPath();
      ctx.fillRect(x, y, sizeX, sizeY);
    }
    /*SpaceKeyが押された時の処理*/
    function KeyDownFunc(e) {
      if (e.keyCode == 32 && y >= bottom - hitSizeY && y <= bottom + hitSizeY){
        spaceFlag = true;
        num++;
      }
    }

    function KeyUpFunc(e) {
      if (e.keyCode == 32 && y > bottom + hitSizeY){
        spaceFlag = false;
      }
    }

    function hit(){
      if (spaceFlag == true){
        ctx.clearRect(0, 264, canvas.width, canvas.height);
        ctx.fillText('HIT!'+num, 300, 280);
      }
    }
    setInterval(render, 50);
    setInterval(hit, 50);
  }
  SquareLoop();

一つ一つ見ていく

function render() {
      if(y >= canvas.height - 50){
        y = 0;
      }else{
        y += speed;
      }
      ctx.clearRect(0, 0, canvas.width, canvas.height - 38);
      ctx.strokeRect(x, bottom, sizeX, sizeY);
      ctx.beginPath();
      ctx.fillRect(x, y, sizeX, sizeY);
}

■合わせるための四角の枠を描画させ、ノーツを落ちてこさせる

変数y がキャンバスの高さから50引いた数以上だった場合、y に 0 を代入する
それ以外の場合、y に 5 を足した数を代入する
「横の長さがキャンバス幅、縦の長さがキャンバスの高さから38引いた数」の範囲をすべて消す
幅が40、高さが12のサイズの四角の枠を引く(キャンバスの高さから80引いた数の場所)
幅が40、高さが12のサイズの四角を塗りつぶす(yの高さ)

document.addEventListener("keydown", KeyDownFunc);
document.addEventListener("keyup", KeyUpFunc);
ctx.font = "16px Arial";

キーボードが押されたときに、関数KeyDownFunc を実行する
キーボードを離したときに、関数keyUpFunc を実行する
cssのフォント指定

function KeyDownFunc(e) {
      if (e.keyCode == 32 && y >= bottom - hitSizeY && y <= bottom + hitSizeY){
        spaceFlag = true;
        num++;
      }
    }

押されたキーボードがスペース(32)かつ、yがキャンバスの高さから80引いた数から15引いた数以上かつ、yがキャンバスの高さから80引いた数から15足した数以下である場合
変数spaceFlag に true を代入する
num に1を足す

function KeyUpFunc(e) {
      if (e.keyCode == 32 && y > bottom + hitSizeY){
        spaceFlag = false;
      }
    }

押されたキーボードがスペース(32)かつ、yがキャンバスの高さから80引いた数から15足した数より大きい場合
変数spaceFlag に false を代入する

function hit(){
      if (spaceFlag == true){
        ctx.clearRect(0, 264, canvas.width, canvas.height);
        ctx.fillText('HIT!'+num, 300, 280);
      }
    }

変数spaceFlag が true だった場合
x座標が300、y座標が280の位置に、HIT! + 変数num を描画する

setInterval(render, 50);
setInterval(hit, 50);

50/1000秒ごとに関数render と関数 hit を繰り返す

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です