Я использую Direct3D с оболочкой D3DXSPRITE, чтобы рисовать плитки на экране. У меня есть класс плиток, который содержит такие элементы, как столкновение и тип плиток, тогда у меня есть массив плиток, например
Сетка плиток [256] [256];
Какой будет лучший метод?
-Нарисуйте игрока в центре экрана и сместить туда, где рисует карта.
-Переместите плеер с камерой следующим.
Я использовал первый метод, но он становится действительно сложным, когда вы добираетесь до верхнего левого края карты, и когда другие игроки / враги находятся на карте и двигаются одновременно
если я заставлю камеру следовать за игроком, придется ли мне вызывать spriteBatch-> Draw (...) для каждой отдельной плитки сетки, даже если на экране могут поместиться только несколько?
Перемещение камеры в мировых координатах и перемещение вашего персонажа по всему миру - это самый простой способ решения этой проблемы. Работа в мировых координатах означает, что вам не нужно делать никаких дополнительных вычислений, когда она сводится ко всем другим системам, которые должны работать на Относительная система координат, а также понять, где они находятся в мировых координатах.
Поскольку вы работаете в 2D, другой хороший совет - сделать пространственное разбиение, проще всего было бы создать систему сетки виртуального мира, это позволит вам управлять каждой плиткой индивидуально, связывая спрайты и другие ресурсы для каждой плитки, поэтому по сути процесс будет:
создайте некоторый класс плиток, который может содержать граничные координаты для плитки и любые ресурсы, которые могут понадобиться конкретной плитке (спрайты, враги и т. д.).
определитесь с размером вашего мира и создайте двумерный массив (вы можете использовать одно измерение и получить к нему доступ как 2D) плиток, каждая из которых представляет часть вашего мира со всеми связанными с ней ресурсами.
только вытягивайте ресурсы из тайла, в котором находится игрок и его соседи.
С помощью сетки вы можете легко определить, в каком тайле находится игрок, основываясь на его положении относительно начала сетки.
Чтобы обойти упомянутую выше проблему с камерой, необходимо сделать плеер и камеру двумя независимыми системами, в которых камера не будет перемещаться дальше, чем центр краевых плиток, поэтому, когда игрок движется к этой плитке, он все еще может перемещаться по всей вся плитка, поскольку он связан мировыми координатами (т.е. больше не центрирован на экране), но камера заблокирована.
источник
Я использую поверхность. Я создаю весь мир за пределами экрана и сохраняю координаты x и y. Я изменяю их, когда игрок движется, и каждый кадр рисует прямоугольник 1028 x 768 от поверхности до заднего буфера, используя x и y.
что касается других людей, я даю им x и y и позволяю им перемещаться по миру так, как им нравится, при рисовании я проверяю, есть ли x и y в прямоугольнике 1028 x 768, и если да, то рисую их (я использую текстуры для людей) ,
У меня есть плеер в центре экрана и проверяю, достиг ли край света края экрана. В этом случае игрок перемещается по экрану к краю мира и обратно к центру, после чего мир снова начинает двигаться. это кажется трудным и заняло у меня некоторое время, но это не так уж плохо.
Я использую плитки размером 64х64, и самый большой мир, который я использовал до сих пор, это плитки размером 50х60.
Все это делается в прямой х с C ++
источник
Вполне нормально, что код испытывает некоторую боль в углах мозаичного мира, когда решает, какие элементы рисовать, и одновременно гарантирует, что камера не выйдет «за пределы мира». Эти крайние случаи - в основном самая удобная вещь в реализации двухмерного мира на основе плиток, который больше, чем разрешение экрана. Все становится намного сложнее, если вы поддерживаете увеличение и увеличение до курсора: D
источник