Обнаружение столкновений спрайтов
В предыдущей главе вы познакомились с теорией определения столкновений спрайтов, а также различными методами обнаружения. Если вы помните, обсуждались три подхода:
► обнаружение столкновений с помощью ограничивающих прямоугольников;
► обнаружение столкновений с помощью уменьшенных ограничивающих прямоугольников;
► обнаружение столкновений с использованием данных изображений.
Эти три метода обнаружения столкновений были представлены в порядке повышения точности, а также увеличения требуемой мощности процессора. Иначе говоря, обнаружение столкновений с помощью прямоугольников не такое точное, как если бы использовались данные изображений, но в первом случае нагрузка на процессор существенно меньше, чем во втором. Исходя из этого, вы должны решить, когда и какой метод обнаружения использовать.
Чтобы использовать MIDP API для обнаружения столкновений, вы должны применять методы класса Sprite(), которые называются collidesWith(). Каждый из этих методов отличается в зависимости от типа проверяемого объекта. Например, метод collidesWith() проверяет столкновение двух спрайтов:
CollidesWith(Sprite s, boolean pixelLevel)
Чтобы проверить столкновение, вызовите этот метод для спрайта и передайте в него другой спрайт. Второй параметр определяет, будет ли детектироваться столкновение на уровне пикселей, что соответствует методу детектирования столкновений с помощью данных изображения. Приведенный ниже фрагмент кода показывает, как можно обнаружить столкновение спрайта космического корабля с астероидом, используя данные изображений спрайтов:
shipSprite.collidesWith(roidSprite, true);
Если вы хотите использовать метод ограничивающих прямоугольников, то необходимо изменить код:
shipSprite.collidesWith(roidSprite, false);
Существует метод уменьшенных ограничивающих прямоугольников, который идентичен обычному методу ограничивающих прямоугольников. Чтобы изменить размер ограничивающего прямоугольника, вызовите метод defineCollisionRectangle() и введите новый размер. Например, если размер астероида составляет 42 35 пикселей, то, вероятно, вы захотите использовать меньший ограничивающий прямоугольник размером 32 25 пикселей. Ниже приведен код, выполняющий эту задачу:
alienSprite.defineCollisionRectangle(5, 5, 32, 35);
В этом примере прямоугольник, используемый для обнаружения столкновений, уменьшен с каждой стороны на 5 пикселей, поэтому он остается центрированным по отношению к спрайту. На рис. 6.1 показано изображение астероида с уменьшенным ограничивающим прямоугольником.
Рис. 6.1. Уменьшенный прямоугольник используется для ограничения изображения астероида при обнаружении столкновения
Интересно, что метод defineRectangleCollision() сказывается не только при использовании метода ограничивающих прямоугольников, но и при детектировании столкновения с применением данных изображения. Ранее я упомянул, что существует три различных метода collidesWith(), определенных в классе Sprite, один из них вы уже видели. Ниже приведены остальные два метода:
collidesWith(Image image, int x, int y, boolean pixelLevel) collidesWith(TiledLayer t, boolean pixelLeve)
Они проверяют столкновение спрайта с изображением и замощенным слоем соответственно. В этом случае вы должны указать координаты изображения XY. Слои похожи на спрайты, но используют несколько изображений, составляющих композицию. Вы можете создать лабиринт, используя замощенные слои, а затем проверить столкновение героя со стеной и ограничить перемещение. Подробнее о том, как сделать это, вы узнаете в главе 11.
Работа с анимационными спрайтами
Другая интересная возможность класса Sprite – это поддержка фреймовой анимации. Из предыдущей главы вы знаете, что фреймовая анимация создается путем показа последовательности изображений. В случае спрайта фреймовая анимация используется для изменения его внешнего вида, таким образом, спрайт может изменять не только свое положение на экране, но и внешний вид. Хороший пример анимационного спрайта – это астероид, летящий в космосе. Эффект движения достигается перемещением спрайта с течением времени, а эффект вращения – фреймовой анимацией спрайта.
Чтобы задать фреймы спрайта, расположите их внутри одного изображения в хронологическом порядке. На рис. 6.2 показан спрайт астероида, его изображение состоит из 14 фреймов, имитирующих вращение.
Рис. 6.2. Несколько фреймов спрайта помогают создать иллюзию вращения астероида
Вероятно, сложно представить, что это изображение может помочь имитировать движение, но именно этот эффект достигается при быстрой смене фреймов. Вы можете создать анимационный спрайт, передав конструктору спрайта изображение, а также его размер. Фреймы изображения должны иметь одинаковый размер. Ниже приведен код создания анимационного спрайта, изображение которого показано на рис. 6.2:
Читать дальше
Конец ознакомительного отрывка
Купить книгу