WedX - журнал о программировании и компьютерных науках

Метод C # Draw не рисует на экране после добавления матрицы преобразования в пакет спрайтов

Я пробовал свои силы в создании простой 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 до того, как закончится другой.

Я чувствую, что это решаемо, но, возможно, я слишком долго смотрел на это, чтобы увидеть решение сейчас.

Я не хочу превращать это в «посмотри на весь мой проект и исправь это для меня», но если кто-то распознает эту ситуацию и внес свой вклад или даже столкнулся с тем же самым и исправил это, я был бы очень признателен за ваше Обратная связь.

Кроме того, если кому-то потребуется больше кода для просмотра, снова. не стесняйтесь, дайте мне знать.

27.04.2016

Ответы:


1

Попробуйте скормить ему матрицу идентичности. Это должно сработать, и это подтвердит, что что-то не так с вашей матрицей. Прошло некоторое время с тех пор, как я сделал это, но думаю, что это сработало.

 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));
}
27.04.2016
  • Простите мое потенциальное невежество, но это не то, что я делаю: viewMatrix = Matrix.CreateTranslation(new Vector3(-position, 0)); по сути то же самое, что и ваше предложение: viewMatrix = Matrix.CreateTranslation(new Vector3(-playerPosition.X, -playerPosition.Y, 0.0f)); 27.04.2016
  • Да, но вы делаете расчет в верхней части метода, который не включен в мой код. И, пожалуйста, попробуйте матрицу идентичности, если это не так, ваша матрица верна. 27.04.2016
  • Привет еще раз, спасибо, что нашли время, очень ценю это! Я пытался изменить его, как вы сказали, но результат тот же, к сожалению. 28.04.2016
  • И это с матрицей, которую я предложил, или с Идентификацией? 28.04.2016
  • Надеюсь, я вас правильно понял. Я использовал матрицу идентичности в своей функции рисования, и игра загрузилась нормально. spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, null, null, null, null, Matrix.Identity); Когда я использую матрицу просмотра, возникает та же проблема, что и раньше, когда экран остается черным. 28.04.2016
  • Прости! Должно быть, я пропустил уведомление, на которое вы ответили! В любом случае, если вы не решили проблему, это означает, что ваш viewMatrix неверен. 11.07.2016
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]