Какой самый практичный способ реализовать камеру / видовой экран в 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 ++.
c++
2d
architecture
camera
bluekirai
источник
источник
Ответы:
Вам нужно расположить каждый объект относительно мира вместо экрана. Ваша камера также должна иметь свои собственные мировые координаты, чтобы ее можно было нарисовать в относительном положении в мире. Также может быть удобно, чтобы ваша камера следовала за объектом, поэтому, где бы он ни находился, камера просто использует свои координаты. Обычно координаты камеры располагаются в верхнем левом углу. Это означает, что камера будет иметь мировое положение приблизительно (0,24) на изображении .
Что касается фактического рисования объектов, которые камера может «видеть», вы должны нарисовать все объекты относительно мировых координат камеры. Чтобы вычислить положение экрана объекта относительно камеры, просто выполните:
Очевидно, что некоторые объекты на самом деле не видны камере, поэтому вы можете захотеть внедрить систему отбора изображений.
источник
Лучше всего делать все это в графическом процессоре, используя матрицы World и View, а не изменяя, где вы рисуете объекты на CPU.
Таким образом, вы можете произвольно менять камеру (даже увеличивать и уменьшать ее!), И она будет просто волшебно работать. Вы все еще можете делать выборочный просмотр, чтобы сэкономить время рисования. И ни один из ваших кодов для рисования мира не должен будет измениться после того, как вы правильно настроите матрицы вида и мира.
В SDL вы, вероятно, можете просто встроить вызовы OpenGL, такие как
glOrtho
иglTranslate
.Смотрите эту ветку .
источник