2d плитка на основе игрового дизайна, как мне нарисовать карту с окном просмотра? - PullRequest
2 голосов
/ 04 марта 2012

Я боролся с этим некоторое время.

В настоящее время у меня есть сетка размером 100 на 100 плиток, принадлежащая карте.

Карта реализует IDrawable.Я вызываю Draw (), и он рисует себя в 0,0, что нормально.

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

У меня проблемы с продумыванием архитектуры для этогоодин.У меня склад ума, что вещи должны рисовать сами, то есть я говорю player1.Draw (), и он рисует сам.Это работало бы раньше, когда он рисовал игрока в точке x, y на экране, но с окном просмотра он больше не будет знать, где рисовать себя.

Так что, если окно просмотра будет приказано рисовать, и исследоватькаждый объект в игре и нарисовать те, которые видны?Должны ли плитки карты быть объектами, которые подвергаются этому?Или должен ли видовой экран разумно рисовать карту, соединяя их вместе?

Мне бы хотелось знать, как это делают типичные игры с прокруткой.

Если это имеет значение, я использую XNA

Изменить, чтобы добавить: Можете ли вы выполнять графические манипуляции, например, пробовать подход к рендерингу HTML, где вы говорите, что нужно рисовать, и они возвращают графическое изображение, а затем родитель помещает графическое изображение в правильное местоположение?Я думаю, если бы у меня было 2 видовых экрана рядом для разделенного экрана, как бы я прекратил их рисовать за пределами краев?

Ответы [ 2 ]

2 голосов
/ 04 марта 2012

Возможный дизайн:

  1. Существует 2D "мир", который содержит экземпляры объектов.
  2. «Экземпляр объекта» - это ссылка на спрайт + его координаты в мире.
  3. Когда вы рисуете сцену, вы запрашиваете список видимых объектов, которые существуют в данной 2D области, затем вы рисуете их.

При таком дизайне мир может быть очень огромным.

У меня склад ума, что вещи должны рисовать сами, то есть я говорю player1.Draw (), и он рисует сам.

видимый вещи должны нарисовать себя. Объекты вне области просмотра не видны.

, как бы я остановил их рисование вне краев?

Не уверен насчет XNA, но OpenGL имеет «тест ножниц» / «glViewport», а Direct3D 9 имеет метод «SetViewport», который позволяет вам использовать часть экрана / окна для рендеринга. Существуют также клиппланы и буфер трафаретов (однако использование трафарета для 2D-отсечения является излишним). Вы также можете рендерить в текстуру, а затем рендерить текстуру. Есть много способов справиться с этим.

Так нужно ли указывать в окне просмотра рисовать, исследовать каждый объект в игре и рисовать те, которые видны?

В большом мире вам не следует проверять каждый объект, потому что он будет медленным. Вы должны быть в состоянии найти видимый объект, не проверяя каждый из них. Для этого вам понадобится какое-то пространственное разбиение - деревья квадратов (потому что мы в 2D), деревья kd и т. Д. Таким образом, вы сможете обрабатывать несколько тысяч (или даже сотен тысяч) объектов до тех пор, пока Вы не видите их всех сразу.

Должны ли элементы карты быть объектами, которые подвергаются этому?

Если вы продолжаете рисовать невидимые вещи, FPS упадет.

и они возвращают графическое изображение себя

Для 2D-игры это может быть очень медленно. Помните принцип KISS.

2 голосов
/ 04 марта 2012

Некоторые основные идеи, не относящиеся к XNA:

  • объекты рисуют себя на «виртуальном экране» в мировых координатах, они не рисуют себя непосредственно на экране
  • Рисованные объекты получают объект «графический контекст», который предлагает вам API рисования.«Графический контекст» знает о текущих границах области просмотра и осуществляет преобразование координат из мировых координат в экранные координаты (для каждой операции рисования).Графический контекст также выполняет прямое рисование на экране (или в фоновом буфере экрана, если вам нужна двойная буферизация).
  • , когда у вас много объектов за пределами видимых границ вашего окна просмотра, а затем для оптимизации производительностиваш цикл рисования может выполнить предварительную проверку границ ваших объектов и проверить, находятся ли они полностью за пределами видимой области.Если это так, нет необходимости позволять им рисовать себя.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...