Спонсор: Microsoft
Опубликован: 10.04.2009 | Доступ: свободный | Студентов: 3248 / 243 | Оценка: 4.49 / 4.39 | Длительность: 17:21:00
Специальности: Программист
Самостоятельная работа 4:

Взаимодействие объектов

В раздел объявления переменных класса мы добавили новую переменную sprSpeed типа float, которую будем использовать при модификации позиции спрайта в процедурах изменения координат в зависимости от нажатой клавиши на клавиатуре.

Обратите внимание на логическую функцию IsCollide, ее код приведен в листинге

bool  IsCollide(spriteComp sp1, spriteComp sp2)
 {
     if (sp1.sprPosition.X < sp2.sprPosition.X + sp2.sprRectangle.Width &&
         sp1.sprPosition.X + sp1.sprRectangle.Width > sp2.sprPosition.X &&
         sp1.sprPosition.Y < sp2.sprPosition.Y + sp2.sprRectangle.Height &&
         sp1.sprPosition.Y + sp1.sprRectangle.Height > sp2.sprPosition.Y)
     {
         return true;
     }
     else return false;

 }
Листинг 8.3. Логическая функция IsCollide

Эта функция принимает в качестве параметров два объекта класса spriteComp – то есть два наших объекта, перемещением которых мы управляем из кода игрового класса. Если выполняется условие столкновения объектов – функция возвращает true, иначе – false.

Мы вызываем эту функцию при перемещении объектов, корректируя их позиции при столкновении. Рассмотрим пример перемещения одного из объектов в направлении "Вверх" - листинг 8.4.

if (kbState.IsKeyDown(Keys.Up))
     {
         MoveUp(gameObject1, sprSpeed );
         while (IsCollide(gameObject1, gameObject2))
         {
      MoveDown(gameObject1, (sprSpeed / 10));
         }
     }
Листинг 8.4. Фрагмент кода, применяющий функцию IsCollide()

В этом фрагменте мы перемещаем объект на количество пикселей, задаваемых параметром sprSpeed в направлении "Вверх". После перемещения мы вызываем функцию IsCollide(). Если она возвратила false – никаких действий больше не предпринимаем. Но если она возвратила true – перемещаем объект в обратном направлении (вызывая процедуру MoveDown ), изменяя координаты со скоростью, равной 1/10 обычного изменения координат. В примере скорость изменения позиции спрайта равна 5. Если спрайт на этой скорости зашел за границы другого спрайта – данная ситуация обрабатывается как столкновение. После этого спрайт перемещается в обратном направлении со скоростью 0,5 до тех пор, пока не окажется, что столкновения больше нет. Таким образом при столкновении объекты останавливаются строго около границ друг друга, не пересекая их, но и не находясь на некотором расстоянии друг от друга при скорости перемещения, которая меньше, чем размеры объектов.

На рис. 8.3. вы можете видеть пример столкновения объектов.

Столкновение объектов

увеличить изображение
Рис. 8.3. Столкновение объектов

Теперь рассмотрим пример обработки столкновений объектов при их автоматическом перемещении с заданием скорости перемещения объектов.

Alina Lasskaja
Alina Lasskaja

Быть может кто-то из Вас знает игру Sims, к какому жанру она относиться? Жизненная симуляция, ролевая игра, там можно и дома строить.....