2012-04-27 3 views
2

간단한 타일 기반 게임을 만들기 위해 XNA를 사용하는 방법을 배우기 시작했으나 문제가 있음을 발견했습니다. OpenGL에서 드로잉 할 좌표 (예 : 직사각형)를 정의하면 해당 좌표가 내가 만든 뷰포트 (오르토 또는 원근감)를 참조합니다. 그래서, 예를 들어, 좌표 0,0은 화면 중앙에 위치했습니다.XNA - 해상도 독립적 인 타일 기반 게임

XNA를 사용하면 모든 치수와 좌표가 픽셀로 표현되므로 10x10 직사각형을 그릴 경우 10 픽셀 x 10 픽셀 직사각형이되고 원점 좌표는 동일하게됩니다. 이 방법을 사용하면 해상도를 변경하면 비율이 변경됩니다 (OpenGL에서는 크기가 동일하지 않음). 픽셀의 비율에 구속받지 않고 XNA를 어떻게 사용할 수 있습니까? 아무도 내가 잘못하고있는 곳이나 내가 어떻게 할 수 있는지 말해 줄 수 있습니까?

+0

가능한 복제 http://stackoverflow.com/questions/10298046/wp7-xna-game-how-to-adapt-to-different-phone-resolutions/10300282#10300282 – Ani

답변

0

타일을 나타내는 2 차원 스프라이트를 그릴 때 Spritebatch.Draw(Texture2D texture, Vector2 position, Color color)을 사용한다고 가정합니다. 예,이 경우 "벡터 2 위치"는 실제로 창 공간의 좌표 쌍입니다. 그러나 XNA에서 그릴 수있는 다른 방법이 많이 있습니다. 예를 들어 OpenGL에서 수행했던 작업을 정확하게 수행하는 것, 즉 다각형을 작성하고 월드/뷰 행렬을 사용하여 변환하는 것입니다. MSDN의 this tutorial을 참조하십시오.

즉, 계속 Spritebatch를 사용하고 Spritebatch.Draw(Texture2D texture, Rectangle destinationRectangle, Color color)을 사용하여 "수동으로"크기 조정을 수행 할 수 있습니다. 당신은 GraphicsDevice.Viewport.Width/높이를 사용하여 화면의 폭과 높이를 얻을 수

var destinationRectangle = new Rectangle(
    positionX, 
    positionY, 
    0.05 * screenWidth, 
    0.06 * screenHeight); 
spritebatch.Draw(tileTexture, destinationRectangle, Color.White); 

: 같은 타일이 항상 화면의 폭의 5 %와 화면의 높이의 6 %를 차지한다 말, 다음 스케일링은 보일 것이다 .

더 일반적으로 말하면 좌표 조정을 막을 수있는 방법은 없지만 쉐이더 또는 CPU를 통해 계산을 수행하려는 경우 Matrix 클래스와 Vector2/3.Transform 메서드를 사용하는 것이 적합하다고 생각할 수도 있습니다. 사용자 지정 선형 대수 등을 통해 변환합니다.

+0

아주 좋은 답변입니다. 나는 OP가 Reimers XNA 튜토리얼을 통해 배우고 있다는 느낌이 들었다. XNA 튜토리얼은 그 자체로 나쁘지는 않지만 XNA의 OO 기능을 보여주지는 않는다. (이것은 더 쉽게 * 더 쉽게 만들 수있다) –