Справочник Жаркова по проектированию и программированию искусственного интеллекта. Том 7: Программирование на Visual C# искусственного интеллекта. Издание 2. Валерий Алексеевич Жарков
Чтение книги онлайн.

Читать онлайн книгу Справочник Жаркова по проектированию и программированию искусственного интеллекта. Том 7: Программирование на Visual C# искусственного интеллекта. Издание 2 - Валерий Алексеевич Жарков страница 26

СКАЧАТЬ на предыдущем листинге код обнаруживает столкновение только тогда, когда сыр падает на хлеб сверху вниз и соприкасается с верхней плоскостью хлеба. Если же сыр соприкасается с хлебом сбоку (слева или справа), то отскока сыра от хлеба не происходит. Поэтому устраним этот недостаток, чтобы игра была более реалистичной.

      Если мы оперируем с окружностями, описанными вокруг объектов, то возможны три основные схемы столкновений, показанные на рис. 5.4. В схемах 1 и 3 маленький круг ударяется о большой круг под углом 45 градусов и отражается под этим же углом и по этой же линии. В схеме 2 маленький круг ударяется о большой круг под углом 90 градусов и также вертикально отражается вверх.

      Если же мы оперируем с прямоугольниками, описанными вокруг объектов, то возможны четыре основные схемы столкновений, показанные на рис. 5.5.

      Рис. 5.3. Сыр отскочил от хлеба. Рис. 5.4. Три схемы столкновений.

      Рис. 5.5. Четыре схемы столкновений.

      В схемах 1 и 4 маленький прямоугольник ударяется о большой прямоугольник сбоку под углом 45 градусов и отражается под этим же углом и по этой же линии. В схемах 2 и 3 маленький прямоугольник падает на большой прямоугольник под углом 45 градусов, но отражается не по линии падения, а по линии отражения, перпендикулярной линии падения.

      Для реализации более правильных схем столкновений, показанных на рис. 5.5, в нашем проекте вместо приведённого выше метода updatePositions для изменения координат записываем следующий метод, дополненный новым кодом для обнаружения столкновения объектов.

      Листинг 5.3. Метод для изменения координат и обнаружения столкновения объектов.

      private void updatePositions()

      {

      if (goingRight)

      {

      cx += xSpeed;

      }

      else

      {

      cx -= xSpeed;

      }

      if ((cx + cheeseImage.Width) >= this.Width)

      {

      goingRight = false;

      //At the time of collision, the signal Beep is given:

      Microsoft.VisualBasic.Interaction.Beep();

      }

      if (cx <= 0)

      {

      goingRight = true;

      //At the time of collision, the signal Beep is given:

      Microsoft.VisualBasic.Interaction.Beep();

      }

      if (goingDown)

      {

      cy += ySpeed;

      }

      else

      {

      cy -= ySpeed;

      }

      //That cheese did not come for the button3.Location.Y:

      if ((cy + cheeseImage.Height) >= button3.Location.Y)

      {

      goingDown = false;

      //At the time of collision, the signal Beep is given:

      Microsoft.VisualBasic.Interaction.Beep();

      }

      if (cy <= 0)

      {

      goingDown = true;

      //At the time of collision, the signal Beep is given:

      Microsoft.VisualBasic.Interaction.Beep();

      }

      //We check the collision of objects:

      if (goingDown)

      {

      //If cheese moves down and there is the collision:

      if (cheeseRectangle.IntersectsWith(breadRectangle))

      {

      //At the time of collision, the signal Beep

      //is given:

      Microsoft.VisualBasic.Interaction.Beep();

      //We have the collision:

      bool rightIn = breadRectangle.Contains(

      cheeseRectangle.Right,

СКАЧАТЬ