2016-09-09 6 views
0

각 트레일의 프런트 엔드 (이동 끝)가 충돌하는 색상을 확인하여 충돌 감지 시스템을 구현하는 데 문제가 있습니다. 나는 배열 방법을 시도했지만 비참하게 실패했습니다. 저는 자바 스크립트에 상당히 익숙합니다.색상 톤 게임의 충돌 감지

I는 각 프레임 내의

grid("cyan",cyan_x,cyan_y) 
grid("red",red_x,red_y) 

회색 (배경색)을 제외한 모든 색상을 터치하는 경우 확인하는 충돌 검출 방법을 구현하고자. 게임이 호출해야하는 다른 색상을 건 드리면

if (cyan_x == 0 || cyan_x == 159 || cyan_y == 0 ||cyan_y == 159) { 
      red_x = 130; 
      red_y = 80; 

      cyan_x = 30; 
      cyan_y = 80; 

      dx = 1; 
      dy = 1; 

      directionr = "l"; 
      directionc = "r"; 

      context.clearRect(0,0,canvas.width,canvas.height); 
      redscore = redscore + 1; 
     } 

또는 이와 동등한 빨간 흔적이 해당됩니다. 내 모든 코드 :

<script> 

    //variables 
    var canvas, context; 
    //current x,y coordinates of each trail within a frame 
    var red_x, red_y, cyan_x, cyan_y; 
    //how much coordinates change within each frame 
    var dx, dy; 
    //the direction of each trail 
    var directionr; 
    var directionc; 
    //trail scores 
    var redscore, cyanscore; 


    //this function is used to draw the individual squares to make a trail 
    function grid(color,c,u){ 
     context.beginPath(); 
     //note that the 800x800 canvas is broken into 160x160 by multiplying the 
     //x,y, values of context.rect by 5 
     context.rect(c*5,u*5,5,5); 
     context.fillStyle = color; 
     context.fill(); 
     context.closePath(); 
    } 


    function start() { 
     startGame(); 
    } 

    //this function runs all the other functions and properly starts the game 
    function startGame(){ 
     setupGame(); 
     setInterval(playGame,45); 
     context.clearRect(0,0,canvas.width,canvas.height); 

     redscore = 0; 
     cyanscore = 0; 
    }; 

    //when one of the trails score reaches 3 then the game should stop 
    function stopGame(){ 
     context.clearRect(0,0,canvas.width,canvas.height); 
    }; 

    //this function sets uo the games by initialising starting positions etc 
    function setupGame() { 
     canvas = document.getElementById("canvas"); 
     context = canvas.getContext("2d"); 

     red_x = 130; 
     red_y = 80; 

     cyan_x = 30; 
     cyan_y = 80; 

     dx = 1; 
     dy = 1; 

     directionr = "l"; 
     directionc = "r"; 

     window.addEventListener("keydown", onKeyDown, true); 
    }; 

    //movement controls 
    function onKeyDown(e){ 

     if (e.keyCode == 37 && directionr != "r") { directionr = "l";} // left arrow pressed 
     if (e.keyCode == 38 && directionr != "d") { directionr = "u";} // up arrow pressed 
     if (e.keyCode == 39 && directionr != "l") { directionr = "r";} // right arrow pressed 
     if (e.keyCode == 40 && directionr != "u") { directionr = "d";} // down arrow pressed 

     if (e.keyCode == 65 && directionc != "r") { directionc = "l";} // left arrow pressed 
     if (e.keyCode == 87 && directionc != "d") { directionc = "u";} // up arrow pressed 
     if (e.keyCode == 68 && directionc != "l") { directionc = "r";} // right arrow pressed 
     if (e.keyCode == 83 && directionc != "u") { directionc = "d";} // down arrow pressed 

    } 


    function playGame(){ 
     drawCycles(); 
    }; 

    //this function manages each frame - keeping track of score, and ideally would 
    //check if collisions occur 
    function drawCycles(){ 

     //draw trails 
     grid("red",red_x,red_y); 
     grid("cyan",cyan_x,cyan_y); 

     //display score 
     document.getElementById("redscore").innerHTML = "Red's score: " + redscore; 
     document.getElementById("cyanscore").innerHTML = "Cyan's score: " + cyanscore; 

     //reset positions when trails hit the edge 
     if (red_x == 0 || red_x == 159 || red_y == 0 || red_y == 159) { 
      red_x = 130; 
      red_y = 80; 

      cyan_x = 30; 
      cyan_y = 80; 

      dx = 1; 
      dy = 1; 

      directionr = "l"; 
      directionc = "r"; 

      context.clearRect(0,0,canvas.width,canvas.height); 
      cyanscore = cyanscore + 1; 
     } 

     if (cyan_x == 0 || cyan_x == 159 || cyan_y == 0 ||cyan_y == 159) { 
      red_x = 130; 
      red_y = 80; 

      cyan_x = 30; 
      cyan_y = 80; 

      dx = 1; 
      dy = 1; 

      directionr = "l"; 
      directionc = "r"; 

      context.clearRect(0,0,canvas.width,canvas.height); 
      redscore = redscore + 1; 
     } 


     //check if its hitting the edges 
     if (directionr == "l" && red_x != 0) { red_x -= dx; }; 
     if (directionr == "r" && red_x != 159) { red_x += dx; }; 
     if (directionr == "u" && red_y != 0) { red_y -= dy; }; 
     if (directionr == "d" && red_y != 159) { red_y += dy; }; 

     if (directionc == "l" && cyan_x != 0) { cyan_x -= dx; }; 
     if (directionc == "r" && cyan_x != 159) { cyan_x += dx; }; 
     if (directionc == "u" && cyan_y != 0) { cyan_y -= dy; }; 
     if (directionc == "d" && cyan_y != 159) { cyan_y += dy; }; 

     //scoring system 
     if (cyanscore >= 3) { 
      document.getElementById("redscore").innerHTML = "Red loses"; 
      document.getElementById("cyanscore").innerHTML = "Cyan wins"; 
      stopGame(); 
     } 

     if (redscore >= 3) { 
      document.getElementById("redscore").innerHTML = "Red wins"; 
      document.getElementById("cyanscore").innerHTML = "Cyan loses"; 
      stopGame(); 
     } 
    }; 


