Графика для Windows средствами DirectDraw
Шрифт:
Если ограничивающие прямоугольники пересекаются, необходимо продолжить проверку. Мы вызываем функцию SpritesCollidePixel и также передаем ей два указателя на объекты Sprite. Если эта проверка окажется неудачной, SpritesCollide возвращает FALSE; в противном случае она возвращает TRUE, что говорит о столкновении спрайтов.
Перед тем как рассматривать процедуру проверки на уровне пикселей, давайте рассмотрим функцию SpritesCollideRect, в которой проверяется пересечение ограничивающих прямоугольников:
Пересечение ограничивающих прямоугольников проверяется в функции SpritesCollideRect с помощью класса MFC CRect. Сначала для каждого спрайта вызывается функция Sprite::GetRect. Она возвращает объект CRect, определяющий текущее положение и размеры каждого спрайта. Затем третий объект CRect инициализируется оператором пересечения класса CRect (& ), который вычисляет область пересечения двух своих операндов. Если пересечения не существует (два прямоугольника не перекрываются), все четыре поля CRect обнуляются. Этот признак используется для возврата TRUE в случае пересечения прямоугольников, и FALSE — в противном случае.
Функция SpritesCollidePixel работает на уровне пикселей и потому выглядит значительно сложнее, чем ее аналог для ограничивающих прямоугольников. Функция SpritesCollidePixel приведена в листинге 9.1.
Листинг 9.1. Функция SpritesCollidePixel
Функция SpritesCollidePixel состоит из четырех этапов. Она делает следующее:
1. Определяет положения и размеры обоих спрайтов, а также вычисляет область их пересечения.
2. Вычисляет области спрайтов, для которых потребуется проверка на уровне пикселей.
3. Если оба спрайта находятся на одной поверхности — выполняет проверку, для чего сначала блокирует поверхность, а затем просматривает ее память в соответствии с положением обоих спрайтов. Если спрайты находятся на разных поверхностях, функция блокирует обе поверхности и просматривает память каждой из них.
4. Снимает блокировку с обеих поверхностей и возвращает TRUE или FALSE.
На этапе 1 мы инициализируем два объекта CRect функцией Sprite::GetRect. Функция GetRect возвращает прямоугольник CRect, представляющий положение и размеры спрайта. Затем оператор & (оператор пересечения класса CRect) определяет область пересечения двух прямоугольников. Ниже снова приведен соответствующий фрагмент листинга 9.1: