Главная » Разработка для Windows Phone 7 » Текстуры и спрайты Windows Phone 7

0

Я обещал, что навыки по использованию XNA для перемещения текста по экрану будут хорошим подспорьем в искусстве перемещения обычных растровых спрайтов. Это становится очевидным уже при первом ознакомлении с методами Draw, поддерживаемыми SpriteBatch. Методы Draw имеют практически такие же аргументы, что и DrawString, но работают с растровыми изображениями, а не текстом. В данной главе мы рассмотрим техники по перемещению и развороту спрайтов, уделив особое внимание перемещению вдоль кривых.

Разновидности метода Draw

Метод под именем Draw есть и у класса Game, и у класса SpriteBatch. Несмотря на идентичные наименования, эти два метода не связаны генеалогически через иерархию классов. В классе, наследуемом от Game, мы создаем перегрузку метода Draw, чтобы иметь возможность вызывать метод Draw класса SpriteBatch. Для этого последнего метода Draw предлагается семь разных вариантов. Начнем с самого простого:

Draw(Texture2D texture, Vector2 position, Color color)

По сути, первый аргумент, Texture2D – это растровое изображение. Texture2D потенциально несколько более сложен, чем обычное растровое изображение, потому что может включать множество текстур с варьируемым разрешением. (Они представляют одно и то же изображение, но с разным разрешением, благодаря чему изображение может отображаться с разным масштабом.) Объекты Texture2D, которые мы будем обсуждать, это старые добрые растровые изображения. Профессиональные разработчики игровых приложений обычно создают эти растровые изображения в специализированных инструментах, но я буду использовать обычный Paint, потому что он самый легкодоступный. После создания эти растровые изображения должны быть добавлены в содержимое проекта XNA и затем загружаться в приложение так же, как загружается шрифт.

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

Аргумент Color используется несколько иначе, чем в DrawString, потому что сама текстура может содержать данные цвета. В документации этот аргумент называют «модуляцией цветового канала». Он выполняет роль фильтра при просмотре растрового изображения.

Концептуально каждый пиксел растрового изображения включает однобайтное значение красного, однобайтное значение зеленого и однобайтное значение синего (пока что забудем об альфа-канале). Когда Draw выводит на экран растровое изображение, эти значения красного, зеленого и синего цветов умножаются на однобайтные значения красного, зеленого и синего аргумента Color метода Draw, и результаты делятся на 255, чтобы вернуть их в диапазон от 0 до 255. Полученные таким образом значения и применяются для закрашивания пикселов.

Например, предположим, наша текстура включает большой объем сведений о цвете, и требуется, чтобы все эти цвета отображались. Для этого используйте в методе Draw значение Color.White.

Теперь, предположим, требуется отрисовать такую же текстуру, но сделать ее более темной (возможно, в нашем игровом мире наступает вечер). Применим в методе Draw немного серого. Чем темнее серый, тем темнее будет выглядеть текстура. Если использовать Color.Black, текстура будет отображаться как силуэт без цвета.

Предположим, мы имеем абсолютно белую текстуру, но хотим, чтобы на экране она отображалась синей. Используем для этого Color.Blue в методе Draw. Эту же абсолютно белую текстуру можно отображать любым цветом. (Именно это я и делаю в первом примере данной главы.)

Желтая текстура (сочетание красного и зеленого) при использовании в методе Draw значения Color.Green будет отображаться зеленой. Если использовать в методе Draw значение Color.Red, эта текстура будет отображаться красной. Значение Color.Blue сделает ее черной. Аргумент метода может только смягчить или приглушить цвет, с его помощью нельзя получить цвета, которых нет в текстуре.

Рассмотрим второй вариант метода Draw:

Draw(Texture2D texture, Rectangle destination, Color color)

Вместо Vector2 для обозначения местоположения текстуры используется Rectangle, который сочетает в себе точку (верхний левый угол), ширину и высоту. Если ширина и высота Rectangle не совпадают с шириной и высотой текстуры, размеры текстуры будут приведены в соответствие размеру Rectangle. Исходные пропорции не принимаются во внимание.

Если требуется отображать прямоугольный фрагмент текстуры, можно использовать одну из двух несколько расширенных версий метода Draw:

Draw(Texture2D texture, Vector2 position, Rectangle? source, Color color) Draw(Texture2D texture, Rectangle destination, Rectangle? source, Color color)

Третьи аргументы – это допускающие пустое значение объекты Rectangle. Если в качестве этого аргумента задать null, результат будет аналогичен применению одной из первых двух версий Draw. Эти аргументы позволяют задать подмножество пикселов изображения.

В следующих двух версиях метода Draw имеется пять дополнительных аргументов, которые нам знакомы из методов DrawString:

Draw(Texture2D texture, Vector2 position, Rectangle? source, Color color,

float rotation, Vector2 origin, float scale, SpriteEffects effects, float depth)

Draw(Texture2D texture, Vector2 position, Rectangle? source, Color color,

float rotation, Vector2 origin, Vector2 scale, SpriteEffects effects, float depth)

Как и в DrawString, угол rotation задается в радианах и отсчитывается по часовой стрелке. origin – это точка текстуры, которая должна совпадать со значением аргумента position. Задание одного обеспечит float масштабирование текстуры одинаково во всех направлениях, Vector2обеспечит разное масштабирование в вертикальном и горизонтальном направлениях. Использование перечисления SpriteEffects позволяет переворачивать изображение в горизонтальном или вертикальном направлении, получая его зеркальное отображение. С последним аргументом мы получаем возможность переопределять настройки по умолчанию для компоновки множества текстур на экране.

Наконец, имеется немного сокращенная развернутая версия этого метода, где вторым аргументом является целевой прямоугольник:

spriteBatch.Draw(Texture2D texture, Rectangle destination, Rectangle? source, Color color,

float rotation, Vector2 origin, SpriteEffects effects, float depth)

Обратите внимание, что в данном случае нет отдельного аргумента для задания масштаба, потому что масштабирование здесь обрабатывается через аргумент destination (место назначения).

В рамках метода Draw класса Game используется объект SpriteBatch следующим образом:

spriteBatch.Begin(); spriteBatch.Draw … spriteBatch.End();

Между вызовами Begin и End может быть любое число вызовов Draw и DrawString. Вызовы Draw могут относиться к одной и той же структуре. Также может выполняться множество вызовов Begin с последующим вызовом End и вызовами Draw и DrawString между ними.

Источник: Чарльз Петзольд, Программируем Windows Phone 7, Microsoft Press, © 2011.

По теме:

  • Комментарии