将转换矩阵添加到spritebatch后,C#Draw方法不会绘制到屏幕

时间:2016-04-27 12:21:16

标签: c# 2d monogame

我一直在尝试用Monogame制作简单的2D游戏。我在网上找到了一个Camera类的教程,用于将屏幕滚动到我的角色移动的位置。

这是相机类:

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中我使用以下Draw方法:

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()时,Titlescreen和mainmenu加载就好了,然后是tilemap和播放器。 但是,当我添加Camera.Viewmatrix参数时,屏幕保持黑色。它似乎没有绘制任何超过Graphicsdevice.Clear(Color.Black)。

我会很感激任何和所有的输入。如果您需要查看更多我的代码,请告诉我。

更新:我相信相机和矩阵都很好。问题与我有很多类的事实有关,例如Screenmanager,Image,Tile,Layer,TitleScreen,...都使用Update,其中大多数都是Draw方法。

实际绘图正在使用其draw方法由ScreenManager类的单例实例在game1.cs中进行处理。

我怀疑它正在尝试在开始时将矩阵应用于淡入淡出/标题屏幕,这会导致错误,例如不会越过黑色背景。也许是因为相机位置没有玩家位置?

我已经尝试为Camera和Player绘制方法使用单独的spritebatch.Begin(),但这当然会导致我在另一个spriteBatch.Begin结束之前调用的错误。

我觉得这是可以解决的,但我现在可能已经盯着它看了解太长时间了。

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

此外,如果有人需要更多代码再次查看。随时让我知道。

1 个答案:

答案 0 :(得分:0)

尝试为其提供一个Identity矩阵。这应该工作,它将确认你的矩阵必定有问题。自从我这样做以来已经有一段时间了,但它认为这很有效。

 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));
}