【发布时间】: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。
我觉得这是可以解决的,但我可能已经盯着它太久了,现在看不到解决方案。
我不想把它变成“查看我的整个项目并为我修复它”,但如果有人认识到这种情况并提出意见,或者甚至遇到同样的事情并修复它,我会非常非常感谢您的反馈。
另外,如果有人需要更多代码来查看,请再说一遍。随时告诉我。
【问题讨论】: