Опубликован: 05.08.2010 | Доступ: свободный | Студентов: 2009 / 47 | Оценка: 4.50 / 4.40 | Длительность: 60:26:00
Самостоятельная работа 1:

Компьютерная 2D-графика в Microsoft XNA Game Studio 3.0

Самостоятельная работа 1: 12345678910 || Самостоятельная работа 2 >

Добавление надписей

XNA Game Studio 3.0 имеет встроенную поддержку шрифтов, при этом существуют несколько подходов к выводу текстовых изображений:

  1. Можно воспользоваться стандартными средствами вывода текста одним из шрифтов, установленных в системе. Таким способом удобно выводить на экран большие объемы текстов.
  2. Можно создать нужные надписи в виде изображений и выводить их по очереди как обычные спрайты. Этот подход удобен при создании системы меню и других надписей, которые нет необходимости модифицировать в ходе работы игровой программы. Причем, такие надписи можно анимировать теми же способами, которые используются для анимации спрайтов.
  3. Создать спрайт-алфавит, содержащий киноленту с изображениями букв и, разработав систему вывода нужных участков этого спрайта с необходимыми символами, выводить любые тексты таким способом.

Пока мы воспользуемся способом вывода обычного текста в XNA. Прежде всего нужно создать XML -файл с расширением *.spritefont. Для переносимости лучше поставить такой шрифт, который везде можно найти, например Courier New, Times New Roman, Arial.

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

  • В панели Solution Explorer вызовите контекстное меню для папки Content и командой Add/New Folder добавьте к проекту новую папку с именем Fonts
  • В панели Solution Explorer вызовите контекстное меню для папки Fonts и командой Add/New Item добавьте к проекту XML -файл с именем font1

Свойства шрифта устанавливаются через созданный XML -файл, который состоит из нескольких документированных разделов. Вот каким будет содержимое этого файла для нашего случая

<?xml version="1.0" encoding="utf-8"?>
<!--
This file contains an xml description of a font, and will be read by the XNA
Framework Content Pipeline. Follow the comments to customize the appearance
of the font in your game, and to change the characters which are available to draw
with.
  
Этот файл содержит xml описание шрифта, и будет читаться XNA
Framework Content Pipeline. Следуйте за комментариями, 
чтобы настроить шрифт в вашей игре, и изменить символы, 
которые являются доступными для рисования.
-->
<XnaContent xmlns:Graphics="Microsoft.Xna.Framework.Content.Pipeline.Graphics">
  <Asset Type="Graphics:FontDescription">
  
    <!--
    Modify this string to change the font that will be imported.
  		
    Измените эту строку, чтобы изменить импортируемый шрифт.
    -->
    <FontName>Courier New</FontName>
  
    <!--
    Size is a float value, measured in points. Modify this value to change
    the size of the font.
    		
    Размер является вещественной величиной, выраженной в пунктах. 
    Измените это значение, чтобы изменить размер шрифта.
    -->
    <Size>12</Size>
  
    <!--
    Spacing is a float value, measured in pixels. Modify this value to change
    the amount of spacing in between characters.
		
    Интервал является вещественной величиной, выраженной в пикселах. 
    Измените значение этой величины, чтобы изменить интервал между символами.
    -->
    <Spacing>0</Spacing>
  
    <!--
    UseKerning controls the layout of the font. If this value is true, kerning information
    will be used when placing characters.
    
    UseKerning управляет расположением шрифта. Если это значение true, kerning информация
    будет использоваться при размещении символов.
    -->
    <UseKerning>true</UseKerning>
  
    <!--
    Style controls the style of the font. Valid entries are "Regular", "Bold", "Italic",
    and "Bold, Italic", and are case sensitive.
    		
    Style управляет стилем шрифта. Правильными являются "Regular", "Bold", "Italic",
    "Bold Italic". Все они являются регистрозависимыми.
    -->
    <Style>Italic</Style>
  
    <!--
    If you uncomment this line, the default character will be substituted if you draw
    or measure text that contains characters which were not included in the font.
      
    Если Вы раскомментируйте этот раздел, то будут отображаться символы по умолчанию в том
    случае, если выводимый текст содержит символы, которые не были включены в шрифт.    
    -->
    <!-- <DefaultCharacter>*</DefaultCharacter> -->
  
    <!--
    CharacterRegions control what letters are available in the font. Every
    character from Start to End will be built and made available for drawing. The
    default range is from 32, (ASCII space), to 126, ('~'), covering the basic Latin
    character set. The characters are ordered according to the Unicode standard.
    See the documentation for more information.
		
    CharacterRegions управляют тем, какие символы являются доступными в шрифте. Каждый
    символ от Start до End будет доступным для рисования.
    Диапазон по умолчанию от 32 (символ пробела в ASCII) до 126 (символ тильда '~')
    соответствуют латинскому набору символов. Символы соответствуют стандарту Unicode.
    См. документацию для дополнительной информации.    
    -->
    <CharacterRegions>
      <CharacterRegion>
        <Start>&#32;</Start>
        <End>&#126;</End>
      </CharacterRegion>
    </CharacterRegions>
  </Asset>
</XnaContent>
  • Отредактируйте в XML-файле font1 разделы FontName=Courier New, Size=12 и Style=Italic
  • Подобным образом добавьте в папку Fonts еще один XML -файл с именем font2 и установите в нем параметры FontName=Arial, Size=24 и Style=Bold

Теперь необходимо объявить объекты шрифтов, загрузить в них сами шрифты, определить начальную позицию вывода строки с текстом и нарисовать сам текст.

  • Добавьте в класс StartGame поля для адресации объектов шрифтов
public class StartGame : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;
    Sprite[] sprite = new Sprite[5];
    Sprite platform = new Sprite();
    //Для хранения шрифтов
    SpriteFont font1, font2;

    ...........................................
}
  • Добавьте в метод LoadContent() класса StartGame код загрузки системных шрифтов в объявленные ранее объекты шрифтов
protected override void LoadContent()
{
    spriteBatch = new SpriteBatch(GraphicsDevice);

    // Загрузка рисунков анимированных спрайтов
    for (int i = 0; i < sprite.Length; i++)
    {
        sprite[i].Load(this.Content, "Textures\\" + i.ToString());
    }

    // Загружаем фон
    background1 = this.Content.Load<Texture2D>("Textures\\background1");
    background2 = this.Content.Load<Texture2D>("Textures\\background2");

    // Загрузка рисунка платформы в объект
    platform.Load(this.Content, "Textures\\platform");

    // Загрузка спрайтов шрифтов 
    font1 = this.Content.Load<SpriteFont>("Fonts\\font1");
    font2 = this.Content.Load<SpriteFont>("Fonts\\font2");
}
  • Добавьте в метод Draw() класса StartGame код вывода текста на экран
protected override void Draw(GameTime gameTime)
{
    GraphicsDevice.Clear(Color.CornflowerBlue);

    spriteBatch.Begin(SpriteBlendMode.AlphaBlend);
    spriteBatch.Draw(background1, new Vector2(0, 0), Color.White);
    for (int i = 0; i < sprite.Length; i++)
        sprite[i].DrawAnimationSprite(spriteBatch);
    spriteBatch.Draw(background2, new Vector2(0, 0), Color.White);
    platform.DrawSprite(spriteBatch);// В верхний слой над тросом 
    // Вывод текста
    if (paused)
    {
        spriteBatch.DrawString(font2,
            "Pause",
            new Vector2(350, 100),
            Color.Red);
    }
    int shift = 248;
    for (int i = 0; i < 5; i++)
    {
        spriteBatch.DrawString(font1,
            scores[i].ToString(),
            new Vector2(this.Window.ClientBounds.Width - 95, shift),
            Color.White);
        shift += 35;
    }
    spriteBatch.End();

    base.Draw(gameTime);
}
  • Перекомпилируйте проект командой Rebuild, запустите приложение

Обратите внимание, что если на данном этапе попытаться отобразить кириллицу, то программа зависнет. Настройка программы на вывод русских шрифтов требует небольших дополнительных действий, которые мы сейчас и выполним.

В секции CharacterRegion контейнера CharacterRegions любого из наших XML -файлов *.spritefont имеются параметры <Start> и <End>, которые устанавливают диапазон символов в десятичной системе исчисления. Если добавить в контейнер CharacterRegions еще одну секцию CharacterRegion с диапазоном кириллических символов, то те же самые объекты шрифтов станут выводить и русскоязычные тексты.

Сейчас мы подробно рассмотрим, как установить правильный диапазон кириллических символов для наших шрифтов Courier New (файл font1.spritefont ) и Arial (файл font2.spritefont ).

  • Щелкните левой кнопкой мыши на кнопке Пуск операционной системы компьютера и выберите команду Выполнить
  • Наберите в текстовом поле команды имя файла charmap, чтобы открыть таблицу символов, которую настройте так, как показано на рисунке

