/// <summary>

/// Позиция и ограничивающий прямоугольник для батона хлеба

/// </summary>

private Rectangle breadRectangle;

Сразу после загрузки изображений надо ввести код, приведенный в листинге 11.18.

Листинг 11.18

// Получим координаты и ограничивающие прямоугольники

cheeseRectangle = new Rectangle(0, 0, cheeseImage.Width.cheeseImage.Height);

breadRectangle = new Rectangle(0, 0, breadImage.Width, breadImage.Height);

Теперь для вывода картинок на экран надо использовать в методе Form1_Paint код, приведенный в листинге 11.19.

Листинг 11.19

g.DrawImage(breadImage, breadRectangle.X, breadRectangle.Y);

g.DrawImage(cheeseImage, cheeseRectangle.X, cheeseRectangle.Y);

При помощи свойств X и Y этих прямоугольников можно перемещать объекты по экрану. В методе updatePosition надо заменить часть кода, отвечающую за движение сыра и батона, с учетом созданных переменных, как показано в листинге 11.20.

Листинг 11.20

private void updatePositions() {

 // Движение кусочка сыра

 if (goingRight) {

  cheeseRectangle.X += xSpeed;

 } else {

  cheeseRectangle.X -= xSpeed;

 }

 if ((cheeseRectangle.X + cheeseImage.Width) >= this.Width) {

  goingRight = false;

 }

 if (cheeseRectangle.X <= 0) {

  goingRight = true;

 }

 if (goingDown) {

  cheeseRectangle.Y += ySpeed;

 } else {

  cheeseRectangle.Y -= ySpeed;

 }

 if ((cheeseRectangle.Y + cheeseImage.Height) >= this.Height) {

  goingDown = false;

 }

 if (cheeseRectangle.Y <= 0) {

  goingDown = true;

 }

 // Управление батоном

 if (keyArgs != null) {

  switch (keyArgs.KeyCode) {

  case Keys.Up:

   breadRectangle.Y -= ySpeed;

   break;

  case Keys.Down:

   breadRectangle.Y += ySpeed;

   break;

  case Keys.Left:

   breadRectangle.X -= xSpeed;

   break;

  case Keys.Right:

   breadRectangle.X += xSpeed;

   break;

  }

 }

 /// и далее...

Когда сыр ударяется о батон хлеба, он должен отскочить. Этого эффекта можно добиться, просто изменив направления движения по оси Y в методе updatePosition, как показано в листинге 11.21.

Листинг 11.21

// Проверка на столкновение

if (cheeseRectangle.IntersectsWith(breadRectangle)) {

 goingDown = !goingDown;

}

Метод IntersectsWith принимает параметры прямоугольников. Если они пересекаются, то возвращается значение True, после чего меняется направление движения сыра.

Запустите программу и попытайтесь отбить батоном движущийся кусочек сыра. Вы увидите, как сыр отскочит после столкновения.

Столкновения батона и мяча

Хотя код вполне нормально работает, все-таки хочется больше реализма. Отвлечемся на минутку и рассмотрим пример столкновений мячей с круглым предметом (рис. 11.5).

Рис. 11.5. Столкновение круглых объектов

Когда мяч ударяется о круглый объект, он отскакивает обратно, как показано на рисунке. Программа должна уметь определять вид столкновения для каждого мяча. По схожему принципу должна работать и наша программа.

На рис. 11.6 показаны использующиеся три вида столкновений. Первое столкновение происходит при наезде правой нижней части сыра на прямоугольник батона. Во втором случае оба нижних угла изображения сыра одновременно пересекаются с прямоугольником батона. И третий случай реализуется, когда изображение сыра левой частью попадает на блокирующий прямоугольник.

Рис. 11.6. Виды столкновений

Нужно снова переписать код метода updatePosition для новой реализации модели столкновений, как показано в листинге 11.22.

Листинг 11.22

if (goingDown) {

 // если сыр движется вниз

 if (cheeseRectangle.IntersectsWith(breadRectangle)) {

  // столкновение

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату