если вы используете полноэкранный режим Xor, вторым шагом является получение изображения экрана, что является дорогостоящим шагом, а следующий шаг - выяснить, какие объекты были вовлечены в столкновение.
Не нужнотест: это будет слишком медленно
Я бы посоветовал вам использовать «классический» тест ограничивающего прямоугольника, а затем тест на внутренних BBOxes объектов, и только после того, как вы выберете локальные пиксели.
По внутреннему ограничивающему прямоугольникуЯ имею в виду прямоугольник, для которого вы обязательно находитесь полностью внутри вашего объекта, красноватая часть в этом примере:
Так что используйте эту смешанную стратегию:
-выполните проверку ограничивающих рамок ваших объектов.
- если между 2 BBoxами возникло столкновение, выполните проверку внутренней ограничивающей рамки: мы уверены, что произойдет столкновение, если внутренние блоки b спрайта перекрываются.
- тогда высохраняйте пиксель-идеальный тест только для действительно проблемных случаев, и вам нужно только нарисовать оба спрайта на временном холсте, размер которого больше, чем у спрайта.Вы сможете выполнять намного быстрее getImageData.На этом шаге вы знаете, какие объекты участвуют в столкновении.
Обратите внимание, что вы можете рисовать спрайты со шкалой на меньшем холсте, чтобы быстрее получить getImageData настоимость более низкого разрешения.
Обязательно отключите сглаживание, и я думаю, что уже достаточно холста 8X8 (на самом деле это зависит от средней скорости спрайтов. Если ваши спрайты медленные, увеличьте разрешение).
Таким образом, данные имеют размер 8 X 8 X 4 = 256 байт, и вы можете поддерживать хорошую частоту кадров.
Кроме того, при принятии решения о том, как вы вычисляете внутренний BBox, вы можете разрешить заданному количеству пустых пикселей попасть в этот внутренний BBox, торгуя с точностью для скорости.