길찾기 알고리즘에는 여러가지가 있는데 A* (A Star)라는 알고리즘이 많이 사용된다고 합니다.
라이브러리중에 EasyStar.js (https://www.easystarjs.com/) 라는게 있는데 이걸로 길찾기 알고리즘을 직접 구현하지 않고도 사용할 수 있습니다.
window.onload = function() { var startPoint = {x:0, y:0} var endPoint = {x:4, y:0} // EasyStar.js 선언 var es = new EasyStar.js(); var map = [ [0, 0, 0, 1, 0], [0, 0, 0, 1, 0], [0, 2, 2, 2, 0], [0, 0, 0, 1, 0], [0, 0, 0, 0, 0] ]; var canvas = document.getElementById("canvas"); if (canvas.getContext) { var ctx = canvas.getContext("2d"); var img = new Image(); // Create new img element img.src = './img/sprite.png'; // Set source path // Draw slice // drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight) var drawMap = function(){ ctx.clearRect(0, 0, 300, 300) var dx = 0 var dy = 0 for(var i in map){ for(var j in map[i]){ if(map[i][j] == 1){ // 돌 ctx.drawImage(img, 50, 0, 50, 50, dx, dy, 50, 50); dx += 50 } else if (map[i][j] == 2){ // 물 ctx.drawImage(img, 0, 50, 50, 50, dx, dy, 50, 50); dx += 50 } else if (map[i][j] == 0){ // 빈 공간 ctx.drawImage(img, 50, 50, 50, 50, dx, dy, 50, 50); dx += 50 } }dx = 0 dy += 50 } // 도착지 ctx.fillStyle = "rgb(230,220,0)"; ctx.fillRect (50 * endPoint.x , 50 * endPoint.y, 50, 50); } drawMap() $("#btnRun").on("click", function(){ drawMap(); // 사람 ctx.drawImage(img, 0, 0, 50, 50, startPoint.x, startPoint.y, 50, 50); // 지도(배열) 지정 es.setGrid(map) if($("#avoidWater").is(":checked")){ es.setAcceptableTiles([0, 2]); // 건널 수 있는 타일 설정 (0: 풀, 2: 물) } else { es.setAcceptableTiles([0]); } // 길찾기 부분 작성 // findPath(startX, startY, endX, endY, callback); es.findPath(startPoint.x, startPoint.y, endPoint.x, endPoint.y, function(path) { if (path === null) { console.log("Path was not found."); } else { console.log("Path was found. The first Point is " + path[0].x + " " + path[0].y); console.log(path) var ix = 0 setInterval(function(){ if(ix <= path.length - 1) { console.log(path[ix].x, path[ix].y) drawMap() // 사람 ctx.drawImage(img, 0, 0, 50, 50, path[ix].x * 50, path[ix].y * 50, 50, 50); ix++ } }, 500) } }); // 길찾기 부분 실행(invoke) es.calculate() }) } }
<body> <div> <canvas id="canvas" width="300" height="300"></canvas> </div> <input type="checkbox" id="avoidWater">물 건너기 <button id="btnRun">길찾기</button> </body>
0개의 댓글