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

Еще вспомогательные классы

Не наговорились о вспомогательных классах в предыдущей главе? Два новых класса, которые мы собираемся использовать для игры Тетрис не обсуждаются здесь слишком подробно и являются просто сокращенными версиями реальных классов, которые вы будете использовать в этой книге позже. Но они все равно остаются полезными и помогут сделать процесс программирования вашей игры проще.

Класс TextureFont

Вы уже узнали об отсутствии поддержки шрифтов в XNA и о том, что использование растровых шрифтов — это единственный способ отображать тексты в XNA (за исключением, возможно, визуализации какого-нибудь собственного трехмерного шрифта). В первой игре этой книги вы просто использовали спрайты для отображения фиксированного текста в игре или меню. Этот подход очень прост, но для информационного табло вам, очевидно, необходим динамический шрифт, позволяющий писать произвольные тексты и числа, которые могут понадобиться в игре.

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

int level = 3,
    score = 350,
    highscore = 1542,
    lines = 13;

TestGame.Start("TestScoreboard",
  delegate
  {
    // Рисуем фон
    TestGame.game.backgroundSmallBox.Render(new Rectangle(
      (512 + 240) - 15, 40 - 10, 290 - 30, 190));

    // Показываем уровень, счет и т.д.
    TextureFont.WriteText(512 + 240, 50, "Level: ");
    TextureFont.WriteText(512 + 420, 50, (level + 1).ToString());
    TextureFont.WriteText(512 + 240, 90, "Score: ");
    TextureFont.WriteText(512 + 420, 90, score.ToString());
    TextureFont.WriteText(512 + 240, 130, "Lines: ");
    TextureFont.WriteText(512 + 420, 130, lines.ToString());
    TextureFont.WriteText(512 + 240, 170, "Highscore: ");
    TextureFont.WriteText(512 + 420, 170, highscore.ToString());
});

Вы можете заметить, что теперь мы используем класс TestGame для запуска тестов модулей. Для данного теста вы используете несколько переменных (level, score и т.д.), которые в игровом коде будут заменены на реальные значения. В цикле визуализации вы сперва рисуете фон и сразу отображаете его, чтобы избежать ошибок рисования с выводимыми затем спрайтами. Затем вы пишете в указанных позициях экрана четыре строки текста с помощью метода WriteText нового класса TextureFont. В действительности вы вызываете WriteText восемь раз, чтобы выровнять все числа по правому краю вашего фонового прямоугольника, что выглядит красивее, чем простой вывод четырех строк.

После написания этого тестового модуля вы получите ошибку компилятора, сообщающую, что класс TextureFont еще не существует. После создания класса-заглушки с методом-заглушкой WriteText вы сможете скомпилировать и запустить тест. Он будет просто отображать фоновый прямоугольник, расположенный в верхней правой части экрана, с помощью класса SpriteHelper, о котором вы узнали в предыдущей главе.

Перед тем, как начинать думать о реализации класса TextureFont, вам необходима настоящая растровая текстура с шрифтом для визуализации текста на экране. Без текстуры вы сможете проделать только теоретическую работу, а тесты модулей относятся к практическому тестированию игровой функциональности. Вам потребуется текстура, подобная изображенной на рис. 4.3, для отображения всех букв, цифр и знаков. Вы можете разместить больше символов Unicode в текстуре большего размера или использовать для той же цели несколько текстур, но в этой главе мы не будем заходить так далеко. Пожалуйста, посетите сайт, упомянутый в комментариях в начале исходного кода класса TextureFont, чтобы получить дополнительную информацию по этой сложной теме.


Рис. 4.3

Рис. 4.3


Взгляните на реализацию класса TextureFont (рис. 4.4). Обращаться с классом TextureFont очень просто; вы только вызываете метод WriteText, как это делалось в показанном ранее тестовом модуле. Но внутренний код не так прост. Класс хранит прямоугольники для каждой буквы текстуры GameFont.png, которые затем используются во WriteAll для визуализации текста путем рисования каждой буквы по отдельности на экране. Класс также содержит текстуру шрифта, GameFont.png, пакет спрайтов для помощи в визуализации спрайтов фона на экране, и несколько вспомогательных переменных для определения высоты шрифта. Чтобы проверить, какую ширину на экране будет иметь текст, можно воспользоваться методом GetTextWidth.


Рис. 4.4

Рис. 4.4


Внутренний класс FontToRender хранит весь текст, который вы хотите визуализировать в каждом кадре, что очень похоже на процесс использования класса SpriteHelper для визуализации всех спрайтов на экране в конце каждого кадра. Точно также, как SpriteHelper.DrawAll вызывается BaseGame, TextureFont.WriteAll вызывает этот метод для сброса всего и затем очищает все списки. Чтобы больше узнать о классе TextureFont, просмотрите его исходный код и запустите тесты модулей или попробуйте протрассировать метод WriteAll.

Класс Input

Другой новый класс, использующийся в игре Тетрис, это класс Input, инкапсулирующий всю обработку ввода, проверку и обновление, которые в предыдущих главах вы делали самостоятельно. В главе 10 класс Input будет обсуждаться более подробно, как и некоторые другие классы, которые действительно нуждаются во всех возможностях из класса Input (рис. 4.5).


Рис. 4.5

Рис. 4.5


Как видите, в классе Input есть достаточно много свойств и несколько вспомогательных методов для доступа к данным клавиатуры, игрового пульта и мыши. Они обновляются в каждом кадре с помошью статического метода Update, который вызывается непосредственно из класса BaseGame. В рассматриваемой игре вы будете в основном иметь дело с методами обнаружения нажатий клавиш или кнопок игрового пульта, такими как GamePadAJustPressed или KeyboardSpaceJustPressed. Подобно классу RandomHelper, определить как работает этот класс не сложно и вы уже реализовали большую часть его функциональности в предыдущих главах. За дополнительными деталями и примерами использования обращайтесь к главе 10.

Класс Sound

Что же, у вас уже был звук в первой игре в главе 2, и вы также использовали его в главе 3 для игры Breakout. Чтобы упростить вещи и позволить вам в дальнейшем добавлять больше звуковой функциональности не внося изменений в классы игры, управление звуком было перемещено в класс Sound. Взгляните на класс (рис. 4.6). В этой версии он выглядит очень просто, но в главе 9, которая более подробно рассказывает об XACT, вы немного расширите класс Sound, и подготовите его для использования в большой гоночной игре, разрабатываемой в конце этой книги.


Рис. 4.6

Рис. 4.6


Как видите, все звуковые переменные находятся теперь в этом классе, а в классе Game больше не осталось никаких звуковых переменных. Конструктор Sound является статическим, и будет вызываться автоматически, когда вы первый раз воспроизводите звук с помощью метода Play. Метод Update вызывается автоматически из класса BaseGame.

Значения перечисления Sounds и тестовый модуль TestPlayClickSound зависят от реального содержимого вашей текущей игры. Эти значения будут изменяться для каждой игры, которую вы соберетесь писать, но поменять значения перечисления Sounds очень просто. Вы можете спросить, почему бы не воспроизводить звук просто с помощью имени реплики, хранящегося в XACT. дело в том, что может возникать много ошибок из-за простых опечаток в именах звуковых реплик, и очень сложно отслеживать все изменения в случае удаления, переименования или изменения звуковых реплик. Перечисление Sounds также делает очень простым добавление звуковых эффектов и просмотр доступных через IntelliSense.

В игре Тетрис используются следующие звуки:


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

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