Печать на экран в графическом интерфейсе

Я очень новичок в программировании, особенно в создании графических интерфейсов; Раньше я писал консольные программы только на C#, а теперь пытаюсь создать игру с помощью XNA. Может ли кто-нибудь помочь мне, сообщив мне, как печатать на экране в графическом интерфейсе? В настоящее время я пробую варианты System.Console.WriteLine("");, но не печатаю на экран. Код, который я использую, приведен ниже. Может ли кто-нибудь сказать мне, где я ошибаюсь?

ResourceCounter.cs:

      public ResourceCounter(Vector2 pos, GameTime gameTime)`
       {
        position = pos;
        over = false;
        clicked = false;
        gameTime = new GameTime();`

        currentTime += (float)gameTime.ElapsedGameTime.TotalSeconds; 
        System.Console.WriteLine("Resources: ", pSourceCount);

        if (currentTime >= countDuration)
        {
            pSourceCount++;
            **System.Console.WriteLine("Resources: ", pSourceCount);**
        }
        if (pSourceCount >= limit)
        {
            pSourceCount = 0;//Reset the counter;

        }


    }

и в моем основном классе GameScreen.cs:

    public override void Update(GameTime gameTime)
    {
        MouseState mState = Mouse.GetState();
        menu.Update(mState, cursor, gameTime);

        if (menu.currentstate == State.campaign)
        {
            campaign.Update(pTower);
            //campaign.Update(eTower);
            **System.Console.WriteLine("Resources: ", pSourceCount);**
        }
        base.Update(gameTime);
    }

person Jon C    schedule 16.11.2012    source источник


Ответы (1)


Используйте метод SpriteBatch.DrawString для рендеринга текста с помощью XNA.

Когда вы печатаете текст с помощью System.Console.WriteLine, он записывается в стандартный поток вывода. Затем данные в этом потоке представляются через консоль. Ваше игровое окно вообще не замечает этого.


Рендеринг текста

Будет справедливо сказать, что все, что вы рисуете в окне игры, состоит из (текстурированных) треугольников. Текст не исключение. Один символ визуализируется с помощью четырехугольника (прямоугольника), который снова состоит из двух треугольников.

Текст XNA! будет нарисован с помощью 4 спрайтов (8 треугольников), по одному спрайту на каждый символ:

текст, отображаемый в режиме заливки и каркаса

Растровый шрифт

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

Это карта спрайтов для шрифта Arial, размер 20, стандартный вес:

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

Например, это может быть определение символа A для карты спрайтов выше:

<char id="65" x="235" y="47" width="12" height="13" xoffset="0" yoffset="3" xadvance="11" page="0" />
  • id — это значение ASCII (A=65)
  • x и y - положение верхнего левого угла
  • width и height - размер прямоугольника
  • xoffset и yoffset это смещение на экране
  • xadvance — расстояние до предыдущего символа
  • page — это индекс растрового изображения, содержащего символ

Вывод

Рендеринг текста для игр не так тривиален, как можно было бы предположить. XNA значительно упрощает процесс с помощью класса SpriteBatch. Краткое изложение необходимых шагов:

  • Преобразование стандартного шрифта в растровый шрифт
  • Загрузите файлы шрифтов в ваше игровое приложение.
  • Создать спрайты для данной строки
  • Отрисовка спрайтов на экране

Пример шрифта был создан с помощью бесплатного генератора растровых шрифтов.

person Lucius    schedule 16.11.2012
comment
Я знал, что это как-то связано со SpriteBatch! Только не смог найти правильное подключение. Да, я знал, что ошибся с Console.WriteLine (подсказка в первой части, Console!), но просто не мог этого разглядеть. Большое спасибо, теперь все работает правильно. Извините за глупый вопрос! - person Jon C; 16.11.2012
comment
Я не думаю, что это глупый вопрос. Рендеринг текста является неотъемлемой частью большинства приложений; сначала удивляет высокая сложность задачи. Ваше замешательство в отношении консоли, на мой взгляд, вполне понятно. - person Lucius; 16.11.2012