テトリスをJavaScript作成中です。
あきちょんさんのyoutubeを見ながらコードを書いているのですが、ブロックの当たり判定の部分が理解できなくてどなたか教えていただけたら助かります。
if(field[ny][nx]){ retune false; } でなぜ当たり判定ができるのかが理解できません。
--------- 理解できない部分 ----------
JavaScript
1コード 2```当たり判定 3function checkMove(mx, my){ 4 for(let y=0; y<TETRO_SIZE; y++){ 5 for(let x=0; x<TETRO_SIZE; x++){ 6 let nx = tetro_x + mx + x; 7 let ny = tetro_y + my + y; 8 9 if( tetro[y][x]){ 10 if( field[ny][nx] || 11 ny < 0 || 12 nx < 0 || 13 ny >= FIELD_ROW|| 14 nx >= FIELD_COL ){ 15 return false; 16 } 17 } 18 } 19 } 20 return true; 21} 22 23 24 25------------ 参照コード ---------- 26<!DOCTYPE html> 27<html> 28<body> 29<canvas id="can"></canvas> 30<script> 31 32//フィールドサイズ 33const FIELD_COL = 10; 34const FIELD_ROW = 20; 35 36//ブロック一つのサイズ(px) 37const BLOCK_SIZE = 30; 38 39//キャンバスサイズ 40const SCREEN_W = BLOCK_SIZE * FIELD_COL; 41const SCREEN_H = BLOCK_SIZE * FIELD_ROW; 42 43//テトロミノのサイズ 44const TETRO_SIZE = 4; 45 46let can = document.getElementById("can"); 47let con = can.getContext("2d"); 48 49can.width = SCREEN_W; 50can.height = SCREEN_H; 51can.style.border = "4px solid #555"; 52 53//テトロミノ本体 54let tetro = [ 55 [ 0, 0, 0, 0], 56 [ 1, 1, 0, 0], 57 [ 0, 1, 1, 0], 58 [ 0, 0, 0, 0] 59]; 60 61//テトロミノの座標 62let tetro_x = 0; 63let tetro_y = 0; 64 65//フィールド本体 66let field = []; 67 68init(); 69drawAll(); 70 71//初期化 72function init(){ 73for(let y=0; y<FIELD_ROW; y++) 74{ 75 field[y] = []; 76 for(let x=0; x<FIELD_COL; x++) 77 { 78 field[y][x] = 0; 79 } 80} 81 //テスト 82 field[ 5][8] = 1; 83 field[19][0] = 1; 84 field[19][9] = 1; 85} 86 87//ブロック一つを描画する 88function drawBlock(x, y){ 89 let px = x * BLOCK_SIZE; 90 let py = y * BLOCK_SIZE; 91 92 con.fillStyle="red"; 93 con.fillRect(px, py, BLOCK_SIZE, BLOCK_SIZE); 94 con.strokeStyle="black"; 95 con.strokeRect(px, py, BLOCK_SIZE, BLOCK_SIZE); 96} 97 98//全部を描画する 99function drawAll(){ 100 con.clearRect(0,0,SCREEN_W,SCREEN_H); 101 102 for(let y=0; y<FIELD_ROW; y++){ 103 for(let x=0; x<FIELD_COL; x++){ 104 if( field[y][x] ){ 105 drawBlock(x, y); 106 } 107 } 108 } 109 for(let y=0; y<TETRO_SIZE; y++){ 110 for(let x=0; x<TETRO_SIZE; x++){ 111 if( tetro[y][x]){ 112 drawBlock(tetro_x+x, tetro_y+y); 113 } 114 } 115 } 116} 117 118//当たり判定 119function checkMove(mx, my){ 120 for(let y=0; y<TETRO_SIZE; y++){ 121 for(let x=0; x<TETRO_SIZE; x++){ 122 let nx = tetro_x + mx + x; 123 let ny = tetro_y + my + y; 124 125 if( tetro[y][x]){ 126 if( field[ny][nx] || 127 ny < 0 || 128 nx < 0 || 129 ny >= FIELD_ROW|| 130 nx >= FIELD_COL ){ 131 return false; 132 } 133 } 134 } 135 } 136 return true; 137} 138 139function rotate(){ 140 141} 142 143//キーボードが押されたときの処理 144document.onkeydown = function(e){ 145 switch(e.keyCode){ 146 case 37: //左 147 if( checkMove( -1, 0) ) 148 tetro_x--; 149 break; 150 case 38: //上 151 if( checkMove( 0, -1) ) 152 tetro_y--; 153 break; 154 case 39: //右 155 if( checkMove( 1, 0) ) 156 tetro_x++; 157 break; 158 case 40: //下 159 if( checkMove( 0, 1) ) 160 tetro_y++; 161 break; 162 case 32: //スペース 163 break; 164 } 165 166 drawAll(); 167} 168 169 170</script> 171</body> 172</html>

回答1件
あなたの回答
tips
プレビュー