C++/SFML String



  • Hallo,
    ich arbeite aktuell an einem simplen Spiel
    Logik: Man ist ein Viereck und soll ein anderes "fangen", welches zufällig irgendwo generiert wird, anschließend wird beim Fangen der Punktestand um 1 erhöht; bewegt man sich jedoch aus dem Fenster, dann wird der Punktestand um 5 verringert.(Bald ist das alles noch auf Zeit)

    Ich habe nun vieles mit dem Text getestet ... aber egal wo und wie ich das gemacht hatte wurde neben meinen Punktestand immer wieder der neue daneben hingepackt ...
    Wo muss das hin?

    #include <SFML/Graphics.hpp>
    #include "engine.h"
    #pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup")
    
    using namespace sf;
    
    int main()
    {
        RenderWindow window(VideoMode(800, 450), "Rocket");
    	window.setFramerateLimit(60);
    
    	engine Rocket("rocket.png");
    
        while (window.isOpen())
        {
            Event event;
            while (window.pollEvent(event))
            {
                if (event.type == Event::Closed)
                    window.close();
    			if(Keyboard::isKeyPressed(Keyboard::Escape))
    				window.close();
            }
    
            window.clear(Color(255,255,255));
    		Rocket.Move(window);
    		Rocket.Point(window);
    		Rocket.Render(window);
            window.display();
        }
    
        return 0;
    }
    
    #include <SFML\Graphics.hpp>
    #include <sstream>
    
    using namespace sf;
    
    class engine
    {
    private:
    	RectangleShape player;
    	RectangleShape hit;
    
    	int box_x, width;
    	int box_y, height;
    
    	int punkte;
    
    	Font arial;
    	Text pp;
    	std::stringstream ss;
    
    public:
    	void Render(RenderWindow &Window);
    	void Move(RenderWindow &Window);
    	void Point(RenderWindow &Window);
    	engine (String tex);
    };
    
    #include "engine.h"
    
    using namespace sf;
    
    engine::engine(String tex)
    {
    	player.setSize(Vector2f(40,40));
    	player.setOrigin(20,20);
    	player.setFillColor(Color::Red);
    	player.setPosition(400,225);
    
    	hit.setSize(Vector2f(20,20));
    	hit.setOrigin(10,10);
    	hit.setFillColor(Color::Green);
    	hit.setPosition(400,225);
    
    	punkte = -1;
    	ss << "Punkte: " << punkte;
    
    	arial.loadFromFile("arial.ttf");
    	pp.setFont(arial);
    	pp.setStyle(Text::Bold);
    	pp.setColor(Color::Black);
    	pp.setPosition(5,5);
    	pp.setCharacterSize(20);
    	pp.setString(ss.str());
    
    	width = 780;
    	height = 430;
    }
    
    void engine::Render(RenderWindow &Window)
    {
    	Window.draw(player);
    	Window.draw(hit);
    	Window.draw(pp);
    }
    
    void engine::Point(RenderWindow &Window)
    {
    	if(player.getGlobalBounds().intersects(hit.getGlobalBounds()))
    	{
    		box_x = 10 + rand() % width;
    		box_y = 10 + rand() % height;
    
    		hit.setPosition(box_x,box_y);
    
    		punkte++;	
    	}
    }
    
    void engine::Move(RenderWindow &Window)
    {
    	if(player.getPosition().x < 0 || player.getPosition().x > 800 || player.getPosition().y < 0 || player.getPosition().y > 450)
    	{
    		player.setPosition(400,225);
    
    		punkte = punkte -5;
    	}
    
    	if(Keyboard::isKeyPressed(Keyboard::Up))
    	{	
    		player.move(0,-6);
    	}
    	if(Keyboard::isKeyPressed(Keyboard::Down))
    	{
    		player.move(0,6);
    	}
    	if(Keyboard::isKeyPressed(Keyboard::Left))
    	{
    		player.move(-6,0);
    	}
    	if(Keyboard::isKeyPressed(Keyboard::Right))
    	{
    		player.move(6,0);
    	}
    }
    


  • Die entscheidenden Stellen sind bei den Voids: engine::Point und Move, wo sich der Punktestand ändern soll



  • Du musst auch schon den Text von deinem Text pp Objekt neu setzen. Wenn du einfach nur die int Variable hochzählst ändert sich ja nicht aufeinmal der Wert in deinem stringstream und der daraus erzeugte String. Da liegen mindestens zwei Kopien dazwischen.



  • zuvor hatte ich mit erneutem
    ss << ... << punkte;
    pp.setString(ss.str());
    das gemacht, jedoch kommt in der zeile ein String nach dem anderen.



  • Ja weil du das stringstream Objekt weiter benutzt. Eigentlich gibt es gar keinen Grund den stringstream in die Klasse zu packen. Ich würde es so machen:

    punkte++;
    std::stringstream ss;
    ss << "Punkte: " << punkte;
    pp.setString(ss.str());
    

    Oder wenn dein Compiler C++11 unterstützt:

    punkte++;
    pp.setString(std::to_string(punkte));
    


  • hätte nicht gedacht, dass es so einfach ist XD
    ich dachte ja irgendwie den String zu leeren aber wie? Na gut, das funktioniert!
    Vielen Dank 👍 , jetzt mach ich mich noch an den Timer ran.



  • stringstreams leerst du mit der Funktion basic_ostringstream::str , also ss.str("") .


Anmelden zum Antworten