Нужно создать массив помидоров для размещения на экране, как показано в листинге 11.25.
Листинг 11.25
///
/// Расстояние между помидорами.
/// Устанавливаем один раз для игры
///
private int tomatoSpacing = 4;
///
/// Высота, на которой рисуется помидор
/// Высота может меняться в процессе игры
/// Начинаем с верхней части экрана
///
private int tomatoDrawHeight = 4;
///
/// Количество помидоров на экране.
/// Устанавливается при старте игры
/// методом initialiseTomatoes.
///
private int noOfTomatoes;
///
/// Позиции всех помидоров на экране
///
private tomato[] tomatoes;
При усложнении игры помидоры должны отображаться все ниже и ниже, заставляя пользователя действовать интуитивно. Переменная tomatoDrawHeightбудет отвечать за эту задачу. Для инициализации местоположения помидоров нужно создать функцию initialiseTomatos, которая использует размеры помидоров и экрана. Ее код приведен в листинге 11.26.
Листинг 11.26
///
/// Вызывается один раз для установки всех помидоров
///
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
///
/// Вызывается для создания ряда помидоров.
///
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. Внешний вид игры
К сожалению, в данный момент при столкновении сыра с помидорами ничего не происходит. Ситуацию надо исправить при помощи кода, добавленного в метод updatePosition, который приведен в листинге 11.30.
Листинг 11.30
// Уничтожаем помидоры при столкновении с сыром
for (int i = 0; i < tomatoes.Length; i++) {
if (!tomatoes[i].visible) {
continue;
}
if (cheeseRectangle.IntersectsWith(tomatoes[i].rectangle)) {
// прячем томат
tomatoes[i].visible = false;
// отражаемся вниз
goingDown = true;
// только удаляем помидор
break;
}
}
Код выполняется, когда сыр двигается вверх. При этом проверяются позиции каждого помидора и куска сыра при помощи метода IntersectsWith. Если произошло столкновение сыра с томатом, то томат делается невидимым, для чего свойству Visiblеприсваивается значение False. При следующей перерисовке экрана этот томат не появится на экране. Сыр должен отскакивать от помидора, как от стенок или от батона.
Читать дальше