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

03.08.2014, 22:16

Kapitel 12 - Spiel in der SDL - Score anzeigen so richtig?

Hallo schon wieder eine Frage,

ich hab mir für das Spiel aus der SDL eine Grafik die Zahlen darstellt angelegt. Mit diesen lass ich mir oben links im Spiel den Score anzeigen.
Dabei hab ich ja wie ihr unten im Quelltext seht einen integer in einen string konvertiert. In diesem string gehe ich dann mit einem iterator alle Buchstaben ab und verzweige dann entsprechend auf die jeweilige Grafik.
Dieses verfahren funktioniert auch super ich wollte jetzt nur noch mal nachfragen ob es nicht zu umständlich ist und ob es einfachere Lösungen dafür gibt.
Hier der Quellcode

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

//Aufgabe: Jede einzelne Zahl des Scoreboard abchecken
void CGame::LogikScoreboard()
{
    int counter = 0;

    //Score in einen string konvertieren
    ostringstream Str;

    Str << Score;
    string ScoreString(Str.str());
    string::iterator It;

    for (It = ScoreString.begin(); It < ScoreString.end(); It++)
    {
        RenderScoreboard(It, static_cast<float> (counter));
        counter++;
    }

} //LogikScoreboard


//RenderScoreboard

//Aufgabe: Die Zahlen des Scoreboards Ausgeben
void CGame::RenderScoreboard(string::iterator It, float fcounter)
{
    switch (*It)
    {
        //Zahl gleich 0
    case ('0'):
    {
                  m_pSpriteNumbers->SetPos(0 + m_pSpriteNumbers->GetFrameRect().w * fcounter + 5, 5);
                  m_pSpriteNumbers->Render(0);
    } break;

        //Zahl gleich 1
    case ('1') :
    {
                   m_pSpriteNumbers->SetPos(0 + m_pSpriteNumbers->GetFrameRect().w * fcounter + 5, 5);
                   m_pSpriteNumbers->Render(1);
    } break;

        //Zahl gleich 2
    case ('2') :
    {
                   m_pSpriteNumbers->SetPos(0 + m_pSpriteNumbers->GetFrameRect().w * fcounter + 5, 5);
                   m_pSpriteNumbers->Render(2);
    } break;

        //Zahl gleich 3
    case ('3') :
    {
                   m_pSpriteNumbers->SetPos(0 + m_pSpriteNumbers->GetFrameRect().w * fcounter + 5, 5);
                   m_pSpriteNumbers->Render(3);
    } break;

        //Zahl gleich 4
    case ('4') :
    {
                   m_pSpriteNumbers->SetPos(0 + m_pSpriteNumbers->GetFrameRect().w * fcounter + 5, 5);
                   m_pSpriteNumbers->Render(4);
    } break;

        //Zahl gleich 5
    case ('5') :
    {
                   m_pSpriteNumbers->SetPos(0 + m_pSpriteNumbers->GetFrameRect().w * fcounter + 5, 5);
                   m_pSpriteNumbers->Render(5);
    } break;

        //Zahl gleich 6
    case ('6') :
    {
                   m_pSpriteNumbers->SetPos(0 + m_pSpriteNumbers->GetFrameRect().w * fcounter + 5, 5);
                   m_pSpriteNumbers->Render(6);
    } break;

        //Zahl gleich 7
    case ('7') :
    {
                   m_pSpriteNumbers->SetPos(0 + m_pSpriteNumbers->GetFrameRect().w * fcounter + 5, 5);
                   m_pSpriteNumbers->Render(7);
    } break;

        //Zahl gleich 8
    case ('8') :
    {
                   m_pSpriteNumbers->SetPos(0 + m_pSpriteNumbers->GetFrameRect().w * fcounter + 5, 5);
                   m_pSpriteNumbers->Render(8);
    } break;

        //Zahl gleich 9
    case ('9') :
    {
                   m_pSpriteNumbers->SetPos(0 + m_pSpriteNumbers->GetFrameRect().w * fcounter + 5, 5);
                   m_pSpriteNumbers->Render(9);
    } break;

    }

} //RenderScoreboard


Danke fürs durchlesen ich hoffe auf antwort. ;)

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

2

03.08.2014, 22:24

Ja, benutz die SDL_TTF. ;)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

3

03.08.2014, 22:31

:fie: :fie: Und ich mach mir die Mühe und Mahl auch noch extra Grafiken für die Zahlen. :dash:

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

4

03.08.2014, 22:35

:D Dafür hast du bestimmt was dazu gelernt. :)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

5

03.08.2014, 22:38

Ja da geb ich dir recht erst nach Lösungen im Internet suchen und dann sich irgendwas ausdenken :dash:

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

04.08.2014, 07:10

Du kannst das ruhig mit Bildern machen, da kannst Du Text komplett anders stylen als TTF es Dir je erlauben wird (siehe den Text in meinen Projekten - in meiner Signatur verlinkt). Aber statt dem Switch wäre es clever gewesen die Charakters in einen int umzuwandeln und damit direkt den Index abzufragen. Auch ist ein float da wohl eher die falsche Datentyp-Wahl für "counter". Zudem er in der Funktion darüber auch noch ein int ist und dann erst unnötiger Weise zu einem float wird.
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]

7

04.08.2014, 20:44

Danke für den Tipp, wollt ich eh noch fragen ob man seinen eigenen Text in die Funktion einbinden kann.

Zu dem counter den ich in nen float caste geb ich dir recht das es etwas unangebracht war, nur die Weite meines Sprites wird ja auch in float angegeben wodurch ich ohne casten mit 1000 Warnungen zugespamt werde. Ich hab es aber vorgezogen nicht jedes mal die Weite in einen integer zu casten sondern lieber einmal den int in einen float zu casten.

Ich hoffe du verstehst was ich meine. :S

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

04.08.2014, 21:04

Trotzdem unschön. Dann erstell lieber eine lokale Variable innerhalb der Funktion und caste dort nur einmal. Wenn jemand 1.7234f übergibt, hast Du sonst ein dickes Problem.
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]

9

05.08.2014, 20:39

Wie will jemand 1.7234f übergeben ?(

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

05.08.2014, 21:21

So?
RenderScoreboard(It, 1.7234f); Wenn nur ein int als Parameter Sinn macht, dann sollte der Parameter auch ein int sein. Da über Faulheit beim Tippen zu reden, weil man mehr casts schreiben muss (muss man übrigens nicht, man kann den Parameter theoretisch ja auch lokal in einen float rein schieben), ist die ganz falsche Ausrede.
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]

Werbeanzeige