Я самостоятельно изучаю C ++ и играю в 2D-мозаику.
Я читал это scrolling
сообщение Вот, который основан на этом учебник плитки.
Используя вышеупомянутое руководство и некоторую помощь от Pearson, Computer Graphics with OpenGL
Книга, которую я написал небольшую программу, которая рисует 40x40
плиточный мир и Sprite
(тоже плитка).
С точки зрения порядка рисования / рендеринга сама карта (или мир) — это задний слой, а спрайт — самый передний (или верхний) слой. Я предполагаю, что это хороший способ сделать это, так как для двух плиток легче взаимодействовать, чем для плитки и пользовательского спрайта или прямоугольника. Это верно?
Я реализовал Keyhandling()
функция, которая позволяет перемещать map
внутри viewport
с использованием keyboards arrow keys
, У меня есть переменная с именем offsetx, offsety
что при нажатии клавиши увеличивается или уменьшается. В зависимости от того, назначу ли я переменную map
или же sprite
Я могу больше одного или другого в любом направлении на экране.
Ни один из них, кажется, не работает очень хорошо, поэтому я назначил переменные обоим (карта и спрайт), но с положительными значениями для спрайта и отрицательными для карты. Таким образом, после нажатия клавиши это позволяет моему Sprite двигаться в одном направлении, в то время как карта движется в противоположном направлении.
Моя проблема в том, что спрайт вскоре перемещается достаточно, чтобы покинуть окно, и недостаточно для того, чтобы принести больше карты на сцену. (Окно показывает только 1/8th
из плитки в любое время).
Я думал весь день, и я думаю, что эффективным / действенным способом решения этой проблемы было бы исправить sprite
к центру экрана и при нажатии клавиши map
движется вокруг … Я не уверен, как это реализовать, хотя.
Это был бы хороший способ? Или он тоже должен переместить окно просмотра или камеру?
Вы не хотите перемещать все относительно Спрайта, когда ваш персонаж движется. Рассмотрим более сложный мир, в котором на карте также есть другие вещи, например, другие спрайты. Проще всего зафиксировать карту и переместить каждый спрайт относительно карты (если это подвижный спрайт). Просто не имеет смысла перемещать все в мире, когда ваш персонаж перемещается по миру.
Если вы хотите визуализировать свой мир с вашим персонажем всегда в центре, это прекрасно. Лучше всего двигать камеру. Это также позволяет вам увеличивать / уменьшать камеру, поворачивать камеру и т. Д. С минимальными трудностями при отслеживании всех объектов в мире.
Будьте осторожны при использовании слова «viewport». Это означает очень специфическую вещь в OpenGL. (т.е. посмотрите на функцию glViewport
). Если ваша книга использует его по-другому, это нормально. Я просто указываю на это, потому что мне не совсем понятно, что вы подразумеваете под этим.
Других решений пока нет …