</script> 

감사

답변

0

당신은 축 정렬 경계 상자 접근 방식을 사용하여이 시나리오에서 충돌을 감지 할 수 있습니다 -에 설명 된대로 : https://developer.mozilla.org/en-US/docs/Games/Techniques/2D_collision_detection.

다음은 예입니다 :

if (rect1.x < rect2.x + rect2.width && 
    rect1.x + rect1.width > rect2.x && 
    rect1.y < rect2.y + rect2.height && 
    rect1.height + rect1.y > rect2.y) { 
    // Collision detected! 
} 

그것은이 방법은 같은 축에서 사각형으로 제한되어 있음을 주목할 필요가 - 그들이 회전 할 수 없습니다. 여기

은 당신의 코드에 통합 간단한 예제 : 현재

<!DOCTYPE html> 
 
<html> 
 
<head> 
 
\t <title>CC</title> 
 
\t <style type="text/css"> 
 
\t \t #canvas { 
 
\t \t \t border: 1px solid #ccc; 
 
      background-color: #ccc; 
 
\t \t } 
 
\t </style> 
 
</head> 
 
<body> 
 

 
<div><span id="redscore"></span> | <span id="cyanscore"></span></div> 
 
<canvas id="canvas"></div> 
 

 
<script> 
 
    //variables 
 
    var canvas, context; 
 
    //current x,y coordinates of each trail within a frame 
 
    var red_x, red_y, cyan_x, cyan_y; 
 
    //dimensions of the rectangles 
 
    var red_width, red_height, cyan_width, cyan_height; 
 
    //how much coordinates change within each frame 
 
    var dx, dy; 
 
    //the direction of each trail 
 
    var directionr; 
 
    var directionc; 
 
    //trail scores 
 
    var redscore, cyanscore; 
 

 

 

 
    //this function is used to draw the individual squares to make a trail 
 
    function grid(color,c,u){ 
 
     //note that the 800x800 canvas is broken into 160x160 by multiplying the 
 
     //x,y, values of context.rect by 5 
 
     context.fillStyle = color; 
 
     context.fillRect(c*5,u*5,10,10); 
 
    } 
 

 

 
    function start() { 
 
     startGame(); 
 
    } 
 

 
    //this function runs all the other functions and properly starts the game 
 
    function startGame(){ 
 
     setupGame(); 
 
     setInterval(playGame,45); 
 
     context.clearRect(0,0,canvas.width,canvas.height); 
 

 
     redscore = 0; 
 
     cyanscore = 0; 
 
    }; 
 

 
    //when one of the trails score reaches 3 then the game should stop 
 
    function stopGame(){ 
 
     context.clearRect(0,0,canvas.width,canvas.height); 
 
    }; 
 

 
    //this function sets uo the games by initialising starting positions etc 
 
    function setupGame() { 
 
     canvas = document.getElementById("canvas"); 
 
     context = canvas.getContext("2d"); 
 

 
     context.canvas.width = 800; 
 
     context.canvas.height = 800; 
 

 
     red_x = 130; 
 
     red_y = 80; 
 

 
     cyan_x = 30; 
 
     cyan_y = 80; 
 

 
     red_width = 10; 
 
     red_height = 10; 
 

 
     cyan_width = 10; 
 
     cyan_height = 10; 
 

 
     dx = 1; 
 
     dy = 1; 
 

 
     directionr = "l"; 
 
     directionc = "r"; 
 

 
     window.addEventListener("keydown", onKeyDown, true); 
 
    }; 
 

 
    //movement controls 
 
    function onKeyDown(e){ 
 

 
     if (e.keyCode == 37 && directionr != "r") { directionr = "l";} // left arrow pressed 
 
     if (e.keyCode == 38 && directionr != "d") { directionr = "u";} // up arrow pressed 
 
     if (e.keyCode == 39 && directionr != "l") { directionr = "r";} // right arrow pressed 
 
     if (e.keyCode == 40 && directionr != "u") { directionr = "d";} // down arrow pressed 
 

 
     if (e.keyCode == 65 && directionc != "r") { directionc = "l";} // left arrow pressed 
 
     if (e.keyCode == 87 && directionc != "d") { directionc = "u";} // up arrow pressed 
 
     if (e.keyCode == 68 && directionc != "l") { directionc = "r";} // right arrow pressed 
 
     if (e.keyCode == 83 && directionc != "u") { directionc = "d";} // down arrow pressed 
 

 
    } 
 

 
    function playGame(){ 
 
     drawCycles(); 
 
    }; 
 

 
    //this function manages each frame - keeping track of score, and ideally would 
 
    //check if collisions occur 
 
    function drawCycles(){ 
 
     //draw trails 
 
     grid("red",red_x,red_y); 
 
     grid("cyan",cyan_x,cyan_y); 
 

 
     //display score 
 
     document.getElementById("redscore").innerHTML = "Red's score: " + redscore; 
 
     document.getElementById("cyanscore").innerHTML = "Cyan's score: " + cyanscore; 
 

 
     // Check for collision 
 
     if (red_x < cyan_x + cyan_width && 
 
      red_x + red_width > cyan_x && 
 
      red_y < cyan_y + cyan_height && 
 
      red_height + red_y > cyan_y) { 
 
      
 
      console.log('Collision detected!'); 
 
     } 
 

 
     if (cyan_x == 0 || cyan_x == 159 || cyan_y == 0 ||cyan_y == 159) { 
 
      red_x = 130; 
 
      red_y = 80; 
 
     
 
      cyan_x = 30; 
 
      cyan_y = 80; 
 
     
 
      dx = 1; 
 
      dy = 1; 
 
     
 
      directionr = "l"; 
 
      directionc = "r"; 
 
     
 
      context.clearRect(0,0,canvas.width,canvas.height); 
 
      redscore = redscore + 1; 
 
     } 
 

 
     //reset positions when trails hit the edge 
 
     if (red_x == 0 || red_x == 159 || red_y == 0 || red_y == 159) { 
 
      red_x = 130; 
 
      red_y = 80; 
 
     
 
      cyan_x = 30; 
 
      cyan_y = 80; 
 
     
 
      dx = 1; 
 
      dy = 1; 
 
     
 
      directionr = "l"; 
 
      directionc = "r"; 
 
     
 
      context.clearRect(0,0,canvas.width,canvas.height); 
 
      cyanscore = cyanscore + 1; 
 
     } 
 

 
     //check if its hitting the edges 
 
     if (directionr == "l" && red_x != 0) { red_x -= dx; }; 
 
     if (directionr == "r" && red_x != 159) { red_x += dx; }; 
 
     if (directionr == "u" && red_y != 0) { red_y -= dy; }; 
 
     if (directionr == "d" && red_y != 159) { red_y += dy; }; 
 

 
     if (directionc == "l" && cyan_x != 0) { cyan_x -= dx; }; 
 
     if (directionc == "r" && cyan_x != 159) { cyan_x += dx; }; 
 
     if (directionc == "u" && cyan_y != 0) { cyan_y -= dy; }; 
 
     if (directionc == "d" && cyan_y != 159) { cyan_y += dy; }; 
 

 
     //scoring system 
 
     if (cyanscore >= 3) { 
 
      document.getElementById("redscore").innerHTML = "Red loses"; 
 
      document.getElementById("cyanscore").innerHTML = "Cyan wins"; 
 
      stopGame(); 
 
     } 
 

 
     if (redscore >= 3) { 
 
      document.getElementById("redscore").innerHTML = "Red wins"; 
 
      document.getElementById("cyanscore").innerHTML = "Cyan loses"; 
 
      stopGame(); 
 
     } 
 
    }; 
 

 
    start(); 
 
</script> 
 
</body> 
 
</html>

이 단지 충돌이 발생 콘솔에 기록하지만, 분명 당신이로이로 조건문을 통합 할 수 너는 좋아한다.