Размещение помидоров
Размещение помидоров
Нужно создать массив помидоров для размещения на экране, как показано в листинге 11.25.
Листинг 11.25
/// <summary>
/// Расстояние между помидорами.
/// Устанавливаем один раз для игры
/// </summary>
private int tomatoSpacing = 4;
/// <summary>
/// Высота, на которой рисуется помидор
/// Высота может меняться в процессе игры
/// Начинаем с верхней части экрана
/// </summary>
private int tomatoDrawHeight = 4;
/// <summary>
/// Количество помидоров на экране.
/// Устанавливается при старте игры
/// методом initialiseTomatoes.
/// </summary>
private int noOfTomatoes;
/// <summary>
/// Позиции всех помидоров на экране
/// </summary>
private tomato[] tomatoes;
При усложнении игры помидоры должны отображаться все ниже и ниже, заставляя пользователя действовать интуитивно. Переменная tomatoDrawHeight будет отвечать за эту задачу. Для инициализации местоположения помидоров нужно создать функцию initialiseTomatos, которая использует размеры помидоров и экрана. Ее код приведен в листинге 11.26.
Листинг 11.26
/// <summary>
/// Вызывается один раз для установки всех помидоров
/// </summary>
private void initialiseTomatoes() {
noOfTomatoes =
(this.ClientSize.Width - tomatoSpacing) /
(tomatoImage.Width + tomatoSpacing);
// создаем массив, содержащий позиции помидоров
tomatoes = new tomato[noOfTomatoes];
// Координата x каждого помидора
int tomatoX = tomatoSpacing / 2;
for (int i = 0; i < tomatoes.Length; i++) {
tomatoes[i].rectangle =
new Rectangle(tomatoX, tomatoDrawHeight,
tomatoImage.Width, tomatoImage.Height);
tomatoX = tomatoX + tomatoImage.Width + tomatoSpacing;
}
}
Вызов этого метода следует разместить в конструкторе формы. Метод подсчитывает количество помидоров, создает массив структур и задает прямоугольники, определяющие позицию каждого помидора на экране. Теперь их надо разместить на форме в один ряд. Код, отвечающий за эти действия, приведен в листинг 11.27.
Листинг 11.27
/// <summary>
/// Вызывается для создания ряда помидоров.
/// </summary>
private void placeTomatoes() {
for (int i = 0; i < tomatoes.Length; i++) {
tomatoes[i].rectangle.Y = tomatoDrawHeight;
tomatoes[i].visible = true;
}
}
Этот метод вызывается один раз при старте игры, а после этого он запускается после уничтожения очередного ряда томатов. Метод обновляет высоту с новым значением и делает изображения томатов видимыми. Вызов данного метода также размещается в конструкторе формы.
Итак, сейчас позиции всех томатов определены. Нужно вывести их изображения помидоров на экран. Код, приведенный в листинге 11.28, встраивается в обработчик события Form1_Paint.
Листинг 11.28
for (int i = 0; i < tomatoes.Length; i++) {
if (tomatoes[i].visible) {
g.DrawImage(tomatoImage, tomatoes[i].rectangle.X, tomatoes[i].rectangle.Y);
}
}
Каждый раз, когда страница перерисовывается, этот код перерисовывает все видимые томаты. Естественно, для отображения всех томатов используется одно и то же изображение.
Чтобы сделать игру реалистичнее, нужно переместить начальную высоту батона чуть ниже, чтобы игрок мог сразу играть в игру с более подходящей позиции. Этот код приведен в листинге 11.29.
Листинг 11.29
breadRectangle = new Rectanglе(
(this.ClientSize.Width - breadImage.Width) / 2,
this.ClientSize.Height — breadImage.Height,
breadImage.Width, breadImage.Height);
Теперь игра выглядит так, как показано на рис. 11.7
Рис. 11.7. Внешний вид игры