#include <SFML/Graphics.hpp>
#include <iostream>
#include <string>
using namespace std;
struct patrat {
long double greutate; //mass
sf::RectangleShape shape;
long double viteza; //velocity
}patrat1,patrat2;
int main()
{
patrat1.greutate = 1000000000000.0f; //10^12 = 3141430
patrat1.shape.setSize(sf::Vector2f(200.0, 200.0));
patrat1.shape.setFillColor(sf::Color::Blue);
patrat1.shape.setPosition(500.0f, 250.0f);
patrat1.viteza = -0.1f;
patrat2.greutate = 1.0f;
patrat2.shape.setSize(sf::Vector2f(100.0f, 100.0f));
patrat2.shape.setFillColor(sf::Color::Red);
patrat2.shape.setPosition(200.0f, 350.0f);
patrat2.viteza = 0.0f;
sf::RectangleShape shape(sf::Vector2f(200, 200));
shape.setPosition(150.0f, 250.0f);
shape.setFillColor(sf::Color::Blue);
sf::RectangleShape shape1(sf::Vector2f(100, 100));
shape1.setPosition(50.0f, 350.0f);
shape1.setFillColor(sf::Color::Red);
sf::Font font;
if (!font.loadFromFile("C:\\Users\\hsvdg\\Documents\\MathicsRoundFree.ttf"))
std::cout << "Failed to load font. Make sure the font file is in the correct directory." << std::endl;
sf::Text text;
text.setFont(font);
text.setPosition(700, 10);
text.setFillColor(sf::Color::White);
text.setCharacterSize(24);
text.setString(std::to_string(0));
sf::RenderWindow window(sf::VideoMode(900, 500), "PI");
sf::RectangleShape lineV(sf::Vector2f(5, 500));
lineV.setPosition(50, 0);
lineV.setFillColor(sf::Color::White);
sf::RectangleShape lineH(sf::Vector2f(900, 5));
lineH.setPosition(0, 450);
lineH.setFillColor(sf::Color::White);
int pi = 0;
long double dt, fps = 700.0;
window.setFramerateLimit(fps);
dt = 1 / fps;
long double sem;
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
if(patrat1.shape.getPosition().x<=150) window.draw(shape);//remove the overlapping of the squares
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); //draw the pi text
window.display();
for (int i = 0; i <= 1000; i++) { //attempted optimization where for each drawn frame velocities and positions are updated 1k times
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++;
}
else if (patrat2.shape.getPosition().x <= 50 && patrat2.viteza < 0) {
patrat2.viteza *= -1;
pi++;
}
patrat1.shape.move(patrat1.viteza*dt, 0);
patrat2.shape.move(patrat2.viteza*dt, 0);
}
}
std::cout << pi;
text.setString(std::to_string(pi)); //set text to pi
return 0;
};
我期望 pi 显示在窗口的右上角。 即使字体加载没有任何问题并且我使用的是 C++17,文本仍然显示为点。我该如何解决它?
我认为这仍然是字体的问题,因为我运行了你的代码,并且屏幕上也只有一个点,但是当我用
“C:/Windows/Fonts/ariali.ttf”
替换你的路径时,它通常会画一个零,以及我想要的所有其他文本如果使用过setString()