Реализация камеры / видового экрана в 2D игре

21

Какой самый практичный способ реализовать камеру / видовой экран в 2D-игре?

Я читал, что я должен хранить положение объекта в мире, а не положение относительно экрана?

Текущая ситуация:

Я реализовал простую 2D-игру, в которой загружаю объекты и уровни из XML-файлов. На данный момент уровень XML-файла выглядит так:

<map>
   <tile obj="ground" x="0" y="555" />
   <tile obj="ground" x="16" y="555" />
   <tile obj="ground" x="32" y="555" />
   ...
</map>

Все объекты имеют двухмерное векторное «положение», сохраняющее их текущее местоположение на экране.

Что я хочу, чтобы это было:

Окно просмотра / иллюстрация игрового мира

На картинке:

  • Камера либо 800x600 или 640x480
  • Блоки и спрайты имеют размер 16x16 пикселей.
  • Размер мира может варьироваться
  • Координаты наверное надо нормализовать относительно мира, а не экрана?
  • Положение области просмотра относительно x, y игрока и перемещается, когда игрок достигает мертвой зоны камеры (аналогично этому видео ).

Я прошу псевдо примеры / статьи, но если вам нужно знать, что я использую для разработки: SDL & C / C ++.

bluekirai
источник
1
Добавьте третью ссылку в комментарии здесь, и я могу добавить ее к вашему вопросу.
MichaelHouse
Вот что я имел в виду под «мертвой зоной» камеры: youtube.com/watch?v=89TRXUm8jMI
bluekirai
возможный дубликат gamedev.stackexchange.com/questions/38672/…
wolfdawn
Привет @ Артур Вульф Уайт, хочешь уточнить? Благодарю.
bluekirai
Упомянутая вами камера является специфической версией обычной 2d-камеры, которая используется только для смещения изображения (без поворота и масштабирования). Отслеживание поведения может быть реализовано путем проверки расстояния между персонажем игрока и камерой, перемещения камеры, если расстояние слишком велико.
wolfdawn

Ответы:

20

Вам нужно расположить каждый объект относительно мира вместо экрана. Ваша камера также должна иметь свои собственные мировые координаты, чтобы ее можно было нарисовать в относительном положении в мире. Также может быть удобно, чтобы ваша камера следовала за объектом, поэтому, где бы он ни находился, камера просто использует свои координаты. Обычно координаты камеры располагаются в верхнем левом углу. Это означает, что камера будет иметь мировое положение приблизительно (0,24) на изображении .

Что касается фактического рисования объектов, которые камера может «видеть», вы должны нарисовать все объекты относительно мировых координат камеры. Чтобы вычислить положение экрана объекта относительно камеры, просто выполните:

int screenX, screenY; //screen position of the object being drawn

screenX = object.x-camera.x;
screenY = object.y-camera.y;

Очевидно, что некоторые объекты на самом деле не видны камере, поэтому вы можете захотеть внедрить систему отбора изображений.

Дэн Уоткинс
источник
2

Лучше всего делать все это в графическом процессоре, используя матрицы World и View, а не изменяя, где вы рисуете объекты на CPU.

Таким образом, вы можете произвольно менять камеру (даже увеличивать и уменьшать ее!), И она будет просто волшебно работать. Вы все еще можете делать выборочный просмотр, чтобы сэкономить время рисования. И ни один из ваших кодов для рисования мира не должен будет измениться после того, как вы правильно настроите матрицы вида и мира.

В SDL вы, вероятно, можете просто встроить вызовы OpenGL, такие как glOrthoи glTranslate.

Смотрите эту ветку .

mklingen
источник
Может ли кто-нибудь объяснить отрицательный голос? Это имеет смысл.
Привет, Мир,
1
Я не проголосовал против, но я думаю, что это потому, что это даже не отвечает на вопрос. Вопрос в том, как рассчитать что-то, а не в том, является ли это более эффективным или проще сделать на GPU или CPU. ОП даже сказал, что ищет псевдо-примеры. Нет сомнений в том, что использование комбинации матриц камера / мир / модель было бы более эффективным, поэтому у mklingen есть минимум.
Дэн Уоткинс
Этот ответ совсем не плохой! Он более специфичен для разработки OpenGL / DX, но это правильный подход, так как вы можете просто вычислить матрицу перевода на основе координат камеры и перемещать объекты через матрицу кулачка, не меняя их фактических положений.
Ненчев