簡體   English   中英

將轉換矩陣添加到spritebatch后,C#Draw方法無法在屏幕上繪制

[英]C# Draw method does not draw to screen after adding transformation matrix to spritebatch

我一直在嘗試在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方法。

如上在game1.cs中所示,實際的繪圖由ScreenManager類的單例實例使用其draw方法處理。

我懷疑它一開始就試圖將矩陣應用於漸變屏幕/標題屏幕,並且這會導致出現錯誤,例如無法通過黑色背景。 也許是因為攝像機位置沒有玩家位置?

我已經嘗試為Camera和Player的繪制方法使用單獨的spritebatch.Begin(),但這當然會導致錯誤,我在另一個結束之前調用了新的spriteBatch.Begin。

我覺得這是可以解決的,但我可能盯着它看太久了,現在看不到解決方案。

我不想將其轉變為“查看我的整個項目並為我修復”,但是如果有人意識到這種情況並提出了意見,甚至遇到了同樣的事情並修復了它,我將非常感謝您反饋。

另外,如果有人需要更多代碼來查看。 隨時讓我知道。

嘗試向其提供一個身份矩陣。 那應該起作用,並且可以確認矩陣一定有問題。 自從我這樣做已經有一段時間了,但是它認為這可行。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM