2D матричное преобразование (с игроком и землей)

У меня есть простая игра, которую я пытаюсь сделать в учебных целях, но матрицы немного сложнее, особенно в DirectX.

В настоящее время у меня есть система плиток, которая отображает плитки на экране и положение персонажа в центре (при запуске)

Когда игрок перемещается влево, земля должна двигаться вправо, чтобы он всегда был в центре экрана. Я использую Спрайт, чтобы трансформировать плитки и игрока, но у меня возникают проблемы, потому что земля движется, а игрок стоит на земле, все еще находясь в центре.

Это 2D игра сверху вниз, поэтому мне нужно только трансформировать позицию (и, возможно, вращение)

Мой класс камеры имеет этот метод:

D3DXMatrixTransformation2D(&View, NULL, 0, &Scale, &Center, D3DXToRadian(Rotation), &Position);

Я также попробовал (для камеры):

D3DXMatrixTranslation(&View, Position.x, Position.y, 0);

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

Точно так же, как выше, но с его положением, вращением и тому подобным …

Чего мне не хватает и что мне нужно?

У меня есть только система тайлов, которая соответствует ширине / высоте экрана, поэтому я должен видеть, когда он движется, но он стоит в центре и на земле, а игрок движется.

Нужно ли инвертировать матрицу, чтобы земля двигалась в противоположном направлении?

Только игрок перемещается сюда, и мир трансформируется вокруг него.

пример

Я должен сказать, что, будучи языком номер один в программировании игр, есть очень мало руководств, объясняющих простые вещи, как «TopDown Camera in 2D» …

3

Решение

Для вашей проблемы вы должны прочитать что-то о различных пространствах: пространстве объектов, пространстве мира и пространстве камеры. (В основном это относится к 3D-пространству, но я постараюсь объяснить это для 2D)

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

Мировое пространство
Это твой игровой мир. Он описывает положение и ориентацию каждого объекта в вашей сцене.

Пространство камеры
Это описывает текущий взгляд на ваш игровой мир. Предполагается, что камера зафиксирована в середине экрана, и вы перемещаете весь мир, чтобы соответствовать текущей точке обзора (например, переводить с отрицательной позицией).

Для вашего случая это означает, что вам нужна матрица для каждого объекта, которая описывает смещение, по которому изображение правильно отцентрировано в позиции (пространстве объектов). Тогда вам нужно превратить объект в мировое пространство. Поэтому вам нужна матрица с позицией и ориентацией объекта и умножьте ее на матрицу объекта. Наконец, вы должны принять во внимание точку обзора и умножить матрицу камеры, чтобы объект трансформировался из мирового пространства в космическое пространство. В результате получается матрица, которую вы используете для рендеринга.

Надеюсь, это поможет 🙂

2

Другие решения

С помощью людей в чате я понял, в чем проблема с моей системой, хотя я пробовал похожие вещи, но, вероятно, в неправильном порядке / порядке.

Для простой 2D камеры TopDown с простым позиционированием:

Camera2D Перевод:

D3DXMatrixTranslation(&CameraView, Position.x, Position.y, 0);

Для каждого объекта в поле зрения камеры:

D3DXMATRIX ObjectWorld;
D3DXMatrixTransformation2D(&ObjectWorld, NULL, 0, NULL, NULL, 0, &Position);

D3DXMATRIX Translation;
D3DXMatrixMultiply(&Translation, ObjectWorld, CameraView);

и затем сделать спрайт:

sprite->SetTransform(&Translation);
sprite->Draw(Texture, NULL, NULL, NULL, Color);

хотя этот метод требует от меня перемещения камеры в направлении, противоположном движению игрока, поэтому, если игрок перемещается на +100, камера должна двигаться на -100, чтобы все еще располагаться в том же месте относительно игрока.

0

По вопросам рекламы [email protected]