Бильярд – удар по шару

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

В этой теме 2 ответа, 2 участника, последнее обновление JonAdmin JonAdmin 8 года/лет, 11 мес. назад.

Просмотр 3 сообщений - с 1 по 3 (из 3 всего)
  • Автор
    Сообщения
  • #850

    abwrts
    Участник
    Сообщений:0

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

    Репутация:0

    Добрые день, Павел и все обитатели данного форума. Мое задание программа по типу бильярда, только луз – 4, а шаров по 5 у каждого игрока (игрока всего 2) и все это должно генерироваться ранодомно(как сделать рандом на карте понятно из 16 урока). Проблема заключается в том, что я не могу придумать, как заставить шары двигаться. Понятное дело, что для этого нужно что-то типа кия, но идей, как реализовать “анимацию” движения (подготовка к удару) нет. (И подскажите пожалуйста правильно ли я мыслю на счет переключения игроков : я думаю дать каждому по одной попытке забить шар противника, и переключение думаю реализовать простым “подсвечиванием” имени игрока на бортике бильярдного стола(можно конечно просто переместить кий на сторону 2-го или 1-го игрока, но мне кажется это слишком трудоемкий процесс, а время поджимает))

    Очень прошу помочь, наставить на путь истинный и исправить если неправильный ход мысли в реализации той или иной задачи

    Заранее спасибо за предложенные идеи и помощь

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

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

    Репутация:9

    Я знаю как. Читай внимательно:

    У нас есть шар, который мы бьем (как правило, белый), бить мы будем мышкой.

    Начнем с кия. Создай спрайт кия, текстуру сам найди. Чтобы кий крутился правильно, нужно указать току вращения спрайта кия. Точкой вращения будет шар, по которому мы будем бить (красная точка на скриншоте). Тоесть точка вращения кия будет за пределами спрайта кия. Это сделать можно так:
    sprite.setOrigin(-10, sprite.getTextureRect().height / 2)
    Разберем: “-10″ – отступ от шара, “sprite.getTextureRect().height / 2″ – центр кия по высоте.

    Окей, а как же заставить его крутиться за мышкой?
    Создадим вначале программы 2 вектора:
    Vector2i pixelPos; 
    Vector2f pos;
    Еще создадим доп. переменные, которые будут хранить координаты векторов:
    float vecX;
    float vecY;
    Последняя переменная, которая хранит угол поворота:
    float rotation;
    В главном цикле программы (while (window.isOpen()) {…})  будем ловить координаты мыши:
    pixelPos = Mouse::getPosition(window); //забираем координаты курсора
    pos = window.mapPixelToCoords(pixelPos); //переводим их в игровые
    Потом считаем векторы (от кия до мыши) по школьной формуле (от начала вектора отнимаем конец):
    vecX= pos.x – спрайт_шара.getPosition().x;
    vecY= pos.y – спрайт_шара.getPosition().y;
    Находим угол поворота по школьной формуле и переводим его в градусы:
    rotation = (atan2(gunX, gunY)) * 180 / 3.14159265;
    Осталось только повернуть спрайт кия:
    sprite.setRotation(rotation);
    Там может быть нужно будет отобразить угол (не уверен):
    sprite.setRotation(90 – rotation);

    Ура теперь кий смотрит в сторону шарика. В след. посте напишу как бить шар (мне нужно отойти на час)

    Вложения:
    You must be logged in to view attached files.
    #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);

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

Просмотр 3 сообщений - с 1 по 3 (из 3 всего)

Для ответа в этой теме необходимо авторизоваться.