SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Текст
В этой теме 2 ответа, 3 участника, последнее обновление KindRedSand 5 года/лет, 9 мес. назад.
-
АвторСообщения
-
У меня цель сделать так, что, когда враг получает урон от огня (пересекается с ним), рядом с ним высвечивается текст на 1 секунду, поднимающийся вверх, и удаляется. Я это решил сделать через списки текста, потому что создавать в классе врага не получится, ведь если по врагу попали два раза сразу, надо чтобы выплыло два текста, или больше, но только проблема в том, что если во врага летит много огней, то игра подтормаживает, и это именно из-за текста, пробовал без него, все работало нормально. Есть какие-то варианты как можно оптимизировать?
Я делаю так:
класс текста:
C++123456789101112131415161718192021222324class Dam {public:float tX, tY; int size;float dy = -0.5;float lifeT = 0;bool life = true;Font f;Text t;Dam(float x, float y, String text, int size, Font Fo){f = Fo;tX = x; tY = y;t.setFont(f);t.setCharacterSize(size);t.setString(text);}void update(float time){if (lifeT < 50) lifeT += 0.1*time;else { life = false; }t.setPosition(tX, tY);tY += dy*time;}};Проверка пересечения:
C++123456789101112for (iter1 = enemyArray.begin(); iter1 != enemyArray.end(); iter1++){for (fireIt = fireArray.begin(); fireIt != fireArray.end(); fireIt++){if ((*fireIt)->getRect().intersects((*iter1)->getRect())){(*fireIt)->aG = false;(*iter1)->health += (*fireIt)->damage;textArray.push_back(new Dam((*iter1)->x, (*iter1)->y, std::to_string((*fireIt)->damage), 200, f));}}}Возможно, игра подтормаживает из-за того, что для каждого экземпляра “текста” выделяется его личный шрифт. В конструкторе класса текста ты предаешь шрифт как аргумент по значению, соответственно хранишь в каждом тексте копию шрифта. Так делать не обязательно, достаточно передать его по ссылке.
C++12345678910111213141516171819202122class Dam {public:float tX, tY; int size;float dy = -0.5;float lifeT = 0;bool life = true;Text t;Dam(float x, float y, String text, int size, Font& Fo){tX = x; tY = y;t.setFont(Fo);t.setCharacterSize(size);t.setString(text);}void update(float time){if (lifeT < 50) lifeT += 0.1*time;else { life = false; }t.setPosition(tX, tY);tY += dy*time;}};Объясню оратора выше. В аргумент функции или метода по умолчанию мы передаём копию объекта, т.е. как правильно заметил makish под шрифт выделяется лишняя память которая удаляется при выходе из конструктора. Как по мне особо смысла передавать sf::Font даже через ссылку не совсем целесообразно. Лучше конечно сделать статичный загрузчик ресурсов который всегда будет иметь и передавать лишь 1 копию каждого ресурса, но ты можешь сделать шрифт и как глобальную переменную (Или статичную, принадлежащуюю какому-либо классу. Тогда вызов будет происходить как MyClass:MyFont). Если нужно получить доступ к тексту в другом .h .cpp файле с методом глобальной переменной то прописываешь где надо
C++1extern sf::Font fontNameСо статичным членом класса – указываем где надо наш хидер и получам доступ к классу::переменной
Так же лаги могет происходить из за: Кол-во объектов в поле отрисовки, Кол-во объектов в очереди обновления, Кол-во объектов проверяют друг с другом столкновения.
Если хочешь можешь обращатся ко мне через дискорд https://discord.gg/MC3zMHn . На сайт я не особо часто захожу, но всегда могу помочь в дискорде -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.