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.

Листинг 11.23

/// <summary>

/// Изображение, содержащее помидор

/// </summary>

private Image tomatoImage = null;

// Получаем изображение помидора

tomatoImage = new System.Drawing.Bitmap(

 execAssem.GetManifestResourceStream(@'Bouncer.tomato.gif'));

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

Для отслеживания попаданий нужно знать позицию каждого помидора и определять момент столкновения. Можно было создать массив, содержащий координаты каждого помидора, но лучше воспользоваться структурой, приведенной в листинге 11.24.

Листинг 11.24

/// <summary>

/// Позиция и состояние помидора

/// </summary>

struct tomato {

 public Rectangle rectangle;

 public bool visible;

}

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

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

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

 // создаем массив, содержащий позиции помидоров

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

0

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

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