2013-06-08 2 views
4

, 내 2D 게임에서 스프라이트를 그리기 위해 사용 2D 게임에서 세계 위치로 화면을 계산하는 방법 : 이제나는이 클래스가

using Microsoft.Xna.Framework; 
using Microsoft.Xna.Framework.Graphics; 
using Microsoft.Xna.Framework.Audio; 

namespace Namespace 
{ 

/// <summary> 
/// Found this brilliant code at. 
/// http://adambruenderman.wordpress.com/2011/04/05/create-a-2d-camera-in-xna-gs-4-0/ 
/// </summary> 
public class CCamera2d 
{ 

    private const float zoomUpperLimit = 1.3f; 
    private const float zoomLowerLimit = .85f; 
    private float _zoom; 
    private Matrix _transform; 
    private Vector2 _pos; 
    private float _rotation; 
    private int _viewportWidth; 
    private int _viewportHeight; 
    private int _worldWidth; 
    private int _worldHeight; 

    public CCamera2d(Viewport viewport, int worldWidth, int worldHeight, float initialZoom = zoomLowerLimit) 
    { 
     _zoom = initialZoom; 
     _rotation = 0.0f; 
     _pos = Vector2.Zero; 
     _viewportWidth = viewport.Width; 
     _viewportHeight = viewport.Height; 
     _worldWidth = worldWidth; 
     _worldHeight = worldHeight; 
    } 

    #region Properties 

    public float Zoom 
    { 
     get { return _zoom; } 

     set 
     { 
      _zoom = value; 
      if (_zoom < zoomLowerLimit) 
       _zoom = zoomLowerLimit; 
      if (_zoom > zoomUpperLimit) 
       _zoom = zoomUpperLimit; 
     } 
    } 

    public float Rotation 
    { 
     get { return _rotation; } 
     set { _rotation = value; } 
    } 

    public void Move(Vector2 amount) 
    { 
     _pos += amount; 
    } 

    public Vector2 Pos 
    { 
     get { return _pos; } 

     set 
     { 
      float leftBarrier = (float)_viewportWidth * 
        .5f/_zoom; 
      float rightBarrier = _worldWidth - 
        (float)_viewportWidth * .5f/_zoom; 
      float topBarrier = _worldHeight - 
        (float)_viewportHeight * .5f/_zoom; 
      float bottomBarrier = (float)_viewportHeight * 
        .5f/_zoom; 
      _pos = value; 
      if (_pos.X < leftBarrier) 
       _pos.X = leftBarrier; 
      if (_pos.X > rightBarrier) 
       _pos.X = rightBarrier; 
      if (_pos.Y > topBarrier) 
       _pos.Y = topBarrier; 
      if (_pos.Y < bottomBarrier) 
       _pos.Y = bottomBarrier; 
     } 
    } 

    #endregion 

    public Matrix GetTransformation() 
    { 
     _transform = 
      Matrix.CreateTranslation(new Vector3(-_pos.X, -_pos.Y, 0)) * 
      Matrix.CreateRotationZ(Rotation) * 
      Matrix.CreateScale(new Vector3(Zoom, Zoom, 1)) * 
      Matrix.CreateTranslation(new Vector3(_viewportWidth * 0.5f, 
       _viewportHeight * 0.5f, 0)); 
     return _transform; 
    } 
} 
} 

, 나는 (마우스로 화면을 unproject하는 방법을 이해할 수 없다) 위치에서 세계 위치로 이동합니다. 그것은이 같은 기능을 가지고 좋은 것 :

public Vector2 WorldToScreen(Vector2 inWorld) 
{ 
    return Vector2.Transform(inWorld, Camera.CurrentTransformation); 
} 

답변

0

반전 매트릭스 :

public Vector2 ScreenToWorld(Vector2 onScreen) 
    { 
     var matrix = Matrix.Invert(World.Camera.CurrentTransformation); 
     return Vector2.Transform(onScreen, matrix); 
    } 
내가 사용 WorldToScreen를 들어

Vector2 ScreenToWorld(Vector2 onScreen, Matrix CameraTransformation) 

을 기능 (잘 작동)

관련 문제