SDL & C++, image-Formate für Animationen

derpi

Mitglied
Hi,
zwei Freunde und ich wollen ein Adventure über die SDL mit C++ entwickeln. Das Spiel soll sowohl unter Linux als auch unter Windows lauffähig sein.
Jetzt hängen wir an den möglichen Formaten der Grafiken.

Angenommen, ich hätte eine Szene, die einen Raum mit ein paar Gegenständen zeigt. Die Figur soll sich frei im Raum bewegen können, also über X und Y. Die Animationen für X sind vorhanden (in irgeneinem Format). Wenn sich die Figur auf der Y-Achse bewegt, müsste sie sich in der Größe ändern.

Wenn wir mit einem Pixelformat (z.B. BMP) arbeiten würden, müssten dann ja für den einen Charakter ziemlich viele Frames geladen werden, nämlich (Frames der Animationen) * (momentane Position auf Y), um eine korrekte Darstellung hinzubekommen. Bei BMPs werden die Frames einer Animation ja normalerweise in einem großen Bitmap abgelegt und dann einfach in Surfaces abgelegt. Hier würde man also für jede Größe ein großes Animations-BMP benötigen und je nach Y-Position die Größe umschalten, richtig?

Wenn man Vektorgrafiken benutzt, ist das ganze ja etwas einfacher. Hier könnte man die Größe der Vektorgrafik prozentual an den möglichen min/max-Werten der Y-Achse bestimmen. Aber wie werden hier Animationen abgelegt? Hätte man dann für jeden Frame eine Vektorgrafik?
Ein weiteres Problem bei den Vektorgrafiken ist, das es scheinbar nur eine Bibliothek für linux gibt.

Grüße,
DerPi
 
Zuletzt bearbeitet:
Für die Größenänderung müsst ihr nicht seperate Bilder speichern. Die werden in der Regel „on-the-fly“ generiert (also zur Laufzeit bzw. bei Bedarf). Ich bin mir allerdings nicht sicher, ob SDL entsprechende Funktionen dafür schon zur Verfügung stellt.
 
Danke für Deine Antwort. Ich habe mir nochmal die libSDL- und die SDL_image-Funktionen und Doku angesehen, leider ist da nichts Passendes dabei.
Ich habe noch keine Vorstellung, wie eine Funktion zum Skalieren eines Pixelbildes aussehen könnte...
Einfach jeden n-ten Pixel weglassen geht wahrscheinlich auch nicht wirklich.
Hast Du zufällig ein bißchen Pseudo-Code zum Verständnis oder einen guten Link zur Hand? Google bringt mich leider fast nur zu Photoshop, The Gimp etc.
 
Also die einfachste Methode wäre wohl folgende:
Code:
int texSizeX = 64; // Breite der Textur
int texSizeY= 256; // Höhe der Textur

float texCoordX, texCoordY; // Texturkoordinaten
                            // Wertebereich 0.0 – 1.0

for (int y = 0; y < stretchSizeY; y++) {
    for (int x = 0; x < stretchSizeX; x++) {
        // Texturkoordinaten berechnen
        texCoordX = (float)x / stretchSizeX;
        texCoordY = (float)y / stretchSizeY;

        // Texturkoordinaten in Pixelkoordinaten umrechnen
        int texX = texCoordX * texSizeX;
        int texY = texCoordY * texSizeY;

        // Pixel setzen
        PutPixel(x, y, GetColorFromTexture(texX, texY));
    }
}
Durch die Verwendung von Texturkoordinaten lässt sich eine Textur somit auf eine beliebige Größe skalieren.
 
*handvorstirnklatsch* Auf Texturkoordinaten bin ich natürlich nicht gekommen :)
Habe es gestern Abend mal in meine Umgebung eingebaut, jetzt muss ich nur noch das richtige Seitenverhältnis hinbekommen, dann habe ich genau das, was ich brauche.
Vielen Dank für Deine Hilfe.
 

Neue Beiträge

Zurück