javascript(テトリス001_キーボードから入力)

■1セルのピースを操作する。
テトリスのコードを作成するにあたり、いろいろと試行錯誤中。始め、位置情報を使って組み立てていこうかと思ったけど、微妙なずれの調整が難しそうなので、各クラスごとに番号を付与する。

<div class="grid-demo">
    <div class="grid">
      <div class="squ001"></div>
      <div class="squ002"></div>
      <div class="squ003"></div>
   ...
      <div class="squ199"></div>
      <div class="squ200"></div>
    </div>
    <div class="piece"></div>
  </div>
</body>

落ちるピースは通常は4セル分だけど、まずは1セルの簡単な形で動作を試してみる。上のpieceクラスがそれ。setInterval で繰り返し動作させ、番号を10ずつ増やしていく。横10×縦20にしているので、これで1セル分下に移動する。
指定した番号のセルから位置情報を取得し、ピースへコピーすることで移動させる。番号がないところまで行ったら、一つ前のセルを緑にして、判定用の変数board(200の要素を持つ配列で、要素の番号をセル番号とみなす。何もない状態を0、ピースが置かれた状態を1とする)を更新。

   const timer = setInterval(function () {
      $('.squ017').css('background-color', 'Green');
      currentPosId = currentPosId + 10;
      let temp = ( '000' + currentPosId).slice( -3);
      if($('.squ' +temp).get(0) === undefined || board[temp] === 1){
         let temp2 = temp - 10;
         temp2 = ('000' + temp2).slice(-3);
         $('.squ' +temp2).css('background-color', 'Green');
         $('.piece').css('top', '0px');
         board[temp2] = 1;
         currentPosId = 5;
      } else {
         console.log(temp)
         $('.piece').css('left', $('.squ'+temp).position().left + 'px');
         $('.piece').css('top', $('.squ'+temp).position().top + 'px');
         $('.piece').css('background-color', 'red');
      }
   }, 1000);

実行画面が下。赤色が落ちるピース。緑色が積みあがったもの。上の緑は squ017クラスで、色が変わるか確認したもの(コードが動くか確認のため残している)。


この落ちるピースをキーボード入力で左右に動かしたり下に速く落としたりしたい。

キーボード入力は、addEventListener でできるよう。左右の位置調整は、セルの番号を1ずらすことでできるので、現在位置から±1にする。左端、右端までいったら、それ以上動かないよう逆に±1する。下のコードでは、「a」か「A」で左、「d」か「D」で右に行く。

document.addEventListener('keypress', keypress_event);

function keypress_event(e) {
   if(e.key === 'a' || e.key === 'A'){
      currentPosId = currentPosId - 1;
      let temp2 = ( '000' + currentPosId).slice( -3);
      if (temp2.slice(2,3) === '0') {
          currentPosId = currentPosId + 1;
      } else{
      $('.piece').css('left', $('.squ'+temp2).position().left + 'px');
      $('.piece').css('top', $('.squ'+temp2).position().top + 'px');
      }
   } else if(e.key === 'd' || e.key === 'D'){
      (省略、右へ行く処理)
   } else if(e.key === 'x' || e.key === 'X'){
      (省略、下へ行く処理)
   }
   return false; 
}

これで1セル分のピースを移動させるコードはできた。次は、1行がそろったときに消える処理かな。
とりあえず、1セル分のピースでテトリスのような操作ができるものを作ろうと思う。