Быть может кто-то из Вас знает игру Sims, к какому жанру она относиться? Жизненная симуляция, ролевая игра, там можно и дома строить..... |
Взаимодействие объектов
В раздел объявления переменных класса мы добавили новую переменную 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. вы можете видеть пример столкновения объектов.
Теперь рассмотрим пример обработки столкновений объектов при их автоматическом перемещении с заданием скорости перемещения объектов.