2016-09-27 6 views
0

내 2D 엔진을 기반으로 이미지의 정확한 위치를 얻기 해상도 독립적이며 여기에 기사를 기반으로 카메라가 : http://www.david-gouveia.com/portfolio/2d-camera-with-parallax-scrolling-in-xna/2D 시차 카메라

내 카메라 클래스로 기사 위와 같은 방법으로 시차 스크롤을 구현했습니다 언급. 그것은 훌륭하게 작동하지만 내 도려내 기 코드를 망쳐 놓았고 수학을 계산하는 데 어려움을 겪고 있습니다.

내 배경 이미지 각각에는 현재 화면에 있는지 확인하는 데 사용되는 사각형이 있습니다. 카메라 사각형과 충돌하지 않으면 그릴 수 없습니다. 문제는 이미지가 시차 레이어로 드로잉하는 경우 사각형이 실제로 화면에 나타나는 위치를 계산하지 않는다는 것입니다.

(가) 내 카메라 클래스의 변환 행렬은 다음과 같다 :

각 시차 층
public static Matrix GetTransformMatrix(Vector2 parallax) 
     { 
      return Matrix.CreateTranslation(new Vector3(-position * parallax, 0)) * Matrix.CreateRotationZ(rotation) * 
         Matrix.CreateScale(new Vector3(zoom, zoom, 1)) * Matrix.CreateTranslation(new Vector3(Resolution.VirtualWidth 
          * 0.5f, Resolution.VirtualHeight * 0.5f, 0)); 
     } 

, I는 SpriteBatch.Begin을 (통화) 및에 따라 전달 오프셋 올바른 시차와 행렬을 상기 변환 전달할 우리가 그리는 레이어 (전경, 배경 등)

나는 마우스를 클릭 한 위치를 얻는 데 적합한 ScreenToWorld 함수를 성공적으로 만들었습니다. 카메라가 작동하려면 해상도 매트릭스와 카메라 매트릭스를 모두 계산해야합니다.

public static Vector2 ScreenToWorld(Vector2 input, Vector2 parallax) 
     { 
      input.X -= Resolution.VirtualViewportX; 
      input.Y -= Resolution.VirtualViewportY; 

      Vector2 resPosition = Vector2.Transform(input, Matrix.Invert(Resolution.getTransformationMatrix())); 
      Vector2 finalPosition = Vector2.Transform(resPosition, Matrix.Invert(Camera.GetTransformMatrix(parallax))); 

      return finalPosition;  
     } 

그래서 나는 내가 WorldToScreen 기능을 필요 내 시차 층의 정확한 사각형의 위치를 ​​계산하는 생각 ... 내가 이것을 시도했지만 작동하지 않습니다 :

public static Vector2 WorldToScreen(Vector2 input, Vector2 parallax) //I pass the same parallax value that is used in the Camera matrix function. 
     { 
      input.X -= Resolution.VirtualViewportX; 
      input.Y -= Resolution.VirtualViewportY; 

      Vector2 resPosition = Vector2.Transform(input, Resolution.getTransformationMatrix()); 
      Vector2 finalPosition = Vector2.Transform(resPosition, Camera.GetTransformMatrix(parallax)); 

      return finalPosition;  
     } 

난 맞춰 보겠다. 내 수학이 틀렸어? 위의 함수를 parallaxed Rectangle 위치에 전달하고 시차 이미지가 실제로 그려지는 곳으로 업데이트하려고합니다. 누군가가 도울 수 있다면 미리 감사드립니다!

답변

0

내 수학이 끝났지 만 카메라의 매트릭스를 기반으로 카메라의 화면 rect를 계산해야했습니다. 이렇게하면 배경 사각형을 전혀 건드릴 필요가 없습니다. 배경의 시차 값을이 함수에 전달한 다음 반환하는 사각형에 대해 확인하십시오.

/// <summary> 
/// Calculates the Camera's screenRect based on the parallax value passed in. 
/// </summary> 
public static Rectangle VisibleArea(Vector2 parallax) 
{ 
    Matrix inverseViewMatrix = Matrix.Invert(GetTransformMatrix(parallax)); 
    Vector2 tl = Vector2.Transform(Vector2.Zero, inverseViewMatrix); 
    Vector2 tr = Vector2.Transform(new Vector2(Resolution.VirtualWidth, 0), inverseViewMatrix); 
    Vector2 bl = Vector2.Transform(new Vector2(0, Resolution.VirtualHeight), inverseViewMatrix); 
    Vector2 br = Vector2.Transform(new Vector2(Resolution.VirtualWidth, Resolution.VirtualHeight), inverseViewMatrix); 
    Vector2 min = new Vector2(
     MathHelper.Min(tl.X, MathHelper.Min(tr.X, MathHelper.Min(bl.X, br.X))), 
     MathHelper.Min(tl.Y, MathHelper.Min(tr.Y, MathHelper.Min(bl.Y, br.Y)))); 
    Vector2 max = new Vector2(
     MathHelper.Max(tl.X, MathHelper.Max(tr.X, MathHelper.Max(bl.X, br.X))), 
     MathHelper.Max(tl.Y, MathHelper.Max(tr.Y, MathHelper.Max(bl.Y, br.Y)))); 
    return new Rectangle((int)min.X, (int)min.Y, (int)(max.X - min.X), (int)(max.Y - min.Y)); 
}