Что такое хороший метод для прокрутки в игре на основе 2D-плиток?

9

Я использую Direct3D с оболочкой D3DXSPRITE, чтобы рисовать плитки на экране. У меня есть класс плиток, который содержит такие элементы, как столкновение и тип плиток, тогда у меня есть массив плиток, например

Сетка плиток [256] [256];

Какой будет лучший метод?

-Нарисуйте игрока в центре экрана и сместить туда, где рисует карта.

-Переместите плеер с камерой следующим.

Я использовал первый метод, но он становится действительно сложным, когда вы добираетесь до верхнего левого края карты, и когда другие игроки / враги находятся на карте и двигаются одновременно

если я заставлю камеру следовать за игроком, придется ли мне вызывать spriteBatch-> Draw (...) для каждой отдельной плитки сетки, даже если на экране могут поместиться только несколько?


источник

Ответы:

4

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


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

Перемещение камеры в мировых координатах и ​​перемещение вашего персонажа по всему миру - это самый простой способ решения этой проблемы. Работа в мировых координатах означает, что вам не нужно делать никаких дополнительных вычислений, когда она сводится ко всем другим системам, которые должны работать на Относительная система координат, а также понять, где они находятся в мировых координатах.

Поскольку вы работаете в 2D, другой хороший совет - сделать пространственное разбиение, проще всего было бы создать систему сетки виртуального мира, это позволит вам управлять каждой плиткой индивидуально, связывая спрайты и другие ресурсы для каждой плитки, поэтому по сути процесс будет:

  • создайте некоторый класс плиток, который может содержать граничные координаты для плитки и любые ресурсы, которые могут понадобиться конкретной плитке (спрайты, враги и т. д.).

  • определитесь с размером вашего мира и создайте двумерный массив (вы можете использовать одно измерение и получить к нему доступ как 2D) плиток, каждая из которых представляет часть вашего мира со всеми связанными с ней ресурсами.

  • только вытягивайте ресурсы из тайла, в котором находится игрок и его соседи.

С помощью сетки вы можете легко определить, в каком тайле находится игрок, основываясь на его положении относительно начала сетки.

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

Серхио Франко
источник
0

Я использую поверхность. Я создаю весь мир за пределами экрана и сохраняю координаты x и y. Я изменяю их, когда игрок движется, и каждый кадр рисует прямоугольник 1028 x 768 от поверхности до заднего буфера, используя x и y.

что касается других людей, я даю им x и y и позволяю им перемещаться по миру так, как им нравится, при рисовании я проверяю, есть ли x и y в прямоугольнике 1028 x 768, и если да, то рисую их (я использую текстуры для людей) ,

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

Я использую плитки размером 64х64, и самый большой мир, который я использовал до сих пор, это плитки размером 50х60.

Все это делается в прямой х с C ++

Skeith
источник
1
Это похоже на огромную память боров. Сохранение всего мира, нарисованного на поверхности вне экрана, вызовет у вас проблемы с памятью, если вы захотите сделать что-то вроде нескольких (анимированных) слоев для своего мира и расширить его дальше, чем у вас есть сейчас. Было бы намного лучше хранить информацию о мире и рисовать только те части / объекты, которые должны быть нарисованы, когда они должны быть нарисованы. Просто мои 2 цента. :)
Ричард Марскелл - Дракир
@Drackir Я думаю, ты неправильно понял. только мир выводится за пределы экрана, такие вещи, как другие, отслеживаются и рисуются в буфере поддержки, когда они необходимы. также я не вижу себя делающим более 70 х 70 мира. когда я говорю «мир», я имею в виду область, это может быть город, темница или внутренняя часть дома, когда игрок перемещается между ними, за пределами экрана восстанавливается поверхность. да, это требует памяти, но 2d плитки на современных террабитовых накопителях делают это незначительным, а загрузка в несколько секунд - это небольшая цена за плавную прокрутку и анимацию. но да, есть лучшие и более сложные пути :)
Skeith
Поверхность должна храниться в памяти карты GFX, а не на жестком диске. Тем не менее, я считаю, что если память карты GFX слишком велика, она переместит поверхности на HD, что значительно замедлит процесс. По общему признанию, это было некоторое время, так как я имел дело с этим материалом, поэтому я не помню точно, как он работал, но я предполагаю, что пока вы не рисуете слишком большой мир, это будет хорошо. :)
Ричард Марскелл - Дракир
@Drackir Это интересно знать, я никогда не думал об этом так. Я обнаружил, что этот способ дает мне более плавную прокрутку, что, если я динамически рисую новые плитки, так что я думаю, что это хорошо вписывается, но мне придется изучить это.
Скит
Я работал над игрой, в которой у меня были карты 31х31, но они были соединены вместе. Я пытался работать с чужого движка, и они рисовали все карты, на которых находился игрок; итак девять карт всего. Каждая карта имела несколько (я думаю, 6) слоев. Таким образом, как 31x31x9x6 = 51894 разрисованных плиток (максимум, конечно, не все плитки были заполнены) каждый раз, когда пользователь переключает карты. Для меня это было огромным замедлением, поэтому я переписал процедуру рисования так, чтобы рисовать только плитки, окружающие игрока, на расстоянии до 1 плитки за краем экрана (для обработки частичных плиток во время движения).
Ричард Марскелл - Дракир
0

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

cliffski
источник