我一直在尝试用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结束之前调用的错误。
我觉得这是可以解决的,但我现在可能已经盯着它看了解太长时间了。
我不想把它变成'看看我的整个项目并为我修复它',但如果有人认识到这种情况并有输入,或者甚至遇到同样的事情并修复它,我会非常非常感谢您的反馈。
此外,如果有人需要更多代码再次查看。随时让我知道。
答案 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));
}