2013-07-03 86 views
-1

我正在试图制作一个滚动关卡作为学习练习的测试游戏。我创建了一个包含大量根据它们在数组中的位置绘制的瓦片的地图。我基本上希望摄像头能够向下滚动,但目前它只是疯狂地上下抖动一下。在XNA中移动摄像头,C#

我有一个相机类,它只是一个空白静态类,包含相机位置的静态vector2。它只是设置为50,50,因为所有的瓦片50 50点。

然后在我的地图更新方法,我有以下几点:

public void Update(GameTime gameTime) { 

Camera.Location.Y = MathHelper.Clamp(Camera.Location.Y + (float)speed, 0, (300 - 18) * 50) 

} 

的300和18瓦的总数量,屏幕上的瓦片数量(垂直)。

我完全失去了,所以将不胜感激任何帮助或建议。

+0

这真的不是很清楚你到底想要做什么吗?你想一次顺利滚动还是一次平铺?绘图时,相机位置到底应用到场景的确切程度如何? – craftworkgames

回答

3

这是我在游戏中使用的一个简单的2D相机类。

public class Camera2D 
{ 
    public Camera2D() 
    { 
     Zoom = 1; 
     Position = Vector2.Zero; 
     Rotation = 0; 
     Origin = Vector2.Zero; 
     Position = Vector2.Zero; 
    } 

    public float Zoom { get; set; } 
    public Vector2 Position { get; set; } 
    public float Rotation { get; set; } 
    public Vector2 Origin { get; set; } 

    public void Move(Vector2 direction) 
    { 
     Position += direction; 
    } 

    public Matrix GetTransform() 
    { 
     var translationMatrix = Matrix.CreateTranslation(new Vector3(Position.X, Position.Y, 0)); 
     var rotationMatrix = Matrix.CreateRotationZ(Rotation); 
     var scaleMatrix = Matrix.CreateScale(new Vector3(Zoom, Zoom, 1)); 
     var originMatrix = Matrix.CreateTranslation(new Vector3(Origin.X, Origin.Y, 0)); 

     return translationMatrix * rotationMatrix * scaleMatrix * originMatrix; 
    } 
} 

的想法是将其应用作为变换,当你对你画你的精灵一批像这样:

var screenScale = GetScreenScale(); 
var viewMatrix = Camera.GetTransform(); 

_spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied, 
          null, null, null, null, viewMatrix * Matrix.CreateScale(screenScale)); 

你可能也注意到了使用屏幕比例的。虽然与相机没有直接关系,但它是确保您的屏幕缩放至所需分辨率的一种方法。这样,您可以绘制独立于分辨率的场景,并在最后对其进行缩放。以下是可供参考的屏幕比例尺方法:

public Vector3 GetScreenScale() 
    { 
     var scaleX = (float)_graphicsDevice.Viewport.Width/(float)_width; 
     var scaleY = (float)_graphicsDevice.Viewport.Height/(float)_height; 
     return new Vector3(scaleX, scaleY, 1.0f); 
    }