У меня есть простая игра, которую я пытаюсь сделать в учебных целях, но матрицы немного сложнее, особенно в DirectX.
В настоящее время у меня есть система плиток, которая отображает плитки на экране и положение персонажа в центре (при запуске)
Когда игрок перемещается влево, земля должна двигаться вправо, чтобы он всегда был в центре экрана. Я использую Спрайт, чтобы трансформировать плитки и игрока, но у меня возникают проблемы, потому что земля движется, а игрок стоит на земле, все еще находясь в центре.
Это 2D игра сверху вниз, поэтому мне нужно только трансформировать позицию (и, возможно, вращение)
Мой класс камеры имеет этот метод:
D3DXMatrixTransformation2D(&View, NULL, 0, &Scale, &Center, D3DXToRadian(Rotation), &Position);
Я также попробовал (для камеры):
D3DXMatrixTranslation(&View, Position.x, Position.y, 0);
затем, когда я рендерил наземный спрайт, я настраивал его для преобразования в камеру, но у проигрывателя есть своя собственная матрица, которую я использую, когда он движется.
Точно так же, как выше, но с его положением, вращением и тому подобным …
Чего мне не хватает и что мне нужно?
У меня есть только система тайлов, которая соответствует ширине / высоте экрана, поэтому я должен видеть, когда он движется, но он стоит в центре и на земле, а игрок движется.
Нужно ли инвертировать матрицу, чтобы земля двигалась в противоположном направлении?
Только игрок перемещается сюда, и мир трансформируется вокруг него.
Я должен сказать, что, будучи языком номер один в программировании игр, есть очень мало руководств, объясняющих простые вещи, как «TopDown Camera in 2D» …
Для вашей проблемы вы должны прочитать что-то о различных пространствах: пространстве объектов, пространстве мира и пространстве камеры. (В основном это относится к 3D-пространству, но я постараюсь объяснить это для 2D)
Пространство объекта
Каждый объект должен быть смоделирован или в вашем случае нарисован так, чтобы находиться в пространстве объектов. Это означает, что для каждого объекта это матрица, которая определяет центр, например, вашего игрока.
Мировое пространство
Это твой игровой мир. Он описывает положение и ориентацию каждого объекта в вашей сцене.
Пространство камеры
Это описывает текущий взгляд на ваш игровой мир. Предполагается, что камера зафиксирована в середине экрана, и вы перемещаете весь мир, чтобы соответствовать текущей точке обзора (например, переводить с отрицательной позицией).
Для вашего случая это означает, что вам нужна матрица для каждого объекта, которая описывает смещение, по которому изображение правильно отцентрировано в позиции (пространстве объектов). Тогда вам нужно превратить объект в мировое пространство. Поэтому вам нужна матрица с позицией и ориентацией объекта и умножьте ее на матрицу объекта. Наконец, вы должны принять во внимание точку обзора и умножить матрицу камеры, чтобы объект трансформировался из мирового пространства в космическое пространство. В результате получается матрица, которую вы используете для рендеринга.
Надеюсь, это поможет 🙂
С помощью людей в чате я понял, в чем проблема с моей системой, хотя я пробовал похожие вещи, но, вероятно, в неправильном порядке / порядке.
Для простой 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, чтобы все еще располагаться в том же месте относительно игрока.