Как справиться с наведением мыши на объект [Allegro5 / C ++] - PullRequest
0 голосов
/ 07 марта 2019

Я хочу иметь возможность регистрировать / отменять регистрацию объектов в списке и проверять, находится ли мышь над ними для отображения подсказок. Однако я спотыкаюсь в начале.

Я собираюсь использовать: al_get_pixel & al_unmap_rgba, чтобы получить альфа каждого пикселя и решить, достаточно ли он видим, чтобы считаться попаданием при наведении на него мышью.

Основная проблема, с которой я сталкиваюсь, заключается в том, чтобы решить, как лучше всего сохранить эту отдельную "карту попаданий" и ссылку на объект, который ее сгенерировал; Так как много разных типов объектов (в виде структур) разных размеров могут нуждаться в создании хит-карт. Я надеялся, что смогу сделать что-то похожее на проверку, расширяет ли сложный объект базовый объект, но я не понимаю, как мне этого добиться в c ++.

Ps; Я знаю, что мог бы создать массив размером экрана для каждого объекта, но я делаю это главным образом с целью максимизации эффективности. Я бы сделал массивы динамического размера, но ...

1 Ответ

0 голосов
/ 24 марта 2019

al_get_pixel будет работать, но это будет ужасно медленно, даже если вы заблокируете все свои растровые изображения, если вы не используете что-то вроде буфера выбора.Основная идея состоит в том, чтобы визуализировать каждую интерактивную область на каждом объекте с другим идентификатором цвета.Это означает, что вам нужно нарисовать вашу сцену дважды, один раз в обычном режиме и один раз, выбирая цвета.Затем, когда вам нужно прочитать положение мыши, вы можете использовать буфер выбора, чтобы прочитать один пиксель и получить его цветовой идентификатор.

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

Существует третий вариант - столкновение с идеальным пикселем.Это включает создание масок 1bpp из всех ваших объектов и затем проверку на столкновение между ними.

...