Не работает код для динамического создания инстанций шаров на экране sfml c++
Я пытаюсь написать код для создания экземпляров класса шарика динамически. Когда я все делал линейно, то все работало, но когда я захотел разбить программу по хедерам, все перестало работать. А именно fps перестал отрисовываться, количество шаров тоже перестало отрисовываться и сами шарики тоже. Но при этом ивент закрытие программы по прежнему корректно работает
Funcs.h
#include <SFML/Graphics.hpp>
int getFps()
{
static sf::Clock clock;
static int frameCount = 0;
frameCount++;
sf::Time deltaTime = clock.restart();
float fps = frameCount / deltaTime.asSeconds();
frameCount = 0;
return static_cast<int>(fps);
}
sf::Vector2f getTouchPos(unsigned const int idx, sf::RenderWindow& window)
{
sf::Vector2i rpos{ sf::Touch::getPosition(idx, window) };
sf::Vector2f pos = window.mapPixelToCoords(rpos);
return pos;
}
template<typename T>
void createPlanks(T&pls, std::vector<T*>& planksList, sf::Vector2f& pos, int radius)
{
T* newPlanks = new T; // Создаем новый экземпляр класса Planks динамически
planksList.push_back(newPlanks);
}
Main.cpp
#include <SFML/Graphics.hpp>
#include <vector>
#include <cmath>
#include "../include/Funcs.h"
sf::CircleShape shape(30, 30);
class ex1
{
public:
sf::Vector2f epos;
sf::RectangleShape rec;
void draw(sf::RenderWindow& window1)
{
window1.draw(rec);
}
void scale()
{
rec.setScale(10, 10);
}
};
int main()
{
ex1 pls;
sf::Font font;
if (!font.loadFromFile("resources/fonts/font.ttf")) // Загрузка шрифта
{
return 1;
}
sf::Text objs("", font, 20);
sf::Text fpsT("", font, 20);
fpsT.setPosition(10, 30);
objs.setPosition(110, 30);
int mode = 1;
srand(time(NULL));
std::vector<ex1*> planksList; // Создаем вектор указателей на экземпляры класса ex1
sf::CircleShape destroy(30, 30);
destroy.setFillColor(sf::Color::Blue);
sf::RenderWindow window(sf::VideoMode(360, 800), "Dynamic Instance");
while (window.isOpen())
{
fpsT.setString(std::to_string(getFps()));
for (ex1* instance : planksList)
{
if (instance != nullptr)
{
objs.setString("Objects count: " + std::to_string(planksList.size()));
}
}
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
else if (event.type == sf::Event::TouchBegan)
{
sf::Vector2f pos = getTouchPos(0, window);
createPlanks(pls, planksList, pos, 10);
}
}
for (ex1* instance : planksList)
{
instance->rec.setPosition(getTouchPos(0, window));
instance->rec.setScale(10, 10);
pls.draw(window);
}
window.draw(fpsT);
}
return 0;
}
Источник: Stack Overflow на русском