Занятие 14
Это надо знать
Для создания игровой ситуации, в программе можно считать очки.Допусти, при столкновении каких-то объектов с героем, очки уменьшаются, а при столкновении с некоторыми предметами сумма очков увеличивается.
Для подсчета очков инициализируем переменную score. Пусть ее начальное значение будет равно 5 - количество "жизней".
int score = 5;
Красным шариком будем управлять при помощи клавиатуры (функции Control и Phythics), остальные шарики будут двигаться прямолинейно (функция Phythics).
void Control (Subject* ball)
{
if (GetAsyncKeyState (ball->KeyForRight)) ball->x += 5;
if (GetAsyncKeyState (ball->KeyForLeft)) ball->x -= 5;
if (GetAsyncKeyState (ball->KeyForUp)) ball->y -= 5;
if (GetAsyncKeyState (ball->KeyForDown)) ball->y += 5;
if (GetAsyncKeyState (VK_SPACE)) ball->vx = ball->vy = 0;
}
Перепишем функцию Collision таким образом, чтобы она возвращала значение переменной hit. Переменная hit будет равна 0, если не произошло столкновение и равна 1, если шарики столкнулись.
int Collision (Subject* ball1, Subject* ball2)
{
int hit = 0;
double distance = pow (ball1->x - ball2->x, 2) + pow (ball1->y - ball2->y, 2);
if (distance < pow (ball1->r + ball2->r, 2))
{
std :: swap (ball1->vx, ball2->vx);
std :: swap (ball1->vy, ball2->vy);
hit = 1;
}
return hit;
}
При столкновении красного шарика с синим, будем уменьшать переменную score на 1. Игра закончится, когда score станет равна 0.
Для всех вызовов функции Collision с красным шариком запишем:
if (Collision (&ball1, &ball2)) score--;
if (Collision (&ball1, &ball3)) score--;
if (Collision (&ball1, &ball4)) score--;
if (Collision (&ball1, &ball5)) score--;
Вывод счета на экран
Выведем счет игры вверху по центру экрана.
Для вывода счета воспользуемся функцией txTextOut, но она выводит на экран текст, а счет игры - натуральное число.
Преобразуем число в текст, для этого можно использовать функцию sprintf:
sprintf (строковая переменная, "%d", число);
В нашем случае: sprintf (scoreStr, "%d", score);
Функция вывода очков на экран может быть записана так:
void DrawScore (int score)
{
int x = 270, y = 20;
txSetFillColor (TX_LIGHTBLUE);
txSetColor (TX_LIGHTRED);
txRectangle (x, y, x + 80, y + 40);
txSelectFont ("Arial", 40);
txSetTextAlign (TA_CENTER);
char scoreStr[10] = "";
sprintf (scoreStr, "%d", score);
txTextOut (x + 40, y, scoreStr);
}
Пример
В начале игры лягушке дается 5 "жизней". При столкновении лягушки и комара количество "жизней" уменьшается на 1. Игра проиграна, если количество "жизней" станет равным 0. Для выигрыша необходимо собрать 10 цветочков. Лягушка управляется при помощи стрелок.Посмотреть текст программы
Результат работы программы