netlib.narod.ru< Назад | Оглавление | Далее >

Другие помощники

Пространство имен Helper содержит еще вспомогательные классы; большинство из них простые, подобно классу RandomHelper. Проходить их все не слишком захватывающее занятие, так что, пожалуйста, рассмотрите те из них, которые не упоминаются в этой главе самостоятельно, и протестируйте их с помощью включенных тестов модулей, если хотите узнать о них больше.

Перед тем, как перейти в конце главы к игре Breakout, давайте быстро взглянем на некоторые из оставшихся вспомогательных классов, которые наиболее часто будут использоваться в последующих главах: SpriteHelper, EnumHelper и ColorHelper.

Класс SpriteHelper

Вы использовали визуализацию нескольких спрайтов в предыдущей главе и из-за теста модуля были вынуждены написать простой способ обработки спрайтов в XNA. Такой подход и тот факт, что полезный код, который используется несколько раз рекомендуется помещать в повторно используемые классы, приводит нас к классу SpriteHelper (рис. 3.10). По сути он предоставляет конструктор для создания нового объекта SpriteHelper, хранящего текстуры и графические данные прямоугольников, и несколько методов Render для простого рисования спрайтов на экране, подобного тому, которое вы делали в предыдущей главе со списком экземпляров SpriteToRender.


Рис. 3.10

Рис. 3.10


Большинство методов делают не слишком много; конструктор просто устанавливает значения, Render только добавляет новый экземпляр SpriteToRender к списку спрайтов, RenderCentered визуализирует отцентрованный спрайт в заданной позиции, а DrawSprites выполняет итоговое рисование всех спрайтов на экране. Взгляните на метод DrawSprites, который похож на метод DrawSprites из предыдущей главы с некоторыми усовершенствованиями:

public static void DrawSprites(int width, int height)
{
  // Визуализация не нужна, если в текущем кадре нет спрайтов
  if (sprites.Count == 0)
    return;

  // Создаем пакет спрайтов, если его еще нет.
  // Для создания пакета спрайтов используем устройство из текстуры.
  if (spriteBatch == null)
    spriteBatch = new SpriteBatch(sprites[0].texture.GraphicsDevice);

  // Начинаем визуализацию спрайтов
  spriteBatch.Begin(SpriteBlendMode.AlphaBlend,
    SpriteSortMode.BackToFront, SaveStateMode.None);

  // Визуализируем все спрайты
  foreach (SpriteToRender sprite in sprites)
    spriteBatch.Draw(sprite.texture,
      // Масштабируем в соответствии с разрешением
      new Rectangle(
          sprite.rect.X * width / 1024,
          sprite.rect.Y * height / 768,
          sprite.rect.Width * width / 1024,
          sprite.rect.Height * height / 768),
          sprite.sourceRect, sprite.color);
      // Закончили, рисуем все на экране
      spriteBatch.End();

      // Убиваем список запомненных спрайтов 
      sprites.Clear();
    } // DrawSprites(width, height)

При вызове методу передается текущая ширина и высота окна визуализации для масштабирования всех спрайтов в соответствии с разрешением, что очень важно для поддержки всех экранных разрешений Xbox 360. В методе DrawSprites вы сперва проверяете, есть ли что визуализировать. Затем вы убеждаетесь, что создан статический пакет спрайтов, который будет использоваться для всех рисуемых здесь спрайтов. После открытия пакета спрайтов вы перебираете все спрайты текущего кадра, масштабируя их прямоугольники в соответствии с размерами экрана, после чего разрешаете нарисовать все на экране, вызвав End. Список спрайтов убивается для обновления в следующем кадре. Пример работы этого класса вы увидите в игре Breakout в конце этой главы.

Класс EnumHelper

Класс EnumHelper (рис. 3.11) полезен, когда вы хотите перебрать элементы какого-нибудь перечисления или быстро получить количество содержащихся в перечислении значений. В играх Pong и Breakout вы не используете перечисления, но в следующей главе класс Enum будет полезен, когда вы будете перебирать типы блоков в разрабатываемой игре. Обратите внимание, что класс EnumHelper использует некоторые методы класса Enum, не реализованного в .NET Compact Framework. Чтобы избежать ошибок компиляции класс обычно целиком исключается из проектов Xbox 360, но вы можете продолжать использовать его на платформе Windows, если пожелаете.


Рис. 3.11

Рис. 3.11


Тест модуля TestGetAllEnumNames выглядит как показано ниже и также показывает, как работает GetAllEnumNames. Он перебирает каждое значение перечисления с помощью вспомогательного класса EnumEnumerator, расположенного внутри EnumHelper:

[Test]
public void TestGetAllEnumNames()
{
  Assert.AreEqual(
    "Missions, Highscore, Credits, Help, Options, Exit, Back",
    EnumHelper.GetAllEnumNames(typeof(MenuButton)));
} // TestGetAllEnumNames()

GetAllEnumNames просто использует вспомогательный метод WriteArrayData из класса StringHelper, о котором мы только что говорили:

public static string GetAllEnumNames(Type type)
{
  return StringHelper.WriteArrayData(GetEnumerator(type));
} // GetAllEnumNames(type)

Класс ColorHelper

Изначально класс ColorHelper (рис. 3.12) был длиннее и имел много методов, но поскольку новый класс Color в XNA намного мощнее, чем класс Color из пространства имен System.Drawings, используемый в DirectX для управляемого кода, многие методы оказались ненужными. Тем не менее, он все еще содержит несколько полезных методов, которые вы можете применять для манипуляций с цветами.


Рис. 3.12

Рис. 3.12


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

/// <summary>
/// Пустой цвет, применяется для отметки неиспользуемых
/// цветовых значений
/// </summary>
public static readonly Color Empty = new Color(0, 0, 0, 0);

netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz