Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

07.04.2012, 18:21

Sprite Position - String wird nicht richtig dargestellt

Hey Community

Ich habe mit SFML versucht die Position eines sich bewegenden Sprites auszugeben
doch iwie wird der String imens lang und die App verlangsamt sich

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <SFML\Audio.hpp>
#include <SFML\System.hpp>
#include <SFML\Graphics.hpp>
#include <SFML\Window.hpp>
#include <Windows.h>
#include <iostream>
#include <sstream>


using namespace std;

int main()
{
    





    sf::RenderWindow App(sf::VideoMode::GetMode(0) , "Game" );
    sf::Clock clock;
    sf::Image PacO(454,340);
    sf::Image PacC(454,340);

    PacO.LoadFromFile("PacManOpen.jpg");
    PacC.LoadFromFile("PacManClose.jpg");

    PacO.CreateMaskFromColor(sf::Color(255,255,255),0);
    PacC.CreateMaskFromColor(sf::Color(255,255,255),0);

    int PosW = 0, PosH = 0;
    long Touble = 0;

    sf::Sprite PAC;

    sf::Vector2f pos = PAC.GetPosition(); 
    stringstream tmp, tmp1;
    tmp << pos.x;
    tmp1 << pos.y;
       
       sf::Font MyFont;
       MyFont.LoadFromFile ("arialbd.ttf" , 26);

       sf::String Text;
    Text.SetText(tmp.str() + " , " + tmp1.str());
    Text.SetFont(MyFont);
    Text.SetSize(50);
       Text.SetColor(sf::Color(0,0,0));
    

    
    while(App.IsOpened())
    {
           
        
            Touble++;
        
        sf::Event Event;
        while (App.GetEvent(Event))
        {
            if(Event.Type == sf::Event::Closed)
                App.Close();
        }
         

                App.Clear(sf::Color(255,255,255));
                if(Touble == 120)
                {
                PAC.SetImage(PacO);
                }
                  else if(Touble == 240)
                {
                PAC.SetImage(PacC);
                   Touble = 0;
                }
                App.Draw(PAC);

                  Text.SetText(tmp.str() + " , " + tmp1.str());
                
                tmp << pos.x;
                tmp1 << pos.y;

                  App.Draw(Text);
                App.Display();

                  float ElapsedTime = App.GetFrameTime();
                  

if (App.GetInput().IsKeyDown(sf::Key::Left))  PAC.Move(-1, 0);
if (App.GetInput().IsKeyDown(sf::Key::Right)) PAC.Move( 1, 0);
if (App.GetInput().IsKeyDown(sf::Key::Up))  PAC.Move(0, -1);
if (App.GetInput().IsKeyDown(sf::Key::Down))  PAC.Move(0,  1);

if (App.GetInput().IsKeyDown(sf::Key::Left)||App.GetInput().IsKeyDown(sf::Key::Space))  PAC.Move(-2, 0);
if (App.GetInput().IsKeyDown(sf::Key::Right)||App.GetInput().IsKeyDown(sf::Key::Space)) PAC.Move( 2, 0);
if (App.GetInput().IsKeyDown(sf::Key::Up)||App.GetInput().IsKeyDown(sf::Key::Space))    PAC.Move(0, -2);
if (App.GetInput().IsKeyDown(sf::Key::Down)||App.GetInput().IsKeyDown(sf::Key::Space))  PAC.Move(0,  2);

   
    
    
     
        
        
    }

    return 0;
}

2

07.04.2012, 19:46

Du musst deinen stringstream immer leeren mit

C-/C++-Quelltext

1
tmp.str("");
, weil ansonsten werden die Werte immer hinten dran gehängt.

3

07.04.2012, 19:49

Jetzt wird nur ein Komma angezeigt sonst nichts ...

valentin

Treue Seele

Beiträge: 212

Wohnort: Schweiz

Beruf: Schüler

  • Private Nachricht senden

4

07.04.2012, 19:55

Wo leerst du ihn denn? Wenn nurnoch ein Komma ausgegeben wird, sehr wahrscheinlich am falschen Ort ;)

//edit: Du solltest die Positionen in den Stringstream stecken, bevor du sie beim sf::string settest.
visit me on deviantArt!
http://v-alentin.deviantart.com/

There is no programming language, no matter how structured, that will prevent programmers from making bad programs. //Larry Flon

5

07.04.2012, 19:57

Hm ich habe ihn jetzt nach dem Text.SetText ... in der Schleife gesetzt aber es kommt nur 0 , 0 also auch wenn ich das sprite bewegt habe.

valentin

Treue Seele

Beiträge: 212

Wohnort: Schweiz

Beruf: Schüler

  • Private Nachricht senden

6

07.04.2012, 20:27

C-/C++-Quelltext

1
2
3
4
5
6
7
tmp << pos.x;
tmp1 << pos.y;

Text.SetText(tmp.str() + " , " + tmp1.str());

tmp.str("");
tmp1.str("");


;)
visit me on deviantArt!
http://v-alentin.deviantart.com/

There is no programming language, no matter how structured, that will prevent programmers from making bad programs. //Larry Flon

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

7

07.04.2012, 20:57

Objekte, deren Erstellung nicht besonders viel Zeit benötigt sollten so spät wie möglich erzeugt werden. In dem fall also genau davor.

C-/C++-Quelltext

1
2
3
std::stringstream strStream;
strStream << pos.x << " , " << pos.y;
Text.SetText(strStream.str());

Dann musst du dir auch keine Gedanken ums neu initialisieren machen. :thumbsup:

Du könntest aber auch einfach diese Templatefunktion benutzen:

C-/C++-Quelltext

1
2
3
4
5
6
template<class T> inline std::string toStr(T x)
{
    std::stringstream type;
    type << x;
    return type.str();
}
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

8

08.04.2012, 00:55

Sorry ich bin leider zu doof um das richtig zu implementieren ^^

EDIT: Doch ich habs Danke :thumbsup:

Werbeanzeige