Seite 1 von 2

ResourceFiles

Verfasst: Do Jan 24, 2013 9:32 pm
von Glocke
Hi,

ich arbeite mich derzeit in ResourceFiles ein. Dabei lade ich X Byte aus einer Datei und will das entsprechende Bild daraus erstellen. Ungetestet würde ich das damit machen:

Code: Alles auswählen

SDL_Surface* getImage(const char* data, std::size_t size) {
    // Read RAW Data from Buffered Data
    SDL_RWops* raw = SDL_RWFromMem(data, size);
    // Create Image
    SDL_Surface* image = SDL_LoadBMP_RW(raw, 1);
    if (image == NULL) {
        throw std::runtime_error(SDL_GetError());
    }
    // Free RAW Data
    SDL_FreeRW(raw);
    // Convert Image Format
    image = SDL_DisplayFormat(image);
    if (image == NULL) {
        throw std::runtime_error(SDL_GetError());
    }
    // Set Color Key for Alpha Transparency
    Uint32 colorkey = SDL_MapRGB(image->format, 0, 0xFF, 0xFF);
    SDL_SetColorKey(image, SDL_SRCCOLORKEY, colorkey);
    // Return Image
    return image;
}
Allerdings fehlt mir der Ansatz, wie ich ich quasi von einer SDL_Surface auf die entsprechenden Daten und die Byteanzahl komme. Also quasi von SDL_Surface* auf char* und std::size_t. Ich finde zumindest erstmal keine passenden Funktionen dafür. Kann mir da jemand weiterhelfen?

Danke im Vorraus 8-)

Re: ResourceFiles

Verfasst: Fr Jan 25, 2013 7:01 am
von Yoghurt
Also wenn ich dich richtig verstanden habe, willst du an die Daten des Surfaces?
SDL_Surface ist eine Struktur. Da kannst du eig. direkt darauf zugreifen.
Nur was hat das mit ResourceFiles zu tun?^^

Re: ResourceFiles

Verfasst: Fr Jan 25, 2013 10:13 am
von Glocke
Ich will pro Objekt eine ResourceFile erstellen. So ein Objekt könnte ein Skelett-Krieger oder Goblin-Magier sein (skeleton_warrior.dat, goblin_mage.dat). Die soll alle Sounddateien, Animationsframes, Kollisionsinformationen usw. enthalten. Wie ich SDL_Surface* und Mix_Chunk* aus einer Binärdatei (bzw. einem char*, was ich aus dieser geladen habe) erstelle weiß ich (s.o.). Nur muss ich die Daten auch irgendwie erstmal in mein Format bekommen. Was ich mir (zum Erstellen der Files) gedacht hatte ist einen Editor zu schreiben, mit dem ich Bilder und Sounds aus PNG und OGG-Files (oder ähnlichem) in die entsprechenden SDL_Surface* und Mix_Chunk* lade (der Punkt klappt problemlos) und dann im gewünschten Format als binäre DAT-File abspeichere (gemäß eines eindeutigen Aufbaus). Ein Konzept für den Dateiaufbau habe ich, nur weiß ich nicht, wie ich aus der SDL_Surface* bzw. der Mix_Chunk* an die entsprechenden Daten als char* komme, damit ich die in die Datei schreiben kann. :mrgreen:

Re: ResourceFiles

Verfasst: Fr Jan 25, 2013 10:24 am
von Yoghurt
Also das sind beides Strukturen. Du kannst also auf die "internen" Daten von SDL_Surface und Mix_Chunk ganz leicht zugreifen.
Struktur SDL_Surface
Struktur Mix_Chunk
Da kannst dir die Bytes auslesen und damit dann anstellen was du willst. :)

Re: ResourceFiles

Verfasst: Fr Jan 25, 2013 11:01 am
von Glocke
Yoghurt hat geschrieben:Also das sind beides Strukturen. Du kannst also auf die "internen" Daten von SDL_Surface und Mix_Chunk ganz leicht zugreifen.
Struktur SDL_Surface
Struktur Mix_Chunk
Da kannst dir die Bytes auslesen und damit dann anstellen was du willst. :)
Soweit so gut :D

Blöde Frage, so hier?

Code: Alles auswählen

char* imgdata = (char*)(myImage->pixels);
char* snddata = (char*)(mySound->abuf);

Re: ResourceFiles

Verfasst: Fr Jan 25, 2013 11:41 am
von Yoghurt
Glocke hat geschrieben:Soweit so gut :D

Blöde Frage, so hier?

Code: Alles auswählen

    char* imgdata = (char*)(myImage->pixels);
    char* snddata = (char*)(mySound->abuf);
Jetzt hast du die Zeiger auf die Daten.

Bei den Sounddaten gibt es das Attribut "alen", das dir die Länge in Bytes (chars) sagt. Somit kannst du diese leicht auslesen.

Bei den Bilddaten ist es etwas anders. Da musst du dir wahrscheinlich ausrechnen wie viel Bytes du lesen musst.
Mein Ansatz wäre folgender:

Code: Alles auswählen

int bytesToRead = (myImage->w * myImage->h) * myImage->format->BytesPerPixel
Ist aber ungetestet.
Es gibt auch noch das Attribut "pitch" was dir vielleicht helfen könnte, aber da ich nicht weiß was mit "surface scanline" gemeint ist (siehe SDL_Surface) kann ich dir das nicht mit Gewissheit sagen.

Re: ResourceFiles

Verfasst: Fr Feb 01, 2013 10:29 pm
von Glocke
Naja wenn ich mit SDL_RWops das Bild dann lesen will muss ich ja erstmal wissen, in welcher Reihenfolge es welche Daten erwartet ... dabei frage ich mich: Warum gibt es eine Lesen-Funktion aber keine Schreiben-Funktion?! :roll:

Ich mach mich mal bzw. SDL_RWops schlau 8-)

LG Glocke

Re: ResourceFiles

Verfasst: Sa Feb 02, 2013 12:38 am
von Kerli
Was willst du denn schreiben? Mit SDL_RWops kannst du eigentlich ziemlich überall schreiben und lesen:

http://sdl.beuc.net/sdl.wiki/SDL_RWops
http://wiki.libsdl.org/moin.cgi/SDL_SaveBMP_RW
http://wiki.libsdl.org/moin.cgi/SDL_RWseek

Re: ResourceFiles

Verfasst: Sa Feb 02, 2013 12:14 pm
von Glocke
Irgendwie habe ich genau das in der Doku übersehen :mrgreen:

/EDIT: aha xD ich hab immer diese Doku verwendet: http://sdl.beuc.net/sdl.wiki/SDL_API_by_name. Ich befürchte, dass SDL_SaveBMP_RW erst ab SDL 2.0 verfügbar ist - atm arbeite ich mit SDL 1.2 :?

Re: ResourceFiles

Verfasst: Sa Feb 02, 2013 1:02 pm
von Kerli
Ich hab bei mir SDL 1.2 installiert (aus den Paketquellen) da ist SDL_SaveBMP_RW in der SDL_video.h drinnen...