Как мне держать моего персонажа в центре экрана?

8

Я делаю игру, похожую на Legend of Zelda: Link to the Past (2D-приключение сверху вниз). Я хочу, чтобы персонаж оставался в центре на экране, когда он двигается.

В настоящее время, когда игрок хочет двигаться, я перемещаю всю карту в противоположном направлении. Это работает, но когда я добавляю больше объектов в мир, их перемещение становится все сложнее.

Есть ли лучший способ приблизиться к этому?

asbumste
источник
19
Создайте камеру и переместите это. По сути, все будет нарисовано со смещением в зависимости от положения камеры. Перемещение вселенной, чтобы переместить вашего персонажа - это немного чрезмерный профессор Фарнсворт.
MichaelHouse
1
+1 для ссылки на его ссылку на его ссылку на футуруму: P
дверная ручка
@ Byte56 Спасибо, это близко к тому, что я делаю, так что я могу просто оставить все как есть. Но это имеет большой смысл. Хотите поставить это в ответ, чтобы я мог принять это?
asbumste
Какую подсистему рендеринга вы используете?
Бобобобо

Ответы:

8

Типичный способ справиться с этим - создать объект камеры. Самая простая форма камеры - это просто позиция. Эта простая камера определяет «центр» текущего вида. Таким образом, вы не изменяете все позиции ваших плиток / объектов, вы просто вычитаете координаты камеры из позиций при рисовании. В этой ситуации камера не «двигается».

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

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

MichaelHouse
источник
Привет, Байт, я успешно выполнил то, что ты сказал ... Я думаю. Но теперь я сталкиваюсь с проблемами ... Вы можете помочь взглянуть? Один парень сказал, что мне на самом деле не нужен cam variables... и предложил альтернативный метод ... stackoverflow.com/questions/18199373/…
Growler
Я посмотрю на это позже, а пока я предлагаю вам спросить об этом в чате .
MichaelHouse
3

Нет, это неправильный путь.

Как вы собираетесь делать обнаружение ловушек? Как насчет того, когда игрок достигает края стен? Будет ли ваша система просмотра работать с подземельями или вам придется переписывать значительную часть кода?

Мир это геометрия. Игрок это геометрия. Мир не двигается. Плеер делает. Установите положение камеры в центре проигрывателя. Всегда . И это все, что нужно сделать.

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

Это правда, что рендеринг OpenGL на самом деле работает, «фиксируя камеру так, чтобы она указывала вниз - z, и преобразовывая и поворачивая всю геометрию мира, чтобы она соответствовала объему канонического вида», но вы не должны думать об этом таким образом при программировании , gluLookAtимеет параметры, названные eye, lookи upпо причине - так что вы можете думать с точки зрения разумной системы координат.

bobobobo
источник
Одной из самых больших ошибок, которые я сделал с системой пользовательского интерфейса GL, которую я разрабатывал, была попытка работать в канонических координатах ([-1,1]) «для упрощения». Все экранные объекты имели координаты в [-1,1]. Это была огромная ошибка, я постоянно пытался думать в этом диапазоне [-1,1], конвертируя между пикселями и NDC, конвертируя обратно. Когда я отказался от этой идеи работать в NDC и просто работал в пикселях и конвертировал в NDC непосредственно перед рендерингом, как вы и предполагали , было много различий в том, насколько легко было думать о расположении элементов на экране, обрабатывать события ввода и т. д.
бобобо