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

17.05.2013, 22:31

[C++ & SFML 2.0] Problem beim Background-Rendern

Moin!
Entschuldigt bitte meine erneute Frage.... :S.
Ich habe ein kleines Problem mit der SFML, genauer beim Rendern des Backgrounds meines Tic-Tac-Toes. Der Compiler/Linker liefert keine Fehlermeldung, aber das Spiel stürzt immer beim Rendern des Backgrounds mit der (wahrscheinlich allseits bekannten) Meldung "Tic-Tac-Toe.exe funktioniert nicht mehr" ab.
Hier einmal die betreffenden Code-Ausschnitte [Unwichtiges herausgekürzt (z.B. Logausgabe...)]:
(I) Der main-loop:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
while (m_pFramework->GetMainWindow ()->isOpen () && m_Winner == 0)
    {
        m_pFramework->ClearMainScreen ();

        RenderBackground ();
        ProcessEvents ();       
        CheckWinner ();

        m_pFramework->Flip ();
    }

(II) Die Funktion "RenderBackground" (bzw. der betreffende Ausschnitt):

C-/C++-Quelltext

1
2
3
4
void CGame::RenderBackground ()
{
    m_pFramework->GetMainWindow ()->draw (m_Background);   // Mit Hilfe des Debuggers habe ich herausgefunden, dass der Fehler in dieser Zeile passiert
}

(III) Der Background wurde vorher in der Funktion "InitBackground" initialisiert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
bool CGame::InitBackground ()
{
    if (!m_BackgroundTex.loadFromFile ("Data/Background.png"))
        return false;

    m_BackgroundTex.setSmooth (true);
    m_Background.setTexture (m_BackgroundTex);

    return true;
}

(IV) Die Funktion "GetMainWindow":

C-/C++-Quelltext

1
2
3
4
sf::RenderWindow* CFramework::GetMainWindow () 
{
      return &m_MainWindow;
}


Beim Debuggen wird mir die Fehlermeldung "Unbehandelte Ausnahme bei 0x0031F72C in Tic-Tac-Toe_Console.exe: 0xC0000005: Zugriffsverletzung beim Ausführen an Position 0x0031F72C" ausgegeben.

Ich hoffe, ihr könnt mir helfen, diesen Fehler/das Problem zu lösen :)...
Gruß
Feuerente

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

17.05.2013, 23:44

Beim Debuggen wird mir die Fehlermeldung "Unbehandelte Ausnahme bei 0x0031F72C in Tic-Tac-Toe_Console.exe: 0xC0000005: Zugriffsverletzung beim Ausführen an Position 0x0031F72C" ausgegeben.

Und dann? Wo bleibt der Debugger stehen, wo tritt der Fehler auf?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

18.05.2013, 06:32

Kleiner Tipp: Gewöhn Dir diesen "boolean als Fehlercode"-Quatsch gar nicht erst an. Rückgabewerte sind Rückgabewerte. Für Fehler gibt es Exceptions.
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]

4

18.05.2013, 12:48

Moin!
Erst einmal danke für eure Antworten.
Beim Debuggen wird mir die Fehlermeldung "Unbehandelte Ausnahme bei 0x0031F72C in Tic-Tac-Toe_Console.exe: 0xC0000005: Zugriffsverletzung beim Ausführen an Position 0x0031F72C" ausgegeben.

Und dann? Wo bleibt der Debugger stehen, wo tritt der Fehler auf?

Der Fehler tritt - wie im Quellcode auch kommentiert - in der Zeile
m_pFramework->GetMainWindow ()->draw (m_Background); // Fehler passiert in dieser Zeile
auf. Die Adresse des Hauptfensters wird noch zurückgegeben (bzw. die Funktion GetMainWindow ordnungsgemäß ausgeführt), der Fehler tritt also wahrscheinlich im draw()-Teil auf.

@BlueCobold: Danke für den Tipp, dann werde ich meinen Code mal überarbeiten...

Gruß
Feuerente

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Feuerente« (18.05.2013, 12:54)


5

19.05.2013, 00:29

Existiert deine m_BackgroundTex noch, wenn du

C-/C++-Quelltext

1
m_pFramework->GetMainWindow ()->draw (m_Background);

aufrufst?

Sprites behalten nur eine Referenz zu ihrer Textur.

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

6

19.05.2013, 01:11

Ich denke der Variablenname m_BackgroundTex sagt schon aus, dass es eine Membervariable ist. Deshalb denke ich, dass sie nicht zerstört wurde.

7

19.05.2013, 10:13

Richtig. m_BackgroundTex ist genauso ein Member von CGame wie m_Background, sollte also noch existieren.

Nimelrian

Alter Hase

Beiträge: 1 216

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

  • Private Nachricht senden

8

19.05.2013, 11:37

Rufst du die InitBackground-Funktion denn überhaupt irgendwo auf?
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

9

19.05.2013, 19:30

Ja, InitBackground () wird im Konstruktor von CGame aufgerufen.

Gruß

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

10

20.05.2013, 16:06

Und da wird auch abgefragt ob es geklappt hat? Ob die Textur also wirklich geladen wurde? So ein Fehler hört sich nämlich sehr stark nach nicht geladener Textur an.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige