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

41

03.09.2010, 16:24

So hab grad nicht genug Zeit die Sprite-Klasse komplett umzuschreiben, d.h. hier paar Tipps:
- Fehlerbehandlung bzw. Ausgabe nicht in der Datenschicht! D.h. load sollte nen bool zurückgeben und kannst es dann auf entsp. Anwendungsebene verarbeiten!
- Lad mal nen nicht animiertes aber ruf die render-Funktion für nen animiertes Sprite auf.
- Generell hast du viele Funktionen die, wenn sie zu früh aufgerufen werden, undefiniertes Verhalten hervorrufen, da du den Variablen im c-tor keinen Std.-Wert zugewiesen hast!
- Du benutzt sog. Magic-Numbers. Wer soll wissen woher jetzt genau 25 kommt? (http://www.parashift.com/c++-faq-lite/newbie.html#faq-29.11)
- const und unsigned nutzen
- Guck dir "law of big three" an ;) (Hättest de jetzt weniger Probleme gehabt ...)
- Strings usw. per const-Ref. übergeben, spart kopiervorgang. Nur primitive Datentypen wie int etc. nicht (mir fällt grad der Name von den Dingern nicht ein ;))

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
#include <sstream>

void CGame::RenderStory(const unsigned int story) const // ref. bei einfachen datentypen sinnfrei, negative id? mehr als 256 storys? ;) 
{
    // load story text
    CSprite spriteIntroText; 
    LoadStory(story, spriteIntroText);
    spriteIntroText.SetColourKey(205, 179, 139); 

    float y_position(600.f);
    while (y_position > -1250.f) // Magic Number? 1247?
    {
        g_pFramework->Update();
        g_pFramework->Clear();

        // draw text
        spriteIntroText.SetPos(0.f, y_position);
        spriteIntroText.Render();

        g_pFramework->Flip();

        // move text down
        y_position -= 25 * g_pTimer->GetElapsed(); // Magic numbers? 25?

        // break on escape
        SDL_Event event;
        if (SDL_PollEvent(&event) && 
            (event.type == SDL_KEYDOWN) && 
            (event.key.keysym.sym == SDLK_ESCAPE))
            break;
    }
}

const bool CGame::LoadStory(const unsigned int story, CSprite& rhs) const
{
    std::ostringstream ss;
    ss << "Data/Emphasis/Story/Story_" << story << ".Emphasis";
    return rhs.load(ss.str());
}
kann sein das ein Fehler drin ist, hab's nicht getestet.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Deviloper« (03.09.2010, 16:29)


42

04.09.2010, 12:41

Guten Morgen!

Vielen Dank für deine Hilfe, Deviloper :)

Ich bin jetzt auch noch nicht dazu gekommen, die Sprite klasse umzuschreiben, habe aber die Game - Funktion geändert.
Habe sie zwei mal neu geschrieben - beim ersten mal habe ich aus irgend einem grund kein bild mehr gesehen.
Aber beim zweiten Versuch hat es dann funktioniert :D
Großes Dankeschön nocheinmal!

Hier der (derzeitige) geänderte code:

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
Game.cpp:

void CGame::RenderStory(const int ID_Story)
{
    //Story rendern
    bool bIntro = true; //Abbruchbedningung für das Intro
    float fYPos = 600.0f;

    //Sprites für den Text initialisieren
    CSprite SpriteIntro_Text; 
    LoadStory(ID_Story, SpriteIntro_Text); //Storry Datei laden
    //pSpriteIntro_Text -> Load("Data/Emphasis/Storry/Storry_2.Emphasis");
    SpriteIntro_Text.SetColourKey(205,179,139); 

    float fEndOfImage = SpriteIntro_Text.GetRect().h - 18.0f; //Automatische Abbruchbedingung für das rendern
    fEndOfImage *= -1; //Invertieren

    do
    {
        g_pFramework -> Update();
        g_pFramework -> Clear();

        //Text des Intros rendern
        //RenderText("Escape - Taste drücken",40,85,85,85,280,250);
        SpriteIntro_Text.SetPos(0.0f,fYPos);
        SpriteIntro_Text.Render();

        g_pFramework -> Flip();

        fYPos -= 25 * g_pTimer -> GetElapsed();

        //Abbruchbedingung
        SDL_Event Event;
        if(SDL_PollEvent(&Event) && (Event.type == SDL_KEYDOWN) && (Event.key.keysym.sym == SDLK_ESCAPE))
            bIntro = false;
    }while(bIntro && fYPos > fEndOfImage);
}

//Funktion zum Laden der Storry
void CGame::LoadStory(const int ID_Storry, CSprite &rhs)
{
    //Pfad ermitteln
    ostringstream ss;
    ss << "Data/Emphasis/Story/Story_" << ID_Storry << ".Emphasis";

    //Sprite laden
    rhs.Load(ss.str());
}


Liebe Grüße,
Ombalat