我一直在努力在制作一个简单的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之前,另一个已经结束。
我觉得这是可以解决的,但我可能一直盯着它看太久了,看现在的解决方案。
我不想把它变成'看看我的整个项目并为我修复它',但如果有人认识到这种情况并已经输入,甚至碰到同样的事情并修复它,我会非常感谢您的反馈。
另外,任何人都需要更多的代码来查看。随时让我知道。
原谅我的无知的潜力,而不是我做的: viewMatrix = Matrix.CreateTranslation(新的Vector3( - 位,0)); 与您的建议基本相同: viewMatrix = Matrix.CreateTranslation(new Vector3(-playerPosition.X,-playerPosition.Y,0.0f)); – Sidney
是的,但是你在方法的顶部进行了计算,这不包括在我的代码中。请尝试使用标识矩阵,如果不是,您的矩阵是正确的。 –
嗨,再次感谢您花时间,真的很感激!我试图像你说的那样改变它,但不幸的是结果是一样的。 – Sidney