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

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

СКАЧАТЬ в этой плоскости “x, y” до столкновения с границей (линией), а после удара о границу должен отскочить от границы под определённым углом и перемещаться до следующего столкновения с границей, и так далее перемещаться и отражаться от линии;

      принимаем обычное допущение, что до столкновения с границей предмет перемещается (летит) по прямой линии;

      на основании допущения о том, что угол падения равен углу отражения, принимаем, что после столкновения с линией прямоугольника предмет отскакивает от этой линии под тем же углом; величину угла падения и угла отражения предмета от прямой линии принимаем равной 45 градусам;

      перемещение предмета осуществляется поэтапно за интервал времени, который мы установим с помощью компонента Timer (Таймер);

      интервал времени устанавливаем по значению свойства Interval компонента Timer; таким образом скорость перемещения объекта можно изменять за счёт изменения свойства Interval;

      анимация является бесконечным (если в него не вмешиваться) нециклическим процессом; анимацию можно остановить на любом этапе и запустить вновь.

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

      Таким образом, в данном проекте приведённый выше метод updatePositions заменяем на следующий.

      Листинг 4.5. Отскок объекта от границ.

      //Movement on an axis "x" to the right:

      bool goingRight = true;

      //Movement on an axis of "y" to the down:

      bool goingDown = true;

      private void updatePositions()

      {

      if (goingRight)

      {

      cx++;

      }

      else

      {

      cx–;

      }

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

      {

      goingRight = false;

      }

      if (cx <= 0)

      {

      goingRight = true;

      }

      if (goingDown)

      {

      cy++;

      }

      else

      {

      cy–;

      }

      if ((cy + cheeseImage.Height) >= this.ClientSize.Height)

      {

      goingDown = false;

      }

      if (cy <= 0)

      {

      goingDown = true;

      }

      }

      В этом коде видно, что координаты объекта “x, y” изменяются на величину +1, когда объект перемещается в положительном направлении осей “x, y” (вправо и вниз), и изменяются на величину -1, когда объект перемещается в отрицательном направлении осей “x, y” (влево и вверх).

      Код использует свойства ширины и высоты объекта (cheeseImage.Width и cheeseImage.Height) и экрана this.ClientSize.Width и this.ClientSize.Height). Вследствие этого программа будет нормально работать для любых размеров объекта и экрана.

      В режиме выполнения (Build, Build Selection; Debug, Start Without Debugging) мы видим, что на форме Form1 изображение СКАЧАТЬ