2016-04-27 60 views
2

我一直在努力在制作一个简单的2D游戏中使用Monogame。我在网上找到了一个Camera类的教程,用于将屏幕滚动到角色正在移动的位置。C#绘制方法不会在将变换矩阵添加到spritebatch之后绘制到屏幕上

这是相机类:

public class Camera 
{ 
    Vector2 position; 
    Matrix viewMatrix; 

public Matrix ViewMatrix 
{ 
    get { return viewMatrix; } 
} 

public int ScreenWidth 
{ 
    get { return GraphicsDeviceManager.DefaultBackBufferWidth; } 
} 

public int ScreenHeight 
{ 
    get { return GraphicsDeviceManager.DefaultBackBufferHeight; } 
} 

public void Update(Vector2 playerPosition) 
{ 
    position.X = playerPosition.X - (ScreenWidth/2); 
    position.Y = playerPosition.Y - (ScreenHeight/2); 

    if(position.X <0) 
    { 
     position.X = 0; 
    } 
    if(position.Y <0) 
    { 
     position.Y = 0; 
    } 

    viewMatrix = Matrix.CreateTranslation(new Vector3(-position, 0)); 
} 

而在我用下面的方法绘制的Game1.cs:

protected override void Draw(GameTime gameTime) 
{ 
    GraphicsDevice.Clear(Color.Black); 


    spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, 
    null, null, null, null, Camera.ViewMatrix); 

    ScreenManager.Instance.Draw(spriteBatch); 
    spriteBatch.End(); 


    base.Draw(gameTime); 

} 

当我使用spriteBatch.Begin()不带任何参数,标题屏幕和mainmenu加载非常好,随后是地图和播放器。 但是,当我添加Camera.Viewmatrix参数屏幕保持黑色。它似乎没有通过Graphicsdevice.Clear(Color.Black)绘制任何东西。

我将不胜感激任何和所有的输入。如果您需要查看更多我的代码,请让我知道。

更新:相机和矩阵都很好,我相信。这个问题与我有很多类的事实有关,例如Screenmanager,Image,Tile,Layer,TitleScreen等等,它们都使用Update,并且大部分都是Draw方法。

实际绘图正如Game1.cs中所示,由ScreenManager类的单例实例使用绘图方法处理。

我怀疑它试图将矩阵应用于淡入淡出/ titlescreen在开始,这是导致错误,如不进展的黑色背景。也许是因为相机位置没有玩家位置?

我已经尝试使用一个单独的spritebatch.Begin()为相机和播放器绘制方法,但这当然会导致错误,我打电话一个新的spriteBatch.Begin之前,另一个已经结束。

我觉得这是可以解决的,但我可能一直盯着它看太久了,看现在的解决方案。

我不想把它变成'看看我的整个项目并为我修复它',但如果有人认识到这种情况并已经输入,甚至碰到同样的事情并修复它,我会非常感谢您的反馈。

另外,任何人都需要更多的代码来查看。随时让我知道。

回答

0

尝试给它一个标识矩阵。这应该起作用,它会证实你的矩阵必定有问题。自从我这样做以来已经有一段时间了,但它认为这有效。

public void Update(Vector2 playerPosition) 
{ 
    if(position.X <0) 
    { 
     position.X = 0; 
    } 
    if(position.Y <0) 
    { 
     position.Y = 0; 
    } 

    viewMatrix = Matrix.CreateTranslation(new Vector3(-playerPosition.X, -playerPosition.Y, 0.0f)); 
} 
+0

原谅我的无知的潜力,而不是我做的: viewMatrix = Matrix.CreateTranslation(新的Vector3( - 位,0)); 与您的建议基本相同: viewMatrix = Matrix.CreateTranslation(new Vector3(-playerPosition.X,-playerPosition.Y,0.0f)); – Sidney

+0

是的,但是你在方法的顶部进行了计算,这不包括在我的代码中。请尝试使用标识矩阵,如果不是,您的矩阵是正确的。 –

+0

嗨,再次感谢您花时间,真的很感激!我试图像你说的那样改变它,但不幸的是结果是一样的。 – Sidney