Итак приступим. Возьмём для
экспериментов уже существующий проект, или создадим новый. Как создавать
новый проект в XNA я думаю вы знаете. Далее добавим в игру новый
класс. В Visual Studio это удобнее сделать так: щелчок правой кнопкой
мыши на проекте в Solution Explorer и выбрать пункт "Add>Class...".
Дадим ему название. Я назвал MessageStream. Внутри класса создаём
основу для сообщений - коллекцию строковых переменных.
List<string>
stream = new List<string>();
List<int> time = new List<int>();
Коллекция
time содержит в себе переменные определяющие время "горения" на экране
каждой записи.
Кроме этого необходимо снабдить сообщения другими полезными
свойствами. Я добавил следующие:
Color messColor=Color.White;
// Цвет сообщений SpriteFont font; // Шрифт int height = 0; // Размер пробелов между строками int maxTime = 100; // Максимальное время
Объявляем
конструктор класса. В нем нет ничего сложного. Просто получаем от
пользователя данные и сохраняем внутри класса в соответствующие
переменные.
Конструктор:
public MessageStream(int
x,int y, int
messageTime, SpriteFont messageFont, Color messageColor) { Vector2 size; //
используем для рассчета высоты заданного шрифта pos.X = x;
pos.Y = y;
messColor = messageColor; font = messageFont; maxTime = messageTime;
// рассчет
высоты шрифта по букве "А"
size = font.MeasureString("A"); height = (int)size.Y; }
Вот
собственно и все. Теперь определяем члены класса. Добавим функцию для
собственно добавления сообщений в готовый класс.
public void Add(string
message) {
stream.Insert(0,message); // вставляем сообщение в
коллекцию в позиции 0 (начало)
time.Insert(0, maxTime); // добавляем
счетчик времени для него в коллекцию time
}
Функция обновления потока сообщений. Необходимо уменьшать время существующих сообщений и удалять "устаревшие":
public void Update() {
int c = 0; // прокручиваем весь список for (c = 0; c < stream.Count; c++) { time[c]--; // время вышло? if (time[c] < 0) { time.Remove(time[c]); stream.Remove(stream[c]); // шаг назад. ведь цикл постоянно увеличивает с, // а после удаления элемента, список сдвигает последующие элементы // и значит появляется новый элемент номер с номером с. c--; } }
} Функция вывода списка на экран:
public void Draw(SpriteBatch spriteBatch) { int c = 0; // Обновление списка будем вызывать перед отрисовкой this.Update(); for (c = 0; c < stream.Count; c++) { messColor.A = Convert.ToByte((float)time[c]*1.6f); // постепенное затухание spriteBatch.DrawString( font, stream[c], new Vector2(pos.X, pos.Y-c *(height)), messColor); } }
Вот и все! Сохраняем проект и радуемся жизни! Для того чтобы пользоваться готовым классом, необходимо сначала создать его экземпляр. Нужен один поток сообщений - объявляйте один экземпляр, два потока - два экземпляра, и т.д.
MessageStream messStream; Далее, после загрузки подходящего шрифта (в моем случае - hudFont), инициализируем созданный экземпляр, например, в блоке LoadContent:
messStream = new MessageStream(20,500,100,hudFont,Color.Orange); Теперь, если понадобиться вывести сообщение на экран, в коде игры пишем:
messStream.Add("В бой вступает Syntax!"); Этот класс можно трансформировать, добавить удобные команды и свойства.
Если что-то не ясно - спрашивайте. Я могу дополнить или изменить урок.
|