Графика для Windows средствами DirectDraw


Класс Sprite - часть 5


Это сделано намеренно, чтобы мы не смогли обратиться к спрайту во время реакции на столкновение (о ней говорится ниже). Следовательно, если вам потребуется другая информация о столкнувшемся спрайте, кроме его положения (например, тип спрайта или уровень его «здоровья» для компьютерной игры), ее необходимо сохранить в функции Hit(). Эту информацию следует получить немедленно, не дожидаясь стадии реакции, потому что к этому времени статус другого спрайта может измениться.

Функция Sprite::Update() выполняет две задачи: обновляет положение спрайта и, в случае столкновения, изменяет переменные, определяющие направление его перемещения (xinc и yinc). Функция Update() приведена в листинге 9.2.

Листинг 9.2. Функция Sprite::Update()


void Sprite::Update() { if (collide) { int centerx=GetCenterX(); int centery=GetCenterY(); int xvect=collideinfo.x-centerx; int yvect=collideinfo.y-centery; if ((xinc>0 && xvect>0) || (xinc<0 && xvect<0)) xinc=-xinc; if ((yinc>0 && yvect>0) || (yinc<0 && yvect<0)) yinc=-yinc; collide=FALSE; }

x+=xinc; y+=yinc;

if (x>640-w/2) { xinc=-xinc; x=640-w/2; } if (x<-(w/2)) { xinc=-xinc; x=-(w/2); } if (y>480-h/2) { yinc=-yinc; y=480-h/2; } if (y<-(h/2)) { yinc=-yinc; y=-(h/2); } }


Сначала Update() проверяет состояние логической переменной collide. Если переменная равна TRUE, мы получаем данные о положении двух спрайтов (текущего и столкнувшегося с ним) и используем их для вычисления новой траектории текущего спрайта. При этом используется схема, очень далекая от настоящей физической модели — при столкновении каждый спрайт отлетает в направлении, противоположном направлению удара.

Затем переменные x и y обновляются с учетом значений xinc и yinc. Новое положение спрайта проверяется и при необходимости корректируется. Корректировка происходит, когда спрайт более чем наполовину уходит за край экрана.

Возможно, вы заметили некоторую ограниченность в реализации класса Sprite: при каждом обновлении спрайт может отреагировать лишь на одно столкновение.При одновременном столкновении с несколькими спрайтами для расчета реакции будет использован лишь один из них. Чтобы изменить такое поведение, можно создать массив структур CollideInfo и отдельно сохранять информацию о каждом спрайте, полученную функцией Hit(). В этом случае при вычислении новой траектории курса на стадии реакции будет учитываться положение каждого спрайта, участвующего в столкновении. Однако на практике в подавляющем большинстве столкновений участвуют всего два спрайта.




Начало  Назад  Вперед



Книжный магазин