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

Bügeleisen

Frischling

  • »Bügeleisen« ist der Autor dieses Themas

Beiträge: 11

Wohnort: Köln

Beruf: Schüler

  • Private Nachricht senden

1

13.03.2011, 14:26

GELÖST - [SFML] Text zentrieren -> Text wird nicht angezeigt. - GELÖST

Hallo liebe Community,

Ich will ein kleines Spiel mit der SFML programmieren und habe nun angefangen eine kleine Klasse zu programmieren.
Um die Klasse zu testen habe ich eine 2. Testklasse. Erstmal will ich nur einen Text zentriert in meinem Fenster darstellen, doch irgendwie sehe ich keinen Text! Ich denke, dass ich irgendeinen dummen Fehler gemacht habe, den ich nicht erkenne.
Ich hoffe aber, dass ihr mir helfen könnt.

Hier ist meine Klasse "MainWindow":

Header:

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
#pragma once

#include <SFML\Graphics.hpp>
#include <string>

enum TextAlign
{
    CENTER = 1,
    LEFT,
    RIGHT,
};

class MainWindow
{
protected:
    sf::RenderWindow *app;

public:
    //Ein Fenster erstellen
    MainWindow(int w, int h, int bpx, std::string const& title);

    //Main-Loop des Programms
    virtual void mainLoop() = 0;

    //Text im Fenster ausrichten
    sf::String alignText(std::string const& text, int align, int top = 0, int margin = 0);
};


Implementierung/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
#include "MainWindow.h"

MainWindow::MainWindow(int w, int h, int bpx, const std::string &title)
{
    app = new sf::RenderWindow(sf::VideoMode(w, h, bpx), title);
}

sf::String MainWindow::alignText(std::string const& text, int align, int top, int margin)
{
    sf::String txt(text);
    int txtWidth = static_cast<int>(txt.GetRect().GetWidth());

    switch(align)
    {
    case CENTER:
        {
            int x = (app->GetWidth() - txtWidth) / 2 + margin;
            txt.Move(x, top);
        }
    case LEFT:
        {
            txt.Move(margin, top);
        }
    case RIGHT:
        {
            int x = app->GetWidth() - txtWidth - margin;
            txt.Move(x, top);
        }
    default:
        {
            txt.Move(margin, top);
        }
    }

    return txt;
}


Meine Testklasse sieht so aus:

Header:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#pragma once
#include "MainWindow.h"

class TestApp : public MainWindow
{
public:
    TestApp(int w, int h, int bpx, std::string const& title) :
      MainWindow(w, h, bpx, title)
    {
        mainLoop();
    };

    void mainLoop();
};


Implementierung/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
#include "TestApp.h"

void TestApp::mainLoop()
{
    while(app->IsOpened())
    {
        sf::Event ev;
        while(app->GetEvent(ev))
        {
            switch(ev.Type)
            {
            case sf::Event::Closed:
                app->Close();
            }
        }

        sf::String str = alignText("Hallo, Welt!", CENTER, 10);
        str.SetColor(sf::Color(128, 128, 0));

        app->Clear(sf::Color(255, 255, 255));
        app->Draw(str);
        app->Display();
    }
}


Und dann natürlich meine "main.cpp", also das "Programm" oder wie man es auch nennen mag:

C-/C++-Quelltext

1
2
3
4
5
6
#include "TestApp.h"

int main()
{
    TestApp test(640, 480, 32, "Hallo, Welt!");
}


Hoffentlich könnt ihr mir helfen:
Wie bereits gesagt, sehe ich keinen Text, jedoch mein Fenster!

Mit freundlichen Grüßen
Bügeleisen

PS: Ich nehme auch gerne Tipps zum Codedesign und Co. entgegen :)
Das bügeln wir schon aus :thumbsup:

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Bügeleisen« (13.03.2011, 15:18)


NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

2

13.03.2011, 14:37

welche sfml version?
bei 1.6 müsste nen fehler kommen, da musst du den font selbst laden.
in MainWindow wird app nicht wieder freigegeben.
MainWindow ist eine abstrakte klasse -> virtueller destruktor ist pflicht.(kriegst du keine warnung? Oo)
den string würde ich ausserhalb der schleife erstellen.
verwende SetPosition anstelle von Move.
starte nie eine "endlosschleife" im konstruktor.
schau dir mal die position des strings im debuger an. ich find keinen fehler der der das verursachen könnte
"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?

Bügeleisen

Frischling

  • »Bügeleisen« ist der Autor dieses Themas

Beiträge: 11

Wohnort: Köln

Beruf: Schüler

  • Private Nachricht senden

3

13.03.2011, 14:44

Hi
vielen dank. Ich programmiere noch nicht lange mit C++ und da sind solche Tipps wirklich wichtig für mich. (Da ich schon etwas Programmieren kann (Delphi), arbeite ich hier zu Hause mit dem Stroustrup, was C++ allgemein angeht. Habe aber noch viele Kapitel vor mir. Vor allem OOP in C++ habe ich nur in kurzen Tutorials aus dem Internet behandelt)

