Я пробовал свои силы в создании простой 2D-игры в Monogame. Я нашел онлайн-учебник для класса 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() без каких-либо аргументов, экран заголовка и главное меню загружаются просто отлично, а затем тайловая карта и проигрыватель. Однако, когда я добавляю аргумент Camera.Viewmatrix, экран остается черным. Кажется, он ничего не рисует дальше Graphicsdevice.Clear(Color.Black).
Я был бы признателен за любой вклад. И, пожалуйста, дайте мне знать, если вам нужно увидеть больше моего кода.
ОБНОВЛЕНИЕ: Камера и матрица, я считаю, в порядке. Проблема связана с тем, что у меня есть много классов, например Screenmanager, Image, Tile, Layer, TitleScreen,..., которые все используют метод Update и большинство из них — метод Draw.
Фактическое рисование обрабатывается, как показано выше в game1.cs, одноэлементным экземпляром класса ScreenManager, использующим его метод рисования.
Я подозреваю, что он пытается применить матрицу к фейдскрину/титульному экрану в начале, и это вызывает такие ошибки, как отсутствие перехода за пределы черного фона. Возможно, потому что положение камеры не имеет положения игрока?
Я попытался использовать отдельный spritebatch.Begin() для методов отрисовки Camera и Player, но это, конечно, приводит к ошибке, что я вызываю новый spriteBatch.Begin до того, как закончится другой.
Я чувствую, что это решаемо, но, возможно, я слишком долго смотрел на это, чтобы увидеть решение сейчас.
Я не хочу превращать это в «посмотри на весь мой проект и исправь это для меня», но если кто-то распознает эту ситуацию и внес свой вклад или даже столкнулся с тем же самым и исправил это, я был бы очень признателен за ваше Обратная связь.
Кроме того, если кому-то потребуется больше кода для просмотра, снова. не стесняйтесь, дайте мне знать.
viewMatrix
неверен. 11.07.2016