2012-07-03 3 views
0

그리드 시스템을 배치하여 그리드에 객체를 스냅 할 수 있으며, 완벽하게 작동하지만,이 상황에서 찾고있는 동작이 아닙니다. 나는 내 삶에 대해 감각을 일으킬만한 단어에 넣을 수 없었다. (어째서 나는 왜 머리를 감싸는 데 어려움을 겪고 있는가?) 그래서 나는 현재의 행동과 예상되는 행동으로 그림을 그렸다. 훨씬 더 나은 일 :특정 그리드 위치로 스냅

grid

왼쪽이 현재 동작을 보여줍니다 (참고 :. 흰색 격자 선은 위 그림과 같이 그리드 시스템이 실제로 두 배 큰이 객체가 격자 선에 배치 할 수 있습니다 이것은 의도 한 동작입니다.)

오른쪽은 그리드에 스냅하는 방법입니다. 격자 노드 (또는 빈 중앙 노드)가 아닌 그리드 선에 개체를 배치하기 만하면됩니다.

예상되는 동작에서는 쌍을 이루는 값이 반대 인 경우 개체가 항상 눈금에 스냅됩니다 .- X가 ODD이고 Y 값이 맞으면 EVEN이어야합니다 (즉, [0 , 1], [1, 0], [2,3]). ODD 또는 둘 다이기 때문에 [0,0], [1,1], [4,2]에 스냅되지 않습니다. 내가 알고있는 행동은 내가 찾고있는 행동과 일치하지만 이것을 유용한 것으로 해석 할 수는 없습니다. 여기

은 전체의 그리드 코드에 스냅이다 : 이것은 당신이 X의 스냅 방법을 사용하면 Y 스냅 방법에 따라 달라집니다 때문에이 있어야 할 것 같다보다 조금 까다 롭습니다

//Grab the mouse state 
MouseState mouse = Mouse.GetState(); 

//TileX = (int)Math.Floor((float)(mouse.X/tileWidth)); //tileWidth = 80 
//TileY = (int)Math.Floor((float)(mouse.Y/tileHeight)); //tileHeight = 80 

//We want "snap to closest grid space" instead of "snap to next-lowest grid space", 
//like the Math.Floor code does above. The ".ToInt()" extensions simply rounds a 
//float to the closest integer. i.e. 2.2 = 2  2.5 = 3 3 = 3 
TileX = ((float)mouse.X/tileWidth).ToInt(); 
TileY = ((float)mouse.Y/tileHeight).ToInt(); 

//Set the square to a whole tile coordinate 
squarePosition.X = TileX * tileWidth; 
squarePosition.Y = TileY * tileHeight; 

답변

0

(그리고 바이스 구절). 내가 할 수있는 방법은 먼저 2x tileHeight 및 tileWidth를 사용하여 위에 게시 한 코드를 사용중인 사각형을 파악하는 것입니다. 포인트가있는 사각형을 얻었 으면 몇 가지 조건을 사용하여 마우스가 가장 가까운 가장자리를 파악할 수 있습니다.

실제로 실제로 점을 원점을 중심으로 45도 회전하고 위 코드에서와 같이 닫은 다음 스냅 한 위치를 다른 방향으로 45도 회전시켜 폐쇄 형 솔루션을 도출 할 수 있다고 가정합니다).

어느 것이 든 더 이해하기 쉽습니다 ... 최고!

관련 문제