highScore = new HighScore(this);
В этом коде ключевое слово this
является ссылкой на текущий экземпляр основной формы, который должен быть закрыт при открытии формы highScore
и восстановлен при закрытии формы highScore
. Код для отображения формы highScore
приведен в листинге 11.59.
if (scoreValue > highScoreValue) {
timer1.Enabled=false;
// Показываем форму для лучших результатов
highScore.ShowDialog();
timer1.Enabled=true;
}
Если игрок побил текущий лучший результат, то программа останавливается при помощи отключения таймера. Для отображения формы highScore
вызывается метод ShowDialog
. Игра должна сделать паузу, пока игрок вводит свое имя. После этого игра продолжается.
Получение имени игрока
Игрок вводит свое имя в текстовое поле формы highScore
. Чтобы получить доступ к имени пользователя во время игры, необходимо иметь доступ к экземпляру формы HighScore
. В классе HighScore
надо создать свойство, с помощью которого можно получить введенное пользователем имя. Этот код приведен в листинге 11.60.
/// <summary>
/// Имя игрока, введенное в текстовом поле.
/// </summary>
public string PlayerName {
get {
return nameTextBox.Text;
}
}
Свойство Name
извлекает имя из текстового поля nameTextBox
и возвращает его тому, кто вызывал данное свойство. Это свойство используется в программе, как показано в листинге 11.61.
/// <summary>
/// Имя игрока, достигшего лучшего результата.
/// </summary>
private string highScorePlayer = 'Rob';
if (scoreValue > highScoreValue) {
highScoreValue = scoreValue;
timer1.Enabled = false;
highScore.ShowDialog();
timer1.Enabled = true;
highScorePlayer = highScore.PlayerName;
}
Теперь с помощью переменной highScorePlayer
можно выводить имя лучшего игрока во время игры.
Хранение лучших результатов
Теперь игроку может указывать свое имя при достижении хорошего результата. Но нужно как-то сохранять это имя и достигнутый результат. Эту информацию будем хранить в той же папке, где и саму программу. Значит, наша программа должна автоматически определять свое местонахождение в файловой системе, чтобы знать, где хранить эту информацию. За это отвечает код, приведенный в листинге 11.62.
/// <summary>
/// Папка, в которой находится программа.
/// Используется как место для хранения настроек игры.
/// </summary>
private string applicationDirectory;
// Получим имя файла программы из текущей сборки
string appFilePath =
execAssem.GetModules()[0].FullyQualifiedName;
// Выделяем из полного пути имени файла только путь к файлу
applicationDirectory =
System.IO.Path.GetDirectoryName(appFilePath);
// Обязательно должен быть разделитель в конце пути
if (!applicationDirectory.EndsWith(@'')) {
applicationDirectory += @'';
}
С помощью данного кода можно получить ссылку на первый модуль в программной сборке. Затем с помощью свойства FullyQualifiedName
можно получить полный путь к файлу программы. Текущий каталог можно получить с помощью свойства GetDirectoryName
. Также нам нужно быть уверенным, что путь к файлу заканчивается обратным слэшем. Небольшой код с проверкой решит эту проблему. Метод сохранения информации очень прост. Он приведен в листинге 11.63.
/// <summary>
/// Имя файла для хранения лучших результатов.
/// </summary>
private string highScoreFile = 'highscore.bin';
/// <summary>
/// Сохраняем лучший результат в файле.
/// </summary>
public void SaveHighScore() {
System.IO.TextWriter writer = null;
try {
writer = new System.IO.StreamWriter(
applicationDirectory + highScoreFile);
writer.WriteLine(highScorePlayer);