SFML中int转string后文本显示为圆点的问题修复咨询
问题修复:SFML文本无法更新显示碰撞次数
核心问题
你更新文本内容的代码放在了主循环之后,此时窗口已经关闭,根本没有机会渲染更新后的文本。另外,每次碰撞后pi值变化时,需要实时更新文本内容,而不是只在程序结束时设置一次。
修复步骤
- 将
text.setString(std::to_string(pi))移到主循环内部,确保每次pi变化后都能更新文本,并在window.display()前完成设置。 - 调整逻辑顺序:先处理物理更新和碰撞计数,再执行渲染操作,避免画面显示滞后于逻辑状态。
修正后的关键代码片段
修改主循环部分:
while (window.isOpen()) { sf::Event event; while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) window.close(); } // 先处理物理逻辑与碰撞计数 for (int i = 0; i <= 1000; i++) { if (patrat1.shape.getPosition().x <= patrat2.shape.getPosition().x + 100 && patrat2.viteza >= 0) { sem = patrat1.viteza; patrat1.viteza = (patrat1.greutate - patrat2.greutate) / (patrat1.greutate + patrat2.greutate) * sem + (2 * patrat2.greutate) / (patrat1.greutate + patrat2.greutate) * patrat2.viteza; patrat2.viteza = (2 * patrat1.greutate) / (patrat1.greutate + patrat2.greutate) * sem + (patrat2.greutate - patrat1.greutate) / (patrat1.greutate + patrat2.greutate) * patrat2.viteza; pi++; text.setString(std::to_string(pi)); // 碰撞后立即更新文本 } else if (patrat2.shape.getPosition().x <= 50 && patrat2.viteza < 0) { patrat2.viteza *= -1; pi++; text.setString(std::to_string(pi)); // 碰撞后立即更新文本 } patrat1.shape.move(patrat1.viteza*dt, 0); patrat2.shape.move(patrat2.viteza*dt, 0); } // 再执行渲染操作 window.clear(); if(patrat1.shape.getPosition().x<=150) window.draw(shape); else window.draw(patrat1.shape); if (patrat2.shape.getPosition().x <= 50) window.draw(shape1); else window.draw(patrat2.shape); window.draw(lineV); window.draw(lineH); window.draw(text); window.display(); } std::cout << pi; return 0;
额外说明
- 每次
pi值增加时立即调用text.setString,保证文本实时反映当前碰撞次数。 - 调整逻辑与渲染的顺序后,画面显示的内容会与最新的物理状态同步,避免视觉延迟。
内容的提问来源于stack exchange,提问作者Oliver Jeworrek
相关产品推荐
相关产品推荐

