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

tutedutsch

Frischling

  • »tutedutsch« ist der Autor dieses Themas

Beiträge: 28

Beruf: IT Systemkaufmann in Ausbildung

  • Private Nachricht senden

1

25.04.2016, 15:49

C++ SFML Textframework einbinden

Hallo zusammen,

Ich habe vor in meinem Spiel einen Text oben in der Ecke einzublenden, der durch drücken verschiedener Tasten etwas anderes anzeigt (Steuerung, Spielerklärung, ...). Dies hat auch alles funktioniert, als das alles noch in meinem Hauptframework war. Ich wollte das aber ausgliedern, damit im Hauptframework nur alle anderen Frameworks zusammenlaufen und nicht so unübersichtlich gemischt werden. Das auslagern in ein eigenes Framework hat auch funktioniert, nur das einbinden in das Hauptframework will noch nicht so ganz.

Da es ja ein reiner Text ist, kann man ihn meines Wissens ja nicht wie ein Bild einbinden.

Mein Framework mit dem Spieler habe ich folgendermaßen eingebunden:

C-/C++-Quelltext

1
pPlayer       = new Player(std::string("/Users/leonmaier/Desktop/Spiele selber gemacht/First Game/Referenzen/Texturen/Spieler.png"),sf::Vector2f(400,100));


Mit meinem Text wollte ich das genau so machen, doch dies klappt nicht.

So:

C-/C++-Quelltext

1
pInfotext     = new Infotext(sf::Text);

geht es aber auch nicht.

Über einen Ratschlag wäre ich sehr dankbar:)
YouTube:Comedykanal|TUTEDUTSCH
YouTube:Codingkanal|TuteCodes
Website:tutedutsch.jimdo.com

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

2

25.04.2016, 16:13

Wir haben keine Ahnung, was Infotext ist. Wir haben keine Ahnung, wie dein Framework aussieht.

Ich habe keine Ahnung, wieso Leute im Jahr 2016 noch new in C++ verwenden.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

tutedutsch

Frischling

  • »tutedutsch« ist der Autor dieses Themas

Beiträge: 28

Beruf: IT Systemkaufmann in Ausbildung

  • Private Nachricht senden

3

25.04.2016, 16:18

Sorry für die fehlenden Informationen

Indotext ist der Name des Frameworks welches so aussieht:
(cpp)

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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include "Infotext.hpp"


Infotext::Infotext(std::string texturePath,sf::Vector2f position){

#include "Framework.hpp"        


        
        pFont         = new sf::Font;
        pFont->loadFromFile("/Users/leonmaier/Desktop/Spiele selber gemacht/First Game/Referenzen/sansation.ttf");
        
        
        Text.setFont(*pFont);
        Text.setString("(1/4)Steuerung:\nW = Oben\nA = Links\nS = Unten\nD = Rechts\nShift = Sprinten\nPfeil rechts = Seite vor\nPfeil links = Seite zurueck\nH = Hilfe an/aus");
        Text.setCharacterSize(50);
        Text.setPosition(10, 0);
        Text.setColor(sf::Color::Black);
        Hilfemenü = true;
        Seitenzahl = 1;

        
}
        

        
    
    void Infotext::update(float frametime){
        
        
        wasPressedH = isPressedH;
        isPressedH = sf::Keyboard::isKeyPressed(sf::Keyboard::H);
        if (!wasPressedH && isPressedH) Hilfemenü = !Hilfemenü;
        
        wasPressedRight = isPressedRight;
        isPressedRight = sf::Keyboard::isKeyPressed(sf::Keyboard::Right);
        if (!wasPressedRight && isPressedRight) Seitenzahl = Seitenzahl + 1;
        
        wasPressedLeft = isPressedLeft;
        isPressedLeft = sf::Keyboard::isKeyPressed(sf::Keyboard::Left);
        if (!wasPressedLeft && isPressedLeft) Seitenzahl = Seitenzahl - 1;
        
        
        
        if (Seitenzahl == 1) Text.setString("(1/4)Steuerung:\nW = Oben\nA = Links\nS = Unten\nD = Rechts\nShift = Sprinten\nPfeil rechts = Seite vor\nPfeil links = Seite zurueck\nH = Hilfe an/aus");
        
        if (Seitenzahl == 2) Text.setString("(2/4)Allgemein:\nW = Oben\nA = Links\nS = Unten\nD = Rechts\nShift = Sprinten\nPfeil rechts = Seite vor\nPfeil links = Seite zurueck\nH = Hilfe an/aus");
        //
        //Ende Infotext
        
        
        if ((sf::Keyboard::isKeyPressed(sf::Keyboard::A))) {
            
                 //Links
            Text.move(-200*frametime, 0);
        }
        if ((sf::Keyboard::isKeyPressed(sf::Keyboard::A)) && (sf::Keyboard::isKeyPressed(sf::Keyboard::LShift))) {
            
           //Links sprinten
            Text.move(-300*frametime, 0);
            
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) {
            
            //Rechts
            Text.move(200*frametime, 0);
            
        }
        if ((sf::Keyboard::isKeyPressed(sf::Keyboard::D)) && (sf::Keyboard::isKeyPressed(sf::Keyboard::LShift))) {
            
            //Rechts sprinten
            Text.move(300*frametime, 0);
            
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::W)) {
            
            //Oben
            Text.move(0, -200*frametime);
            
        }
        if ((sf::Keyboard::isKeyPressed(sf::Keyboard::W)) && (sf::Keyboard::isKeyPressed(sf::Keyboard::LShift))) {
            
            //Oben sprinten
            Text.move(0, -300*frametime);
            
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::S)) {
            
            //Unten
            Text.move(0, 200*frametime);
            
        }
        if ((sf::Keyboard::isKeyPressed(sf::Keyboard::S)) && (sf::Keyboard::isKeyPressed(sf::Keyboard::LShift))) {
            
            //Unten sprinten
            Text.move(0, 300*frametime);
            
        }
        
        
        
        
        
        
        
        
    }
    

    
    
    
    void Infotext::handle(){
        
    }
    

    
    void Infotext::render(sf::RenderWindow *rw){
        
            if (Hilfemenü == true) rw->draw(Text);
    }


(hpp)

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
#ifndef INFOTEXT_HPP
#define INFOTEXT_HPP

#include <iostream>
#include <SFML/Graphics.hpp>




class Infotext{
    
public:
    Infotext(std::string texturePath,sf::Vector2f position);
    
    void update(float frametime);
    void render(sf::RenderWindow *rw);
    void handle();
    
    
    
private:
    
    void loadInfotext();
    sf::Text         Text;
    sf::Font         *pFont;
    bool             Hilfemenü;
    int              Seitenzahl;
    bool             wasPressedH;
    bool             isPressedH;
    bool             wasPressedRight;
    bool             isPressedRight;
    bool             wasPressedLeft;
    bool             isPressedLeft;

    
    
};








#endif


New verwende ich, weil ich es damals in einem Tutorial so gelernt habe und es eigentlich immer funktioniert hat
YouTube:Comedykanal|TUTEDUTSCH
YouTube:Codingkanal|TuteCodes
Website:tutedutsch.jimdo.com

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

4

25.04.2016, 16:25

New verwende ich, weil ich es damals in einem Tutorial so gelernt habe und es eigentlich immer funktioniert hat

Man kann auch noch mit malloc arbeiten, sollte man aber dennoch nicht in den allermeisten UseCases.

Zu deinem Code: Wieso ein include der Framework.hpp in der .cpp und noch dazu mitten in einer Methode?
Und dein Code funktioniert nicht, weil Infotext keinen Konstruktor hat, der nur einen sf::Text entgegennimmt.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

tutedutsch

Frischling

  • »tutedutsch« ist der Autor dieses Themas

Beiträge: 28