Ich verwende SFML 1.6 und Visual C++ 2008 Express. Nach den Fehler-/Warnmeldungen gucke ich mal.

MFG
Bügeleisen
Das bügeln wir schon aus :thumbsup:

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

4

13.03.2011, 14:47

Ich verwende SFML 1.6 und Visual C++ 2008 Express.

jup, dann funktioniert sf::Font::GetDefaultFont() nicht.
besorg dir ein font und lad es wie ein image. hier ist auch ne anleitung.
"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?

Bügeleisen

Frischling

  • »Bügeleisen« ist der Autor dieses Themas

Beiträge: 11

Wohnort: Köln

Beruf: Schüler

  • Private Nachricht senden

5

13.03.2011, 14:55

Joa - danke.

Ich habe meine Klasse "MainWindow" jetzt um einen virtuellen Destruktor ergänzt, damit "app" freigegeben wird.

Außerdem habe ich meine "alignText"-Funktion so umgeändert:

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
sf::String MainWindow::alignText(std::string const& text, int align, float top, float margin)
{
    sf::String txt(text);
    float txtWidth = txt.GetRect().GetWidth();

    switch(align)
    {
    case CENTER:
        {
            float x = (app->GetWidth() - txtWidth) / 2 + margin;
            txt.SetPosition(x, top);
        }
    case LEFT:
        {
            txt.SetPosition(margin, top);
        }
    case RIGHT:
        {
            float x = app->GetWidth() - txtWidth - margin;
            txt.SetPosition(x, top);
        }
    default:
        {
            txt.SetPosition(margin, top);
        }
    }

    return txt;
}


Man gucke auf die floats, aber viel mehr auf die SetPosition's. Jetzt wird der Text endlich angezeigt. Zwar nicht zentriert, aber immerhin angezeigt.
Das bügeln wir schon aus :thumbsup:

Bügeleisen

Frischling

  • »Bügeleisen« ist der Autor dieses Themas

Beiträge: 11

Wohnort: Köln

Beruf: Schüler

  • Private Nachricht senden

6

13.03.2011, 15:00

Laut Debugger springt das Programm zur default-Marke.
Deswegen wird der Text auch nicht zentriert!
Das bügeln wir schon aus :thumbsup:

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

7

13.03.2011, 15:01

Ich habe meine Klasse "MainWindow" jetzt um einen virtuellen Destruktor ergänzt, damit "app" freigegeben wird.

der virtuelle destruktor wäre auch nötig wenn du nichts zum freigeben hättest. der müsste dann leer sein.

C-/C++-Quelltext

1
virtual ~MainWindow(){}

sobald eine klasse auch nur eine virtuelle methode hat sollte sie einen virtuellen destruktor haben. meistens gibt man den speicher ja über einen zeiger auf die basisklasse wieder frei.

ein weiterer vorschlag:

C-/C++-Quelltext

1
2
3
4
5
6
7
enum TextAlign
{
ALIGNDEFAULT
    ALIGNCENTER,
    ALIGNLEFT,
    ALIGNRIGHT,
};

C-/C++-Quelltext

1
sf::String alignText(std::string const& text, TextAlign align, int top = 0, int margin = 0);

so können erst keine falschen werte übergeben werden.
"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?

Bügeleisen

Frischling

  • »Bügeleisen« ist der Autor dieses Themas

Beiträge: 11

Wohnort: Köln

Beruf: Schüler

  • Private Nachricht senden

8

13.03.2011, 15:04

Ok. Danke für die Tipps - ich will mehr :D

Ich habe gerade gesehen, dass ich schlampig debuggt habe.
Es darf doch eigentlich nicht richtig sein, dass der Debugger an jedem Haltepunkt, den ich bei jedem SetPosition gesetzt habe, stehen bleibt. Oder?
Das bügeln wir schon aus :thumbsup:

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

9

13.03.2011, 15:06

Es darf doch eigentlich nicht richtig sein, dass der Debugger an jedem Haltepunkt, den ich bei jedem SetPosition gesetzt habe, stehen bleibt. Oder?

achja... wenn man selbst tippt denkt man dran.
versuchs mal damit:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
switch(align)
    {
    case CENTER:
        {
            float x = (app->GetWidth() - txtWidth) / 2 + margin;
            txt.SetPosition(x, top);
        }break;
    case LEFT:
        {
            txt.SetPosition(margin, top);
        }break;
    case RIGHT:
        {
            float x = app->GetWidth() - txtWidth - margin;
            txt.SetPosition(x, top);
        }break;
    default:
        {
            txt.SetPosition(margin, top);
        }break;
    }


wenn das break nicht da steht macht er einfach weiter.
"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?

Bügeleisen

Frischling

  • »Bügeleisen« ist der Autor dieses Themas

Beiträge: 11

Wohnort: Köln

Beruf: Schüler

  • Private Nachricht senden

10

13.03.2011, 15:17

Och nääh - an den breaks hat es gelegen.
Danke - da hätte ich auch selber drauf kommen können.
Danke sehr.

Problem gelöst.
Das bügeln wir schon aus :thumbsup:

Werbeanzeige