Последними символами таблицы будет группа от ' A ' до ' я ' с шестнадцатиричными кодами от 0x0410 до 0x044F.

  • Запустите калькулятор командой Пуск/Программы/Стандартные/Калькулятор в инженерном режиме и переведите границы диапазона из шестнадцатиричной системы исчисления в десятичную

Должно получиться значение диапазона [ 1040, 1103 ]

  • Настройте таблицу символов на шрифт Arial и убедитесь, что для кириллицы граница диапазона будет такой же, что и для шрифта Courier New
  • Добавьте в контейнер CharacterRegions файлов font1.spritefont и font2.spritefont еще по одной секции, чтобы они приняли такой вид (например, для файла font1.spritefont с убранными комментариями )
<?xml version="1.0" encoding="utf-8"?>
<XnaContent xmlns:Graphics="Microsoft.Xna.Framework.Content.Pipeline.Graphics">
  <Asset Type="Graphics:FontDescription">  
    <FontName>Courier New</FontName>  
    <Size>12</Size> 
    <Spacing>0</Spacing>  
    <UseKerning>true</UseKerning> 
    <Style>Italic</Style>  
    <CharacterRegions>
      <CharacterRegion>
        <Start>&#32;</Start>
        <End>&#126;</End>
      </CharacterRegion>
      <CharacterRegion>
        <Start>&#1040;</Start>
        <End>&#1103;</End>
      </CharacterRegion>
    </CharacterRegions>
  </Asset>
</XnaContent>
  • Измените в методе Draw() класса StartGame выводимое на экран слово " Pause " на кириллическое слово " Пауза в игре!"
protected override void Draw(GameTime gameTime)
{
    GraphicsDevice.Clear(Color.CornflowerBlue);

    // Рисуем меню
    if (menuState)
    {
        .......................................
        
    }       
    else    ////////////// else ////////////////
    {
        .......................................
        
        // Вывод текста
        if (paused)
        {
            spriteBatch.DrawString(font2,
                "Пауза в игре!",
                new Vector2(350, 100),
                Color.Red);
        }
        .......................................
        
    }   /////////////////// end else ///////////////////

    base.Draw(gameTime);
}
  • Перекомпилируйте проект командой Rebuild, запустите приложение и убедитесь, что сообщение выводится кириллицей
Самостоятельная работа 1: 12345678910 || Самостоятельная работа 2 >
Алексей Бабушкин
Алексей Бабушкин

При выполнении в лабораторной работе упражнения №1 , а именно при выполнении нижеследующего кода:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using Microsoft.Xna.Framework.Graphics;

   

namespace Application1

{

    public partial class MainForm : Form

    {

        // Объявим поле графического устройства для видимости в методах

        GraphicsDevice device;

   

        public MainForm()

        {

            InitializeComponent();

   

            // Подпишемся на событие Load формы

            this.Load += new EventHandler(MainForm_Load);

   

            // Попишемся на событие FormClosed формы

            this.FormClosed += new FormClosedEventHandler(MainForm_FormClosed);

        }

   

        void MainForm_FormClosed(object sender, FormClosedEventArgs e)

        {

            //  Удаляем (освобождаем) устройство

            device.Dispose();

            // На всякий случай присваиваем ссылке на устройство значение null

            device = null;       

        }

   

        void MainForm_Load(object sender, EventArgs e)

        {

            // Создаем объект представления для настройки графического устройства

            PresentationParameters presentParams = new PresentationParameters();

            // Настраиваем объект представления через его свойства

            presentParams.IsFullScreen = false; // Включаем оконный режим

            presentParams.BackBufferCount = 1;  // Включаем задний буфер

                                                // для двойной буферизации

            // Переключение переднего и заднего буферов

            // должно осуществляться с максимальной эффективностью

            presentParams.SwapEffect = SwapEffect.Discard;

            // Устанавливаем размеры заднего буфера по клиентской области окна формы

            presentParams.BackBufferWidth = this.ClientSize.Width;

            presentParams.BackBufferHeight = this.ClientSize.Height;

   

            // Создадим графическое устройство с заданными настройками

            device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, DeviceType.Hardware,

                this.Handle, presentParams);

        }

   

        protected override void OnPaint(PaintEventArgs e)

        {

            device.Clear(Microsoft.Xna.Framework.Graphics.Color.CornflowerBlue);

   

            base.OnPaint(e);

        }

    }

}

Выбрасывается исключение:

Невозможно загрузить файл или сборку "Microsoft.Xna.Framework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d" или один из зависимых от них компонентов. Не удается найти указанный файл.

Делаю все пунктуально. В чем может быть проблема?