Beruf: IT Systemkaufmann in Ausbildung

  • Private Nachricht senden

5

25.04.2016, 16:44

Wieso ein include der Framework.hpp in der .cpp und noch dazu mitten in einer Methode?

Das ist ein versehen, danke für den Hinweis.
Das muss da ja garnicht rein.

Und dein Code funktioniert nicht, weil Infotext keinen Konstruktor hat, der nur einen sf::Text entgegennimmt

Könntest du mir etwas genauer beschreiben, was ich verändern muss und wie ich einen Konstruktor hinzufügen kann?

Vielen Dank
YouTube:Comedykanal|TUTEDUTSCH
YouTube:Codingkanal|TuteCodes
Website:tutedutsch.jimdo.com

tutedutsch

Frischling

  • »tutedutsch« ist der Autor dieses Themas

Beiträge: 28

Beruf: IT Systemkaufmann in Ausbildung

  • Private Nachricht senden

6

25.04.2016, 17:57

Hat sich erledigt!!
Ich habe das jetzt durch Bilder gelöst, das sieht auch viel besser aus und funktioniert.

Bitte keine Vorschläge mehr senden :)
YouTube:Comedykanal|TUTEDUTSCH
YouTube:Codingkanal|TuteCodes
Website:tutedutsch.jimdo.com

7

25.04.2016, 18:01

Und die Grundlagen nach wie vor nicht Verstanden, damit ist dann Niemanden geholfen.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

8

25.04.2016, 18:03

Doch, schau dir Smartpointer an, bzw. dass du Objekte auch ohne new anlegen kannst.
Edit: ei, sollte schneller schreiben.

tutedutsch

Frischling

  • »tutedutsch« ist der Autor dieses Themas

Beiträge: 28

Beruf: IT Systemkaufmann in Ausbildung

  • Private Nachricht senden

9

25.04.2016, 18:43

Und die Grundlagen nach wie vor nicht Verstanden, damit ist dann Niemanden geholfen.

Damit hast du nicht unrecht. Ich will mich momentan aber erstmal auf das wichtige konzentrieren. Vielleicht kann ich mir (falls ich es später nochmal benötigen werde) das ja durch Logik selbst erschließen. Wenn du mir aber helfen willst würde ich mich aber trotzdem sehr freuen:)

Schönen Abend noch
YouTube:Comedykanal|TUTEDUTSCH
YouTube:Codingkanal|TuteCodes
Website:tutedutsch.jimdo.com

10

25.04.2016, 19:15


Damit hast du nicht unrecht. Ich will mich momentan aber erstmal auf das wichtige konzentrieren. Vielleicht kann ich mir (falls ich es später nochmal benötigen werde) das ja durch Logik selbst erschließen. Wenn du mir aber helfen willst würde ich mich aber trotzdem sehr freuen:)


Ich werde es mal Versuchen, aber erwarte keine Kompletlösung für dein Problem.

Und dein Code funktioniert nicht, weil Infotext keinen Konstruktor hat, der nur einen sf::Text entgegennimmt.


Was Nimelrian dir damit sagen wolte, ist dass es einen Unterschied gibt wie dein aktueller Konstruktor aussieht.

C-/C++-Quelltext

1
Infotext(std::string texturePath,sf::Vector2f position);

Und wie du deinen Infotext mit new Erzeugst

C-/C++-Quelltext

1
pInfotext     = new Infotext(sf::Text);


Infotext erwartet einen std::String und eine sf::Vector2f du aber willst ihn per new mit einem sf::Text erzeugen!

Weiter hin sehe ich zwar ein Konstrukter in dem Objekte mit new erzeugt werden aber keinen Destruktor der den Speicher wieder mit delete frei gibt. Somit hast du dir ein Speicherleck gebaut!

Darum auch das Unverständnis für ein new im Code von Nimelrian, stand heute werden Objekte dynamisch mit Smartpointer und std::make_pointerTyp erzeugt.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Werbeanzeige