bool rightIn =
breadRectangle.Contains(cheeseRectangle.Right, cheeseRectangle.Bottom);
bool leftIn =
breadRectangle.Contains(cheeseRectangle.Left, cheeseRectangle.Bottom);
// способ отражения
if (rightIn & leftIn) {
// отражается вверх
goingDown = false;
} else {
// отражается вверх
goingDown = false;
// в зависимости от вида столкновений
if (rightIn) {
goingRight = false;
}
if (leftIn) {
goingRight = true;
}
}
}
}
Обратите внимание на то, что сыр отскакивает только при движении в нижнюю часть экрана. Используя подобный подход, можно создать игру, в которой пользователь будет стараться не дать сыру упасть на дно экрана, отбивая его батоном.
Новые объекты
Продолжим улучшать игру. Теперь в игру будут введены и помидоры. Их изображения тоже надо ввести в состав проекта, как показано в листинге 11.23.
/// <summary>
/// Изображение, содержащее помидор
/// </summary>
private Image tomatoImage = null;
// Получаем изображение помидора
tomatoImage = new System.Drawing.Bitmap(
execAssem.GetManifestResourceStream(@'Bouncer.tomato.gif'));
Следует нарисовать несколько помидоров в верхней части экрана. Помидоры будут использоваться в качестве мишеней, которые нужно уничтожать, сбивая их кусочком сыра.
Для отслеживания попаданий нужно знать позицию каждого помидора и определять момент столкновения. Можно было создать массив, содержащий координаты каждого помидора, но лучше воспользоваться структурой, приведенной в листинге 11.24.
/// <summary>
/// Позиция и состояние помидора
/// </summary>
struct tomato {
public Rectangle rectangle;
public bool visible;
}
Использование структуры позволит хранить позицию помидора и определять его видимость. При столкновении сыра с помидором овощ должен исчезнуть, позволяя тем самым игроку заработать очки.
Размещение помидоров
Нужно создать массив помидоров для размещения на экране, как показано в листинге 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.
/// <summary>
/// Вызывается один раз для установки всех помидоров
/// </summary>
private void initialiseTomatoes() {
noOfTomatoes =
(this.ClientSize.Width - tomatoSpacing) /
(tomatoImage.Width + tomatoSpacing);
// создаем массив, содержащий позиции помидоров