Ответить в теме: Бильярд – удар по шару

SFML и C++ Уроки \ Разработка игр Форумы SFML Graphics Бильярд – удар по шару Ответить в теме: Бильярд – удар по шару

#856
+2
JonAdmin
JonAdmin
Участник
Сообщений:11

Зарегистрирован:
23.05.2015

Репутация:9

Окей, а как заставить шар двигаться?
Движение шара будет прямолинейным равноускоренным. Есть его движение – это прямая.
Вспомним школу, какая формула прямой? Y = k*X + b;
Окей, будем двигать шар по этой формуле.
Создадим процедуру, которая будет срабатывать в начале движения шара:
Event event;
while (window.pollEvent(event))
{

if (event.type == Event::MouseButtonPressed)
if (event.key.code == Mouse::Left) //Если нажали ПКМ
moveBall();//Та самя процедура
}
Окей, в этой процедуре будет следующее:
Находим k,b которые нужны в формуле прямолинейного движения. В помощью школы вспомним как это делать:
k = (спрайт_шара.getPosition().y- pos.y) / (спрайт_шара.getPosition().x – pos.x);
b = pos.y – k *pos.x;
Напоминаю, что pos.x, pos.y кoординаты курсора.
В таком случае у нас шар сможет катиться только вверх и вправо, добавим выше переменную стороны, она будет либо -1, либо 1:
int znak;
Вот так вычисляем ее значение:
if (спрайт_шара.getPosition().y- pos.x > pos.x) znak = -1;
else znak = 1;
Создадим копию переменной rotation из прошлого поста (моего), ибо мы ее будем немного менять:
rotationCyl = rotation;
Ее значение будет таким (Это чтобы шар катился на все стороны):
if (rotation < 90) rotation = 90 + 90 – rotation;

Все это было процерура moveBall();

А теперь в главном цикле программы движем шар по формуле прямой:
x += znak*(2 – rotationCyl / 90)*time;
Скорость Х завист от угла поворота (2 – rotationCyl / 90), это для того чтобы скорость была равномерной, ибо чем больше Х, тем больше скачой по Y. Не забіваем скорость привязать ко времени *time.
А Y находим по формуле (это идет после нахождения икса):
y = (k*x + b);
Осталось указать новые координаты шара:
спрайт_шара.setPosition(x,y);

Все, столкновения сам делай.
И лайк гони