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

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

1

30.06.2015, 16:56

[C++ | SFML] Problem mit der Textdarstellung

Hallo Leute,

ich habe ein Spiel in der SFML programmiert. Wenn das Spiel zu Ende ist, dann soll ein Text ausgegben werden ("Game Over!"). Aber dieser wird nicht dargestellt. Was habe ich falsch gemacht? Hier der Codeausschnitt:

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
// ...

// GameOver
//
// Aufgabe: Nachdem das Spiel vorbei ist, wird Text dargrestellt
//
void CGame::GameOver (sf::RenderWindow &window)
{
    GameOver_String = "Game Over!";

    font.loadFromFile ("Data/arial.ttf");

    GameOver_Text.setFont (font);
    GameOver_Text.setColor (sf::Color (255, 0, 0));  // Farbe: Rot
    GameOver_Text.setPosition (00.f, 200.f);        // Position bestimmen
    GameOver_Text.setString(GameOver_sstream.str());
    GameOver_sstream.str ("");
    GameOver_sstream << GameOver_String;

    window.draw (GameOver_Text);

} // GameOver

// ....


PS: Ich verwende den string-stream, weil ich später noch etwas hinzufügen werden.

Vielen Dank im Voraus!

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

30.06.2015, 17:12

1) Der Text wird vermutlich nie gesetzt und damit hat "GameOver_Text" immer einen leeren String als Inhalt. Zeile 18 und 16 zu tauschen dürfte schon mal helfen.
2) Du solltest den Font nur einmal laden, nicht bei jedem Aufruf der Funktion. Du solltest Initialisierung von Elementen und Zeichen-Operationen dringend trennen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

30.06.2015, 18:16

Schau dir das hier: http://www.sfml-dev.org/tutorials/2.3/graphics-text.php mal an. Ansonsten kleiner Tipp: Die Farbe rot kann man auch einfacher bekommen:

C-/C++-Quelltext

1
 GameOver_Text.setColor (sf::Color::Red); // Rot mit Red --> musst nicht in RGB umdenken
SCHWEIGEN IST SILBER, REDEN IST GOLD :D

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

4

30.06.2015, 19:05

Danke für die Antworten. Ich habe es so abgeändert, aber es funktioniert immernoch nicht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
    GameOver_String = "Game Over!";

    GameOver_Text.setFont (font);
    GameOver_Text.setColor (sf::Color::Red);
    GameOver_Text.setPosition (800.f, 200.f);   // Position bestimmen
    GameOver_Text.setScale (0.9f, 0.85f);
    GameOver_sstream << GameOver_String;
    GameOver_Text.setString(GameOver_sstream.str());
    GameOver_sstream.str ("");

    window.draw (GameOver_Text);


Um den Font zu laden, habe ich es vor der Schleife "while (window.isOpen()) {...}" gepackt.

Lares

1x Contest-Sieger

  • Private Nachricht senden

5

30.06.2015, 19:15

Hast du geprüft ob der Font wirkich geladen wurde? Hat dein Windowsfenster eine größere Auflösung als 800x200? Und benutz für den Anfang statt setScale lieber
text.setCharacterSize(24);
setScale() beeinflusst meine ich die Gesamttransformation des Textobjekts, aber nicht die eigentliche Fontgröße (also wie viele Pixel pro Buchstabe verwendet werden).

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

6

30.06.2015, 19:26

Ja, der Font wurde geladen, da es hier keine Fehlermeldung gab:

C-/C++-Quelltext

1
2
3
4
// Ein Font für die Schrift
//
if (!font.loadFromFile ("Data/arial.ttf"))  // Schrifart laden
    cout << "Schriftart konnte nicht geladen werden" << endl;


Meine Fenster hat folgende Auflösung:

C-/C++-Quelltext

1
sf::RenderWindow window (VideoMode(1360, 768), "Ping-Pong");


Danke für den Tipp mit ".setCharacterSize(24)"

ERROR

Alter Hase

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

7

30.06.2015, 20:07

Du rufst nach window.draw (GameOver_Text); noch window.clear() vor window.display() auf?

EDIT: sicher, dass die Variable font zu dem Zeitpunkt noch gültig ist?

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

8

30.06.2015, 20:11

Du rufst nach window.draw (GameOver_Text); noch window.clear() vor window.display() auf?


Meinst du so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void CGame::GameOver (sf::RenderWindow &window)
{
    GameOver_String = "Game Over!";

    GameOver_Text.setFont (font);
    GameOver_Text.setColor (sf::Color::Red);
    GameOver_Text.setPosition (800.f, 300.f);   // Position bestimmen
    GameOver_Text.setCharacterSize (24);        // Textgröße bestimmen
    GameOver_sstream << GameOver_String;
    GameOver_Text.setString(GameOver_sstream.str());
    GameOver_sstream.str ("");

    window.draw (GameOver_Text);
    window.clear ();
    window.display ();

} // GameOver


Oder anders?

ERROR

Alter Hase

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

9

30.06.2015, 20:16

Ähm nein, das sollst du ja eben nicht machen :D

Also irgendwo in deinem Code ist ja der "Bereich", in dem gezeichnet wird. Davor sollte window.clear(); und danach window.display(); stehen. irgendwo zwischen diesen beiden Anweisungen muss noch eine Schrift gezeichnet werden, das müsstest du ja eigentlich wissen. Da die Schrift in einer Funktion gezeichnet wird, dachte ich mir, dass du vielleicht die Funktion vor dem clear() aufrufst und sie so auch "gecleared" wird. Das wäre ja eher schlecht ;)

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

10

30.06.2015, 20:24

Mh... Also ich habe jetzt den Text zwischen "window.clear (sf::Color::Red));" und "window.display();" darstellen lassen ("window.draw (GameOver_Text"), aber es klappt immernoch nicht. Ich lege mal den COde in den Anhang.
PS: Sorry, dass es in einer Datei über 600 Zeilen sind. Ich hoffe, dass ich genug kommentiert habe, dass ihr euch zurecht findet.
»cojo2015« hat folgende Dateien angehängt:
  • CGame.hpp (1,45 kB - 62 mal heruntergeladen - zuletzt: 23.03.2024, 11:01)
  • CGame.cpp (17,31 kB - 65 mal heruntergeladen - zuletzt: 14.04.2024, 18:53)
  • Main.cpp (1,09 kB - 53 mal heruntergeladen - zuletzt: 16.03.2024, 01:27)

Werbeanzeige