Вместо падающих спрайтов отображает белые круги и квадраты

#include <iostream>
#include <thread>
#include <chrono>
#include <SFML/Graphics.hpp>

int main() {
    sf::RenderWindow window(sf::VideoMode(800, 600), "A simple game");
    window.setKeyRepeatEnabled(false);
    window.setFramerateLimit(60);

    sf::Clock clock;
    double elapsed{};

    sf::Texture playerTexture;
    if (!playerTexture.loadFromFile("player.png")) {
        std::cerr << "Failed to load player texture!" << std::endl;
        return 1;
    }
    sf::Sprite player(playerTexture);
    player.setScale(2.0f, 2.0f); // Увеличиваем размер спрайта игрока
    player.setPosition(window.getSize().x / 2 - player.getLocalBounds().width / 2, window.getSize().y - player.getLocalBounds().height * 2);

    std::vector<sf::Sprite> rectangles;
    std::vector<sf::Sprite> circles;

    while (window.isOpen()) {
        sf::Event event;
        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) {
            if (player.getPosition().x > 0)
                player.move(-5, 0);
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) {
            if (player.getPosition().x < window.getSize().x - player.getLocalBounds().width)
                player.move(5, 0);
        }

        // Спавн спрайтов
        if (elapsed > 10) {
            sf::Texture rectTexture;
            if (!rectTexture.loadFromFile("1.png")) { // Убедимся, что текстура загружена
                std::cerr << "Failed to load rectangle texture!" << std::endl;
                return 1;
            }
            sf::Sprite rectSprite(rectTexture);
            rectSprite.setPosition(rand() % (window.getSize().x - 100), -50);

            sf::Texture circleTexture;
            if (!circleTexture.loadFromFile("2.png")) { // Убедимся, что текстура загружена
                std::cerr << "Failed to load circle texture!" << std::endl;
                return 1;
            }
            sf::Sprite circleSprite(circleTexture);
            circleSprite.setPosition(rand() % (window.getSize().x - 100), -50);

            rectangles.push_back(rectSprite);
            circles.push_back(circleSprite);

            elapsed = 0;
            clock.restart();
        }

        // Move sprites
        for (size_t i = 0; i < rectangles.size(); ) {
            rectangles[i].move(0, 3);
            if (rectangles[i].getPosition().y > window.getSize().y)
                rectangles.erase(rectangles.begin() + i);
            else
                ++i;
        }

        for (size_t i = 0; i < circles.size(); ) {
            circles[i].move(0, 3);
            if (circles[i].getPosition().y > window.getSize().y)
                circles.erase(circles.begin() + i);
            else
                ++i;
        }

        // Collision detection with player
        for (size_t i = 0; i < rectangles.size(); ++i) {
            if (rectangles[i].getGlobalBounds().intersects(player.getGlobalBounds())) {
                // Handle collision
                rectangles.erase(rectangles.begin() + i);
            }
        }

        for (size_t i = 0; i < circles.size(); ++i) {
            if (circles[i].getGlobalBounds().intersects(player.getGlobalBounds())) {
                // Handle collision
                circles.erase(circles.begin() + i);
            }
        }

        window.clear();

        // Draw sprites
        for (size_t i = 0; i < rectangles.size(); ++i)
            window.draw(rectangles[i]);

        for (size_t i = 0; i < circles.size(); ++i)
            window.draw(circles[i]);

        window.draw(player);

        window.display();

        elapsed += clock.getElapsedTime().asSeconds();
    }

    return 0;
}

Ответы (1 шт):

Автор решения: user7860670

В блоке // Спавн спрайтов создаются объекты sf::Texture rectTexture; с автоматическим временем хранения, которые разрушаются после выхода из блока, и на который продолжают ссылаться созданные спрайты. Переделайте код так, чтобы экземпляры sf::Texture жили дольше, чем спрайты, которые на них ссылаются, Имеет смысл перенести их к объявлениям playerTexture.

→ Ссылка