Используйте полигоны в качестве интерактивных зон вместо прямоугольников - PullRequest
0 голосов
/ 19 мая 2019

Я создаю 2D-игру, используя библиотеку allegro, и мне нужно создать многоугольные территории на карте, на которые игрок может нажимать, чтобы перемещать свои юниты.

Я вынужден использовать какую-то точку в алгоритме обнаружения многоугольника или есть более простое решение с использованием уже нарисованного многоугольника?

Пока мне удалось нарисовать многоугольник, такой как:

ALLEGRO_VERTEX v[] =
            {
                { .x = 0, .y = 0, .z = 0, .color = al_map_rgb_f(1, 0, 0) },
                { .x = 0, .y = 48, .z = 0, .color = al_map_rgb_f(1, 0, 0) },
                { .x = 32, .y = 64, .z = 0, .color = al_map_rgb_f(1, 0, 0) },
                { .x = 80, .y = 32, .z = 0, .color = al_map_rgb_f(1, 0, 0) },
                { .x = 112, .y = 0, .z = 0, .color = al_map_rgb_f(1, 0, 0) }
            };
al_draw_prim(v, NULL, NULL, 0, 5, ALLEGRO_PRIM_TRIANGLE_FAN);

РЕДАКТИРОВАТЬ: Хорошо, я подумал, что могу определить, находится ли мышь в многоугольнике, используя этот алгоритм , но я чувствую, что это неправильный способ сделать это.Мне все еще нужно вызывать функцию для каждого другого многоугольника, это не правильно.

1 Ответ

1 голос
/ 20 мая 2019

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

Теперь я расскажу, почему это должно быть правильным, а не неправильным.

Если бы сама библиотека реализовала это для вас, это все равно было быограничен базовыми примитивами ОС, которые, в свою очередь, ограничены алгоритмической сложностью задачи, которая равна точка-полигон на полигон.Таким образом, вы можете проецировать все полигоны в вашем приложении, использовать один блок мыши для всего экрана и проверять их по очереди.Это то, что пришлось бы делать API, если бы для этого был API.

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

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

...