Некорректное перемещение шара

Рейтинг: 0Ответов: 2Опубликовано: 04.05.2023

Вот код

#include <SFML/Graphics.hpp>

using namespace sf;

int main()
{

    RenderWindow window(VideoMode(360, 800), L"SFML", Style::Default);

    window.setVerticalSyncEnabled(true);

    CircleShape shape(100.f,50);
    
    shape.setFillColor(Color::Red);

    while (window.isOpen())
    {
        Event event;
        Vector2i SPos = Touch::getPosition(1, window);
        Vector2f TPos = static_cast<Vector2f>(SPos);
        shape.setPosition(TPos.x, TPos.y);
        while (window.pollEvent(event))
        {
            if (event.type == Event::Closed)
                window.close();
        }

        window.clear();
        window.draw(shape);
        window.display();
    }
    return 0;
}

У меня сразу две проблемы. Во первых: шар перемещается не корректно, даже при преобразовании vec2i в vec2f. Некорректность проявляется в том, что для движения шара нужно сразу два пальца, и когда он двигается, он это делает быстрее моего пальца. Во вторых: SPos объявлен в бесконечном цикле, и при отпускании экрана, позиция шара сбрасывается. Мне нужно, что бы позиция запоминалась.

Ответы

▲ 0

Ну, во первых начнём с того, что ваш шар вообще не куда не двигается, это можно легко проверить используя функцию {sleep(milliseconds(500))} и таким образом следя за каждой итерацией. Во вторых что именно, конкретно, вы хотите сделать с этим шаром? Так же {TPos.x} и {TPos.y} возвращает нули.

▲ 0

Два пальца нужно оттого, что в коде берется позиция второго указателя. Не надо забывать, что индексы начинаются с 0. А чтобы позиция не сбрасывалась при отпускании следует выполнять перемещение только после проверки на нажатие.

unsigned int const pointer_index{0};
if (::sf::Touch::isDown(pointer_index))
{
    ::sf::Vector2i const pos{::sf::Touch::getPosition(pointer_index, window)};
    shape.setPosition(static_cast<::sf::Vector2f>(pos));
}