Вражеский рендеринг

#java #rendering

#java #рендеринг

Вопрос:

Я создаю «игру в плитки»введите описание изображения здесь

Вопрос, который я хотел бы задать: допустим, моя карта будет размером 5000 * 5000 плиток, и, как вы можете видеть, у меня там уже есть несколько врагов (две красные кучки-слизи : D) проблема в том, что я хотел бы иметь примерно одного врага на 500 плиток, так что 5000 * 5000/500, что приводит примерно к 50000enemies, которые невозможно отобразить сразу, поэтому у меня есть объект rectangle, который содержит фактический экран, который может видеть игрок, и если хитбокс «слизи» пересекает прямоугольник, тогда я его рендерю, но проблема в том, что дело в том, что мне все еще приходится перебирать каждую из этих слизей, чтобы увидеть, не находится ли их хитбокс в прямоугольнике экрана после перемещения игрока, есть ли кто-нибудь, у кого когда-либо была подобная проблема? Если да, не могли бы вы рассказать мне о своем решении?

Комментарии:

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

2. Интересная проблема. Мне никогда не приходилось решать эту проблему, но моя первоначальная мысль совпадает с мыслью других постеров: ограничьте область вашего интереса тем, что ближе всего к видимой зоне. Кроме того, вы, вероятно, могли бы вычислять пересечения параллельно, поскольку пересечение одной зоны слизи в значительной степени не зависит от того, пересекается ли другая. (Например, если вы реализуете stream api, вы могли бы использовать stream().parallel().filter(Code or method that results in True if enemy does intersect and False otherwise) .) Это, вероятно, улучшило бы скорость обработки.

Ответ №1:

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

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

Общая идея заключается в том, чтобы проверять присутствие врага только в области тайлов, близких к игроку. Такая структура, как Map<TilesZone, List<Enemy>> может иметь смысл или, возможно, TreeMap<TilesZone, List<Enemy>> извлекать выгоду из NavigableMap интерфейса, который может быть полезен в вашем случае использования.