2012-11-17 5 views
1

나는 화살표 키를 눌러 보라색 상자를 움직일 수있는 간단한 게임을 만들었다. 보라색 상자가 파란 테두리 안에 있습니다. 보라색 상자가 파란 경계선을 벗어나서 충돌을 방지 할 수 있기를 원하지만, 나는 충돌을 포함하고 있다고 알고 있습니다. 그러나 어떻게 할 수 있는지 이해하지 못합니다. 지금까지 작성한 코드는 다음과 같습니다.어떻게 javascript와 jQuery를 사용하여 아래 2d 게임에서 충돌을 감지합니까?

 <!DOCTYPE html> 
      <html> 
     <head> 
     <style> 
     body 
     { 
     background-color:pink; 
     } 
     #bob 
     { 
     width:400px; 
    height:500px; 
     padding:10px; 
    border:5px solid blue; 
     margin:0px; 
     } 
     </style> 
     </head> 
     <body> 


     <div id="bob"> 
     <div id="k" style="background- color:purple;width:40px;height:40px;position:absolute" onkeydown="keydownControl(this)"/> 
    </div> 

     <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.0.js"> 
     </script> 
     <script> 
    $('html').keyup(function(e){ 
     if(e.which==37) 
    { 
    $("#k").animate({left:"-=10px"},1); 
    } 
    if(e.which==39) 
    { 
    $("#k").animate({left:"+=10px"},1); 
    } 
    if(e.which==40) 
    { 
     $("#k").animate({top:"+=10px"},1); 
    } 
    if(e.which==38) 
     { 
    $("#k").animate({top:"-=10px"},1); 
     } 
     }); 
    </script> 

     </body> 
     </html> 

그래서 보라색 상자를 움직이고 있다고 말하면 파란색 사각형이 나타납니다. 그렇게되면 그 방향으로 움직이지 않으면 더 이상 파란색 정사각형과 접촉하지 않아서 파란색 정사각형을 벗어날 수 없습니다. JS와 jQuery를 사용하면 어떻게 될까요?

답변

0

박스로 작업 할 때 히트 감지가 상당히 간단합니다. 그것은 정적 포함 상자 (#bob) 안에 1 개의 움직일 수있는 상자 (#k)가 있다는 것을 당신이 시도하고있는 것처럼 들린다.

기본 개념은 이동하려는 위치가 경계를 벗어날 것인지 확인하는 몇 가지 간단한 논리 검사를 각 키 업 이벤트에 추가하는 것입니다. 새 위치가 범위를 벗어날 것이라고 확인되면 움직이는 것을 방해하지 않습니다.

각 방향마다 약간 다른 체크가 있습니다.

UP

당신이해야 할 모든 바인딩 이동 상자의 새로운 최상위 당신은 이동 상자의 상단이 결합 된 결정 jQuery('#k').position().top을 사용할 수 있습니다 보다 큰 확인입니다 이동을 시도.

다운

당신이 이동 상자의 새로운 바닥이 결합 된 것으로 확인됩니다 할 일은 포함하는 상자의 높이보다 작 아래로 이동을 시도. jQuery('#k').position().top+jQuery('#k').height()을 사용하여 이동 가능한 상자의 아래쪽 경계를 결정할 수 있습니다. 그리고 상자의 높이를 결정하기 위해 jQuery('#bob').height().

왼쪽

왼쪽으로 이동을 시도하면 바인딩 이동 상자의 새로운 왼쪽 당신은 이동 상자의 바운드 왼쪽 결정 jQuery('#k').position().left을 사용할 수 있습니다 보다 큰 것으로 확인되는 일은 .

오른쪽

당신이 이동 상자의 새로운 권리 바인딩 확인한다 할 일은 포함하는 상자의 너비보다 작 오른쪽으로 이동을 시도. jQuery('#k').position().left+jQuery('#k').width()을 사용하여 이동 가능한 상자의 오른쪽 경계를 결정할 수 있습니다.그리고 포함 된 상자의 너비를 결정하려면 jQuery('#bob').width().


추가 참고

  1. 당신은 아마 position:relative을 #bob해야한다. 현재 위치는 # bob이 아닌 body 태그의 위치에 상대적으로 계산됩니다 (지금은 같은 좌표를 공유하고 있습니다).
  2. "down"과 "right"에 여분의 논리가있는 이유는 DOM의 위치가 왼쪽 상단을 기준으로 결정되기 때문입니다. 이를 보완하기 위해 객체의 높이 또는 폭을 각각 추가해야합니다. 상단 왼쪽 모서리에서 https://docs.google.com/drawings/d/121mfxpapfmcRD2UV7qoMY5RdoH-4womiheqDHtQ_YWY/edit

    각 요소의 좌표 유래 : -


배경 정보 HTML/jQuery를 위치

다이어그램은 HTML/jQuery를 위치를 설명하는 데 도움.

HTML/jQuery에서 절대적으로 배치 된 요소의 위치는 부모의 원점을 기준으로합니다 (간단히하기 위해 위치 상속을 간과 함). 좌상 구석이 부모의 좌상 구석과 같은 경우, 위치는 (0,0)가됩니다. 부모의 왼쪽 위 모서리에서 멀어지면서 좌표가 2 개의 좌표 사이의 수평 (x) 및 수직 (y) 갭이됩니다.

+0

Matt, 감사합니다. 귀하의 방법이 효과가있는 것 같습니다. 가능하면 방법이 어떻게 작동하는지 설명해주십시오. 예를 들어 왜 상 한계가 0보다 큰지 확인해야하는 이유를 이해할 수 없습니다. 0은 어디에서 얻었습니까? –

+0

div 요소의 부모 원점을 변경하는 것이 가능합니까? 다양한 div 요소를 결합하여 상자의 미로를 만들고 싶지만 전체 부모 계층 구조 일 경우 너무 복잡합니다. 아니면 캔버스 같은 것을 사용해야 만 그런 것을 방지 할 수 있을까요 ?? –

+0

다른 상자 안에 들어있는 상자를 유지하는 것보다 좀 더 복잡한 작업을하려는 것 같습니다. 높은 수준에서 당신이해야 할 일은 div를 포함하는 div의 다양한 div가 동일한 공간을 공유하지 않도록하는 것입니다. 움직이는 유일한 div가 "플레이어"인 경우 위에서 설명한 것과 유사한 논리 검사를 실행할 수 있습니다 (이제는 보험 보장보다는 겹침을 방지하려는 경우 제외). 캔버스가 필요한 것은 아니지만 미로가 복잡할수록 성능 문제를 해결하기 위해 캔버스 또는 다른 매체를 고려할 가능성이 높습니다. –

1

jquery 애니메이션의 step 함수를 살펴보십시오. 애니메이션의 각 단계에서 오브젝트가 가장자리에 도달했는지 확인해야합니다. 비슷한 점이 있습니다 here

하단의 "직접 해보기 ..."링크를 참조하십시오.

+0

감사합니다. 유익한 정보입니다. 한 번은 실제로 내가 보여준 내용을 보여주었습니다. –

관련 문제