Книга: Программирование КПК и смартфонов на .NET Compact Framework
Дальнейшие улучшения
Разделы на этой странице:
Дальнейшие улучшения
Но игру все еще можно улучшить. В следующем списке указаны дополнительные возможности, которые необходимо реализовать.
? Режим «attract», включающийся, когда пользователь не играет.
? Потеря жизни, если сыр ударился о нижнюю границу экрана.
? При уничтожении всех томатов они должны появиться чуть ниже, и скорость игры должна возрасти.
? Добавление в игру случайных элементов.
В программу надо ввести булеву переменную gameLive
, которая имеет значение True
, когда пользователь ведет игру. Если значение переменной равно False
, то сыр будет двигаться по экрану, но никаких игровых действий производиться не будет.
Для этого потребуется изменить метод, выполняющийся при старте игры. Новая версия приведена в листинге 11.44.
Листинг 11.44
/// <summary>
/// True, если игра запущена на экране.
/// </summary>
private bool gameLive = false;
/// <summary>
/// Число оставшихся жизней.
/// </summary>
private int livesLeft;
/// <summary>
/// Число жизней, доступных для игрока.
/// </summary>
private int startLives = 3;
private void startGame() {
// Устанавливаем число жизней, счет и сообщения
livesLeft = startLives;
scoreValue = 0;
messageString = "Счет: 0 Жизнь: " + livesLeft;
// Располагаем помидоры наверху экрана
tomatoDrawHeight = tomatoLevelStartHeight;
placeTomatoes();
// Поместим батон в центре экрана
breadRectangle.X = (this.ClientSize.Width - breadRectangle.Width) / 2;
breadRectangle.Y = this.ClientSize.Height / 2;
// Поместим сыр над батоном в центре экрана
cheeseRectangle.X = (this.ClientSize.Width - cheeseRectanglе.Width) / 2;
cheeseRectangle.Y = breadRectangle.Y — cheeseRectangle.Height;
// Установим начальную скорость
xSpeed = 1;
ySpeed = 1;
// Установим флаг, позволяющий начать игру
gameLive = true;
}
Этот код возвращает все объекты на исходные позиции и начинает новую игру. Батон располагается в середине экрана, а сыр чуть выше него. Этот метод связан с пунктом меню, позволяющим начать игру.
Теперь надо добавить код, который проверяет, не коснулся ли сыр нижней границы экрана. В этом случае вызывается метод loseLife
, который уменьшает количество жизней у игрока.
Соответствующий код приведен в листинге 11.45.
Листинг 11.45
if ((cheeseRectangle.Y + cheeseImage.Height) >= this.Height) {
// сыр достиг нижней границы экрана
loseLife();
goingDown = false;
}
Метод loseLife
подсчитывает количество оставшихся жизней и заканчивает игру, если все жизни были израсходованы. Также метод может показывать лучший достигнутый счет игры. Его код приведен в листинге 11.46.
Листинг 11.46
private void loseLife() {
if (!gameLive) {
return;
}
// Потеряли еще одну жизнь
livesLeft--;
if (livesLeft > 0) {
// обновим сообщение на экране
messageString = "Счет: " + scoreValue + " Жизнь: " + livesLeft;
} else {
// Останавливаем игру
gameLive = false;
// сравниваем с лучшим результатом
if (scoreValue > highScoreValue) {
highScoreValue = scoreValue;
}
// меняем сообщение на экране
messageString = "Лучший результат: " + highScoreValue;
}
}
Этот код не выполняется, если игра не запущена. При вызове метод уменьшает количество жизней и подсчитывает оставшееся число. Пока есть жизни, игра продолжается. В противном случае обновляется счет и игра выключается.
Последний метод в нашей игре отвечает за перерисовку томатов, когда они все уничтожены. Чтобы отследить эту ситуацию, в метод Form1_Paint
добавлен очень простой код, который приведен в листинге 11.47.
Листинг 11.47
bool gotTomato = false;
for (int i = 0; i < tomatoes.Length; i++) {
if (tomatoes[i].visible) {
gotTomato = true;
g.DrawImage(tomatoImage, tomatoes[i].rectangle.X, tomatoes[i].rectangle.Y);
}
}
if (!gotTomato) {
newLevel();
}
Если пользователь выбил все томаты, то вызывается метод newLevel
. Метод просто перерисовывает томаты и увеличивает скорость, как показано в листинге 11.48.
Листинг 11.48
private void newLevel() {
if (!gameLive) {
return;
}
// Рисуем помидоры чуть ниже
tomatoDrawHeight += tomatoSpacing;
if (tomatoDrawHeight >
(ClientSize.Height - (breadRectangle.Height+tomatoImage.Height))) {
// Рисуем помидоры снова в верхней части экрана
tomatoDrawHeight = tomatoLevelStartHeight;
}
placeTomatoes(); // Увеличиваем скорость
if (xSpeed < maxSpeed) {
xSpeed++;
ySpeed++;
}
}
Метод перемещает томаты все ниже и ниже. Когда они почти достигнут края экрана, то будут снова перемещены в верхнюю часть экрана.
Тестирование
Игра практически готова. Теперь нужно протестировать ее. Чтобы не играть самому несколько часов, надо поручить эту работу компьютеру. Достаточно лишь изменить метод updatePosition
, как показано в листинге 11.49.
Листинг 11.49 Тестирование программы в автоматическом режиме
/// <summary>
/// Тестирование программы. Батон автоматически отслеживает
/// движение сыра
/// </summary>
private bool testingGame = true;
if (testingGame) {
breadRectangle.X = cheeseRectangle.X;
breadRectangle.Y = ClientSize.Height - breadRectangle.Height;
}
Булева переменная testingGame
может принять значение True
. В этом случае позиция батона всегда будет соответствовать позиции сыра. В этом состоянии игра будет действовать сама, без участия пользователя и без потери жизней. Можно откинуться на спинку кресла и отдыхать.
- Начало работы
- Добавление изображения в программу
- Использование встроенных ресурсов
- Вывод картинки на экран
- Создание анимации
- Отражения
- Управление скоростью движения объекта
- Добавляем новый объект
- Устранение мерцания
- Хлеб — всему голова
- Обнаружение столкновений
- Столкновения батона и мяча
- Новые объекты
- Размещение помидоров
- Уничтожение томатов
- Счет игры
- Ведение счета
- Звуковые эффекты
- Дальнейшие улучшения
- И опять добавляем новые объекты
- Управление таблицей результатов
- Переключение между формами
- Отображение дочернего окна
- Получение имени игрока
- Хранение лучших результатов
- Улучшение графики
- Спрайты
- Соединение точек социальных медиа в целях улучшения потребительского опыта
- Глава 8. Гибкий маркетинг Использование свежих данных для пятикратного улучшения результатов
- Шаг 9. Дальнейшие действия
- Что еще можно сделать для улучшения эффективности?
- 8.13.16 Улучшения в OSPF
- Листинг 8.5. Тестовый пример, демонстрирующий уменьшение объема памяти, распределяемой для объектов (типичный образец ул...
- Улучшения
- Листинг 8.5. Тестовый пример, демонстрирующий уменьшение объема памяти, распределяемой для объектов (типичный образец ул...
- Способы улучшения ценового имиджа для ритейлеров, реализующих стратегию высоких
- 3. Подбирайте ключи для улучшения корпоративной культуры
- Шесть этапов улучшения стратегии контент-маркетинга
- Добавление CSS-анимаций для улучшения взаимодействия с формой