ResourceFiles

Simple Directmedia Layer: Portable Spieleprogrammierung
Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

ResourceFiles

Beitrag von Glocke » Do Jan 24, 2013 9:32 pm

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-)

Benutzeravatar
Yoghurt
Beiträge: 79
Registriert: Fr Nov 16, 2012 8:01 am
Wohnort: Niederbayern

Re: ResourceFiles

Beitrag von Yoghurt » Fr Jan 25, 2013 7:01 am

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?^^
"Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why."

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: ResourceFiles

Beitrag von Glocke » Fr Jan 25, 2013 10:13 am

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:

Benutzeravatar
Yoghurt
Beiträge: 79
Registriert: Fr Nov 16, 2012 8:01 am
Wohnort: Niederbayern

Re: ResourceFiles

Beitrag von Yoghurt » Fr Jan 25, 2013 10:24 am

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. :)
"Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why."

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: ResourceFiles

Beitrag von Glocke » Fr Jan 25, 2013 11:01 am

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);

Benutzeravatar
Yoghurt
Beiträge: 79
Registriert: Fr Nov 16, 2012 8:01 am
Wohnort: Niederbayern

Re: ResourceFiles

Beitrag von Yoghurt » Fr Jan 25, 2013 11:41 am

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.
"Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why."

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: ResourceFiles

Beitrag von Glocke » Fr Feb 01, 2013 10:29 pm

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

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: ResourceFiles

Beitrag von Kerli » Sa Feb 02, 2013 12:38 am

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
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: ResourceFiles

Beitrag von Glocke » Sa Feb 02, 2013 12:14 pm

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 :?
Zuletzt geändert von Glocke am Sa Feb 02, 2013 1:12 pm, insgesamt 1-mal geändert.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: ResourceFiles

Beitrag von Kerli » Sa Feb 02, 2013 1:02 pm

Ich hab bei mir SDL 1.2 installiert (aus den Paketquellen) da ist SDL_SaveBMP_RW in der SDL_video.h drinnen...
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Antworten