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

04.12.2016, 21:19

[C++|SDL2] PNG-Grafik wird nicht angezeigt

Hallöchen :)

ich habe erst vor Kurzem mit SDL2 angefangen und hab damit noch so meine Schwierigkeiten. Nachdem ich aber jetzt endlich geschafft habe, die Bibliothek auch auf meinem Rechner zu Hause zum Laufen zu bringen, wollte ich das Ganze natürlich sofort testen. Alles, was ich wollte war, ein selbsterstelltes png-Bild einfügen und für 5 Sekunden in einem Fenster anzeigen lassen. Danach soll sich das Programm von alleine wieder schließen. An dem Uni-Rechner hat das auch ganz gut funktioniert, also habe ich mir den Code dort zum Beispiel genommen und in ähnlicher Form in meinem Mini-Programm verwendet. Jetzt habe ich folgendes Problem:

Das vorher festgelegte Fenster öffnet sich unter dem Namen, den ich ihm gegeben habe und bleibt für fünf Sekunden offen. Soweit also ganz gut. Die Grafik, die ich sehen wollte, wird aus irgendeinem Grund aber nicht angezeigt. Stattdessen sehe ich einen weißen Hintergrund. Nach endlosem Probieren und Googlen bin ich immer noch ratlos. Ich weiß auch ehrlich gesagt gar nicht, ob das mit dem Code als solches zusammenhängt oder ob ich schlichtweg zu blöd bin die Grafik an die richtige Stelle zu kopieren. Ich habe aber schon so ziemlich jeden Ordner ausprobiert und bisher hat noch nichts geholfen. Eigentlich gehört die Grafik, die ich laden will doch in das Verzeichnis, in dem sich auch die kompilierte .exe befindet, oder nicht?

Hier der Quelltext:

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
#include <iostream>
#include <string>
#include <stdlib.h>
#include <stdio.h>
#include <SDL.h>
#include <SDL_image.h>


int main(int argc, char* args[])
{

    SDL_Init(SDL_INIT_EVERYTHING);
    SDL_Init(SDL_INIT_VIDEO);

    SDL_Window *win = SDL_CreateWindow("Test", 100, 100, 900, 600, SDL_WINDOW_SHOWN);
    SDL_Surface *surf = SDL_GetWindowSurface(win);


    SDL_Init(IMG_INIT_PNG);

    
    SDL_Surface *hintergrund = IMG_Load("test.png");


    SDL_BlitSurface(hintergrund, NULL, surf, NULL);

    


    SDL_Delay(5000);


    return 0;

}


Ich benutze Visual Studio 2015, falls das wichtig ist.



Vielen Dank schonmal für die Hilfe und euch allen einen schönen Abend :)
Arriey

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

2

04.12.2016, 21:22

Hast du bereits SDL_GetError bzw. IMG_GetError probiert?

C-/C++-Quelltext

1
2
3
if(!hintergrund) {
    printf("IMG_Load: %s\n", IMG_GetError());
}
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

3

04.12.2016, 22:48

Versuch doch mal statt eines relativen Pfades einen absoluten zu verwenden ("c://dir//test.png").
Ansonsten, ist dein Bild auch wirklich ein PNG oder z.B. ein bmp, was lediglich als .png benannt wurde? Hatte da auch schonmal das ein oder andere Problem.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

05.12.2016, 07:07

Versuch doch mal statt eines relativen Pfades einen absoluten zu verwenden ("c://dir//test.png").
Du meinst entweder "c:/dir/test.png" oder "c:\\dir\\test.png". Forward-Slashes müssen nicht escaped werden und Forward-Slashes sind selbst auch kein Escape-Zeichen.
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]

5

05.12.2016, 19:53

Hallo Arriey,

du musst dein Fenster noch updaten:

C-/C++-Quelltext

1
2
3
4
5
SDL_BlitSurface(hintergrund, NULL, surf, NULL);

SDL_UpdateWindowSurface(win);

SDL_Delay(5000);


Wenn das nicht klappt probiers wirklich mit SDL_GetError, wird dir in Zukunft noch gute Dienste leisten ;)

P.S. bei deinem Quelltext reicht es wenn das Bild im selben Ordner ist.

6

07.12.2016, 22:02

Vielen, vielen Dank für die schnellen Antworten! :)
Mit dem Updaten hat es dann tatsächlich geklappt :) Danke! Manchmal sieht man einfach den Wald vor lauter Bäumen nicht^^ Und vielen Dank für den Tipp mit SDL_GetError. Das hab ich mir aufgeschrieben und werde mir das mal merken.
Ich hab aber noch eine Frage ganz Allgemein zu den png-Bildern. Ist die Dateigröße des Bildes egal oder gibt es da ein Limit? Das erste konnte ich nämlich laden, als ich dann ein anderes ausprobiert habe, wurde mir nur ein schwarzer Bildschirm angezeigt.

Vielen Dank nochmal und einen schönen Abend noch :)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

08.12.2016, 06:11

Die Dateigröße ist egal, evtl. nicht aber die Bildgröße (Breite und Höhe). War das Bild größer als das Fenster? Wenn ja, dann musst du evtl. die Parameter für die Blit-Funktion korrekt setzen.

8

08.12.2016, 21:21

Danke für den Hinweis mit den Maßen! Ich habe mir das nochmal angeguckt und festgestellt, dass das Bild tatsächlich viiiiiiel zu groß war. Nachdem ich das angepasst habe, hat es dann funktioniert. Dankeschön :)

Werbeanzeige