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);
 // создаем массив, содержащий позиции помидоров

 
                