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 ppObjekt neu setzen. Wenn du einfach nur die int Variable hochzählst ändert sich ja nicht aufeinmal der Wert in deinemstringstreamund 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, alsoss.str("").