iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 28
0
自我挑戰組

學習 canvas 日記系列 第 28

第 28 天 迷宮 三

設定當碰到線或終點就不能再移動
建立一個 function 放在移動前

if(e.code === 'KeyW' || e.code === 'ArrowUp'){
    delPoint(circleStart.x, circleStart.y, circleStart.r);
    checkForMove(circleStart.x, circleStart.y, 'y', '-16'); 
    // 建立一個 判斷前進方向有沒有線的 function
    
    // circleStart.y -= 16; 
    // 放在 function 內後就可以刪除
    
    circlePoint(circleStart.x, circleStart.y, circleStart.r, 'red');
}

參數是還沒移動前的位置 (X, Y)、水平/垂直,移動的距離

var checkForMove = function(circleX, circleY, direction, distance){ ... }

分別判斷四邊的方向是否可以移動
先水平 x 或是垂直 y 再來是移動的距離

if(direction === 'x'){
	if(parseInt(distance) < 0){ ... } // 左邊
	if(parseInt(distance) > 0){ ... } // 右邊
}
if(direction === 'y'){
	if(parseInt(distance) < 0){ ... } // 上
	if(parseInt(distance) > 0){ ... } // 下
}

再取出上下或是左右方向一部分區域
以向上為例子

if(parseInt(distance) < 0){
    // distance 是字串, 所以用 parseInt() 轉成數值
    var imageData = ctx.getImageData(circleX, circleY + parseInt(distance)*0.5, 3, 1);
    // 取得 3px * 1px 部分的資訊
}

再判斷是不是線時是用 第 11 天 負片效果 的方式取得一部分的區域內的顏色資訊

var pixels = imageData.data;
    for (var i = 0, len = pixels.length; i < len; i++) {
      if (pixels[i] === 0 && pixels[i+1] === 0 && pixels[i+2] === 0 && pixels[i+3] === 0){
        return circleStart.y += parseInt(distance); 
        // 回傳移動的值
      }
    }

就可以作出判斷移動的方向有沒有線
迷宮的起點和終點的開口也要擋著才不會出界了
https://i.imgur.com/cQEsMhg.gif

ctx.beginPath();
ctx.strokeStyle = 'black';
ctx.lineWidth = '3';
ctx.strokeRect(0, 0, canvas.width, canvas.height);

var checkForMove = function(circleX, circleY, direction, distance){
  if(direction === 'x'){
    if(parseInt(distance) < 0){
      var imageData = ctx.getImageData(circleX + parseInt(distance)*0.5, circleY, 1, 3);
    }
    if(parseInt(distance) > 0){
      var imageData = ctx.getImageData(circleX + parseInt(distance)*0.5, circleY, 1, 3);
    }
    var pixels = imageData.data;
    for (var i = 0, len = pixels.length; i < len; i++) {
      if (pixels[i] === 0 && pixels[i+1] === 0 && pixels[i+2] === 0 && pixels[i+3] === 0){
        return circleStart.x += parseInt(distance); 
      }
    }
  }
  if(direction === 'y'){
    if(parseInt(distance) < 0){
      var imageData = ctx.getImageData(circleX, circleY + parseInt(distance)*0.5, 3, 1);
    }
    if(parseInt(distance) > 0){
      var imageData = ctx.getImageData(circleX, circleY + parseInt(distance)*0.5, 3, 1);
    }
    var pixels = imageData.data;
    for (var i = 0, len = pixels.length; i < len; i++) {
      if (pixels[i] === 0 && pixels[i+1] === 0 && pixels[i+2] === 0 && pixels[i+3] === 0){
        return circleStart.y += parseInt(distance); 
      }
    }
  }
}

上一篇
第 27 天 迷宮 二
下一篇
第 29 天 迷宮 四
系列文
學習 canvas 日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言