Вместо падающих спрайтов отображает белые круги и квадраты
#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
.