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

Oliver-Ginster

unregistriert

1

21.10.2010, 18:52

SDL IMG_Load Fehler

Mein Problem ist, dass mein Bild zwar im ersten durchgang der CGame::Run while Schleife geladen und auch angezeigt wird
aber danach schlägt das laden der Grafik fehl... :?:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef LOGO_HPP
#define LOGO_HPP

#include <SDL_image.h>

class CLogo
{
public:
CLogo ();
~CLogo ();
void SetTargetImage(int XPos, int YPos);
SDL_Rect GetTargetImage() {return (m_grTargetImage);}; 
SDL_Rect GetPictureImage () {return (m_grPictureImage);};
SDL_Surface *GetImage () {return (m_pImage);};
private:
SDL_Surface *m_pImage;
SDL_Rect m_grPictureImage;
SDL_Rect m_grTargetImage;
};

#endif

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
#include "Logo.hpp"

CLogo::CLogo () :
m_pImage (IMG_Load("picture/logo.jpg"))
{
if(m_pImage == NULL)
{exit (2);}
m_grPictureImage.x = 0;
m_grPictureImage.y = 0;
m_grPictureImage.w = m_pImage->w;
m_grPictureImage.h = m_pImage->h;
}

CLogo::~CLogo ()
{
SDL_FreeSurface(m_pImage);
}

void CLogo::SetTargetImage(int XPos, int YPos)
{
m_grTargetImage.x = XPos;
m_grTargetImage.y = YPos;
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
... //CFramework.cpp ausschnit
void CFramework::Render ()
{
boost::shared_ptr<CLogo> Logo(new CLogo);
Logo->SetTargetImage(10, 20);
SDL_BlitSurface(Logo->GetImage (), 0, m_pScreen, 0); 
}
...


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
... // CGame.cpp ausschnit
void CGame::Run ()
{
while (m_bGameRun == true)
{
ProcessEvents ();
g_pFramework->Update ();
g_pFramework->Clear ();
g_pFramework->Render ();
g_pFramework->Flip ();
}
}
...

_______________________________________________________________________
...
Der Thread 'Win32-Thread' (0xdbc) hat mit Code 2 (0x2) geendet.
Der Thread 'Win32-Thread' (0x1290) hat mit Code 2 (0x2) geendet.
Der Thread 'Win32-Thread' (0xfe0) hat mit Code 2 (0x2) geendet.
Der Thread 'Win32-Thread' (0x68c) hat mit Code 2 (0x2) geendet.
Der Thread 'Win32-Thread' (0x620) hat mit Code 2 (0x2) geendet.
Das Programm "[684] Next 0.1.exe: Systemeigen" wurde mit Code 2 (0x2) beendet.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

21.10.2010, 22:54

[...] aber danach schlägt das laden der Grafik fehl...

Was bedeutet das genau?

Oliver-Ginster

unregistriert

3

21.10.2010, 23:10

Wenn ich das Programm starte sehe ich kurz das Fenster mit dem Bild.
Dann verschwindet es sofort wieder, weil das Programm mit "Code 2" beendet wurde.
Das passiert bei der Prüfung ob das Bild geladen werden konnte:

C-/C++-Quelltext

1
2
if(m_pImage == NULL)
{exit (2);}

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

21.10.2010, 23:26

Ok also schlägt offensichtlich das Laden des Bildes fehl!? Schonmal debugged um dem Fehler auf die Schliche zu kommen? Was tut IMG_Load() genau? Der Standardfehler ist hier dass das Programm einfach die Datei nicht finden kann weil es im falschen Verzeichnis ausgeführt wird...

Btw: Von exit() sollte man C++ die Finger lassen.

Oliver-Ginster

unregistriert

5

22.10.2010, 00:19

"Standardfehler ist hier dass das Programm einfach die Datei nicht
finden kann weil es im falschen Verzeichnis ausgeführt wird..."

Das dachte ich auch zwischendurch aber das Bild wird ja kurz angezeigt...
Wenn ich mein Programm im Einzelschrittmodus debugge bleibt er unverständlicherweise
nicht an der IMG_Load Funktion hängen sondern schickt mich hier hin:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "Framework.hpp"
#include "Game.hpp"

#ifdef _WIN32
#undef main
#endif

int main(int argc, char *argv[])
{                           // <-hier soll dann irgendein Fehler sein...
    if (g_pFramework->Init (500,400,"SDL Beispiel","Test") == false)
    return (0);

    CGame Game;
    Game.Run ();

    return (0);
}


Was ich aber nicht nachvollziehen kann...
Denn wenn ich g_pFramework->Render (); zum Kommentar mache ( in void CGame::Run ())
funktioniert das Programm fehler frei.

Gut, ich werde das exit() gleich mal durch ein return ersetzen....

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

22.10.2010, 00:33

Einzelschrittmodus bedeutet genau das, nämlich dass dein Programm schrittweise durchdebugged wird. Logischerweise beginnt man da am Anfang des Programms. Mit Fehler hat das nichts zu tun, oder kommt dahingehend irgendeine Meldung des Debuggers?!

Du erzeugst offenbar bei jedem Aufruf von Render() ein neues CLogo und löscht das danach gleich wieder. Hat das irgendeinen speziellen Grund!?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (22.10.2010, 00:42)


Oliver-Ginster

unregistriert

7

22.10.2010, 01:45

In diesem Programm ist das eigendlich nicht notwendig.
Ich versuche mir nur gerade ein Grundgerüst in der SDL aufzubauen und wollte nebenbei
noch den shared_ptr ausprobieren um mich mit smarten pointern vertraut zu machen...

Ich habe jetzt dank Einzelschritmodus mir mein Programmverlauf genauer angeschaut.
Das erste mal durchlaufen der While Schleife fuktioniert problemlos. Könnte es sein,
dass in der zweiten Runde die Memberinitialisierungsliste des Konstruktors
CLogo () nicht nochmal aufgerufen wird?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

22.10.2010, 01:52

Was du tust ist ein Bild laden, es zeichnen und dann gleich wieder löschen nur damit dus im nächsten Frame wieder laden kannst. Ineffizienter gehts eigentlich kaum. Das ist nicht nur in diesem Programm nicht notwendig, niemand wird sowas jemals ernsthaft machen ;)
shared_ptr ist in diesem Fall die falsche Wahl da dein CLogo Objekt doch mit nichts geshared wird!? Ich würde hier einen boost::scoped_ptr oder höchstens std::auto_ptr verwenden.
Der Konstruktor wird garantiert in jedem Durchlauf einmal aufgerufen da ja in jedem Durchlauf ein neues Objekt erzeugt wird.

Oliver-Ginster

unregistriert

9

23.10.2010, 20:16

Ich danke dir für deine hilfe.
Ich habe gerade keine Zeit aber werde die Tage nochmal schauen ob ich es hinbekomme...

Werbeanzeige