Размещение помидоров

Размещение помидоров

Нужно создать массив помидоров для размещения на экране, как показано в листинге 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. Внешний вид игры