SDL-Funktion zum Laden von PNGs


9

Ich lerne gerade SDL 2.0 und habe diese Methode zum Laden von BMPs gesehen:

SDL_Texture* LoadImage(std::string file)
{
    SDL_Surface *loadedImage = nullptr;
    SDL_Texture *texture = nullptr;
    loadedImage = SDL_LoadBMP(file.c_str());

    if (loadedImage != nullptr)
    {
        texture = SDL_CreateTextureFromSurface(renderer, loadedImage);
        SDL_FreeSurface(loadedImage);
    } 
    else
        std::cout << SDL_GetError() << std::endl;
        return texture;
}

Wie könnte ich es hochschalten, um PNG-Dateien zu laden?

EDIT: Woops, habe vergessen, meine Methode zum Laden von PNGs hinzuzufügen.

SDL_Texture* grass_image = nullptr;
grass_image = IMG_LoadTexture(renderer, "res/grass.bmp");
SDL_Rect grass_rect;
    grass_rect.x = 0;
    grass_rect.y = 0;
    grass_rect.w = SCREEN_WIDTH;
    grass_rect.h = SCREEN_HEIGHT;

if (grass_image == NULL)
    std::cout << "Couldn't load grass_image" << std::endl;

while (!quit && mainEvent -> type != SDL_Quit)
{
    SDL_RenderCopy(renderer, grass_image, NULL, &grass_rect);
}

Ich möchte das einfach nicht für JEDES Bild tun müssen. Wie könnte ich das in eine Funktion umsetzen?

Vielen Dank!


Wenn die Bibliothek nicht über einen eigenen PNG-Loader verfügt, müssen Sie entweder einen eigenen schreiben oder eine Bibliothek eines Drittanbieters zum Laden verwenden. Meine Lektüre zeigt mir, dass SDL bereits png, libsdl.org/projects/SDL_image
Evan

Oh, tut mir leid, ich habe vergessen, die Methode hinzuzufügen, die ich bereits zum Laden von PNGs verwende, aber sie ist nicht in einer Funktion enthalten. Ich suche nur nach einer Abkürzung, damit ich dies nicht für jedes einzelne Bild tun muss (siehe Hauptbeitrag).
Connor W

Fragen Sie sich ernsthaft, wie man eine Funktion in C ++ schreibt?
Trevor Powell

Antworten:


11

Sie sollten die SDL_Image-API verwenden. Sie verfügt über eine einfache Funktion, die alles lädt:

SDL_Surface *IMG_Load(const char *file);

Genauer gesagt werden ICO- (Symbol) / CUR- (Cursor) / BMP-, PNM- (PPM / PGM / PBM), XPM-, LBM- (IFF ILBM), PCX-, GIF-, JPEG-, PNG-, TGA-, TIFF- und XV-Miniaturbildformate geladen .

Es hat auch individuelle Formatfunktionen wie IMG_isPNGund IMG_LoadPNG_RW.

Diese Bibliothek ist eine der am häufigsten verwendeten zum Laden von Bilddateien mit SDL, denke ich.

Website und Dokumentation


Eine Alternative ist die Verwendung von stb_image.h
Gustavo Maciel

4

Um PNG-Dateien mit SDL laden zu können, benötigen Sie die Bibliothekserweiterung SDL_Image.

http://www.libsdl.org/projects/SDL_image

Eine Beschreibung dieser Bibliothekserweiterung:

"SDL_image ist eine Bibliothek zum Laden von Bilddateien. Sie lädt Bilder als SDL-Oberflächen und unterstützt die folgenden Formate: BMP, GIF, JPEG, LBM, PCX, PNG, PNM, TGA, TIFF, WEBP, XCF, XPM, XV."


YEah, sorry, habe gerade den Hauptbeitrag aktualisiert, der helfen sollte. Ich weiß, wie man ein PNG lädt. Ich suche nur nach einem einfacheren Weg, dies zu tun.
Connor W

1

SDL 2 SDL_image minimales ausführbares Beispiel

Haupt c

#include <stdlib.h>

#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>

int main(void) {
    SDL_Event event;
    SDL_Renderer *renderer = NULL;
    SDL_Texture *texture = NULL;
    SDL_Window *window = NULL;

    SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO);
    SDL_CreateWindowAndRenderer(
        500, 500,
        0, &window, &renderer
    );
    IMG_Init(IMG_INIT_PNG);
    texture = IMG_LoadTexture(renderer, "flower.png");
    while (1) {
        SDL_RenderCopy(renderer, texture, NULL, NULL);
        SDL_RenderPresent(renderer);
        if (SDL_PollEvent(&event) && event.type == SDL_QUIT)
            break;
    }
    SDL_DestroyTexture(texture);
    IMG_Quit();
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return EXIT_SUCCESS;
}

GitHub stromaufwärts .

Kompilieren und ausführen:

sudo apt-get install libsdl2-dev libsdl2-image-dev
gcc -std=c99 -o main -Wall -Wextra -pedantic main.c -lSDL2 -lSDL2_image
./main

Ergebnis:

Geben Sie hier die Bildbeschreibung ein

Getestet unter Ubuntu 16.04, GCC 6.4.0, SDL 2.0.4, SDL Image 2.0.1.


1
Im Allgemeinen mögen wir Kommentare und / oder Beschreibungen dessen, was der Code tut, nicht nur einen Codeblock!
Vaillancourt

Übrigens ist es einfacher zu bedienen IMG_LoadTexture().
HolyBlackCat

1
@AlexandreVaillancourt Danke für das Feedback. Philosophie hier: 1) Dieser Code war selbsterklärend 2) Es ist auch gut, etwas zu haben, das man kopieren und einfügen kann, und es funktioniert nur, um es auszuprobieren. | Aber mehr Erklärung könnte auch eine dritte Wertschöpfung sein.
Ciro Santilli 17 病毒 审查 六四 事件 17

@HolyBlackCat danke! Ich habe die Online-Dokumente nach Texturen durchsucht, aber es scheint aus irgendeinem Grund für die 1.x-Version zu sein. Aktualisiert.
Ciro Santilli 17 病毒 审查 六四 事件 17
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.