Что не так с этим кодом?

Рейтинг: -3Ответов: 1Опубликовано: 03.05.2023

Решил написать тестовую программу, которая перемещает шар в ту часть экрана телефона, куда я нажму. Но когда я делаю setPosition(SPos, SPos) у меня все резко перестает работать. Вот код

#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;
        sf::Vector2i SPos = sf::Touch::getPosition(1);
        shape.setPosition(SPos, SPos);
        while (window.pollEvent(event))
        {
            if (event.type == Event::Closed)
                window.close();
        }

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

Ответы

▲ 1

Ну начнем с того что ты уже используешь.

using namespace sf;

По этой причине вообще не стоит использовать, sf:: во всех местах например sf::Vector2i просто - Vector2i

Во вторых, я даже незнакомый с библиотекой SFML/Graphics первое что сделал, просто загуглил мануал. (https://www.sfml-dev.org/documentation/2.5.1/classsf_1_1CircleShape.php) И что я там увидел?! Есть 2 метода setPosition

void setPosition(float x, float y);
void setPosition (const Vector2f &position)

Первый на вход принимает 2 аргумента float, Второй принимает float вектор Vector2f.

То-есть фактический ты пытаешься в float запихать Vector2i[int,int], и естественно твоё приложение в шоке от такой махинации, там позиция твоего круга может иметь космическую позицию, все это завернотое в while просто вешает твой телефон;

Решения два.

  1. Конвертировать Vector2i в Vector2f и передать второй функции одним аргументом.

  2. Вытащить из Vector2i отдельно значение X и Y преобразовать их в float и передать 1й функции.

Да будет вам счастье! )

Добавлено спустя:

Еще чуток погуглив, оказывается объект Vector2f поддерживает,статическое преобразование.

Vector2i mousePosition = Mouse::getPosition();
Vector2f mousePositionFloat = static_cast<Vector2f>(mousePosition);

Можно отдельно сказать спасибо пользователям Редит за прекрасный пример - https://www.reddit.com/r/sfml/comments/24fk87/what_is_the_proper_way_to_convert_a_vector2i_to_a/