【问题标题】:C# Draw method does not draw to screen after adding transformation matrix to spritebatch将变换矩阵添加到 spritebatch 后,C# Draw 方法不绘制到屏幕上
【发布时间】:2016-04-27 12:21:15
【问题描述】:

我一直在尝试用 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 方法。

ScreenManager 类的单例实例使用它的 draw 方法如上面在 game1.cs 中所示处理实际绘图。

我怀疑它试图在开始时将矩阵应用于淡入淡出屏幕/标题屏幕,这会导致错误,例如没有超过黑色背景。可能是因为摄像机位置没有玩家位置?

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

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

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

另外,如果有人需要更多代码来查看,请再说一遍。随时告诉我。

【问题讨论】:

    标签: c# 2d monogame


    【解决方案1】:

    尝试给它一个单位矩阵。这应该可行,并且可以确认您的矩阵一定有问题。我这样做已经有一段时间了,但它认为这很有效。

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

    【讨论】:

    • 请原谅我潜在的无知,但这不是我所做的:viewMatrix = Matrix.CreateTranslation(new Vector3(-position, 0));与您的建议基本相同: viewMatrix = Matrix.CreateTranslation(new Vector3(-playerPosition.X, -playerPosition.Y, 0.0f));
    • 是的,但是你在方法的顶部进行计算,我的代码中没有包含。请尝试使用身份矩阵,如果没有,您的矩阵是正确的。
    • 再次您好,感谢您抽出宝贵时间,非常感谢!我试着像你说的那样改变它,但不幸的是结果是一样的。
    • 那是我建议的矩阵,还是身份?
    • 我希望我能正确理解你。我在绘制函数中使用了单位矩阵,并且游戏正常加载。 spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, null, null, null, null, Matrix.Identity);当我使用 viewmatrix 时,同样的问题又出现在屏幕保持黑色的地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多