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

Регистрация сообщений об ошибках

Отладка игрового кода может быть очень сложной, особенно если вы не получаете никаких исключений, но что-то в вашем цикле визуализации идет не так. Простой установки нескольких точек останова может быть недостаточно, и, особенно если ошибка возникает после какого-то времени работы игры, отладка — не лучший вариант. Вы хотите знать, что происходит в каждом кадре, но не хотите пошагово проходить через 500 кадров, чтобы выяснить это. Для решения подобных проблем можно выводить какой-нибудь текст в окно консоли, но это работает только внутри Visual Studio и при очередном запуске проекта вы теряете все содержимое консоли.

Один из наиболее важных классов, во всех сделанных мною больших проектах, это класс Log, который просто записывает информацию, предупреждения, ошибки или отладочные тексты в простой текстовый файл. Сам по себе класс очень короткий и простой, но его правильное использование делает отладку и тестирование приятнее. Существуют более профессиональные классы и модули журнализации, такие как Log4Net, который находится на http://logging.apache.org/log4net/. Журнализация может включать в себя больше, чем простое записывание нескольких строк в текстовый файл. Данные журнала из вашего приложения могут использоваться для удаленного обнаружения ошибок пользователя через Web-сервис, вы можете формировать события ошибок Windows и делать множество других вещей. Все это не рассматривается в книге, поскольку является очень сложной темой. Для простых игр из этой книги вполне достаточно использовать класс Log.

Взгляните на класс Log (его более сложная версия находится в игре Breakout):

public class Log
{
  #region Переменные
  private static StreamWriter writer = null;
  private const string LogFilename = "Log.txt";
  #endregion

Класс Log использует файл Log.txt для сохранения всех сообщений журнала с помощью объекта StreamWriter, хранящегося как статический объект для более простого доступа из ваших статических методов. При первом вызове этого класса создается его экземпляр через статический конструктор:

#region Статический конструктор для создания файла журнала
static Log()
{
  // Открытие файла
  FileStream file = new FileStream(
       LogFilename, FileMode.OpenOrCreate,
       FileAccess.Write, FileShare.ReadWrite);
  writer = new StreamWriter(file);
  // Переход к концу файла
  writer.BaseStream.Seek(0, SeekOrigin.End);
  // Разрешен автоматический сброс на диск
  // (всегда будет обновлен при чтении!)
  writer.AutoFlush = true;

  // Добавляем информацию о сессии
  writer.WriteLine("/// Сессия запущена в: "+
    StringHelper.WriteIsoDateAndTime(DateTime.Now));
} // Log()
#endregion

FileShare.ReadWrite гарантирует, что вы всегда сможете извне читать из файла и записывать в него во время работы игры. Потом позиция записи устанавливается на конец файла, разрешается автоматический сброс на диск, гарантирующий, что записываемые новые данные немедленно будут сохранены в файл журнала, и, в конце, вы добавляете небольшой текст, сообщающий о запуске сессии. Для временной метки вы используете вспомогательный метод из класса StringHelper, который мы изучим чуть позже.

И, наконец, вот наиболее важный метод, единственный, который вы будете вызывать в этом классе:

#region Запись элемента журнала
static public void Write(string message)
{
  DateTime ct = DateTime.Now;
  string s = "[" + ct.Hour.ToString("00") + ":" +
    ct.Minute.ToString("00") + ":" +
    ct.Second.ToString("00") + "] " +
    message;
  writer.WriteLine(s);

#if DEBUG
  // В отладочном режиме выводим сообщение и на консоль!
  System.Console.WriteLine(s);
#endif
} // Write(message)
#endregion

Сперва в начало сообщения добавляется простая временная метка. Затем сообщение записывается в файл Log.txt и, если проект в отладочном режиме, сообщение также выводится на консоль. Теперь вы можете добавлять новую строку к файлу Log.txt, всякий раз, когда игрок завершает очередной уровень игры Breakout, добавив следующую строку:

Log.Write("Уровень " + level + " завершен.");

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

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