2008-11-30 2 views
8

Was ist der richtige Weg, um eine SDL-Oberfläche zu skalieren? Ich fand eine Erklärung online, aber es musste die Oberfläche Pixel für Pixel neu gezeichnet werden. Es scheint so, als würde es eine Möglichkeit geben, dies nativ über SDL zu tun, anstatt das Bild so neu zu zeichnen. Ich konnte nichts in der SDL-Dokumentation finden, die dies abdeckt. Ich kann Oberflächen problemlos ändern, indem ich die Oberflächenbreite und -höhe verändere, aber die resultierende Oberfläche wird abgeschnitten.Richtige Methode zum Skalieren einer SDL-Oberfläche ohne Clipping?

Antwort

7

SDL unterstützt kein skaliertes Blitting. Gemäß der Dokumentation von SDL_BlitSurface:

Hinweis: Die SDL blitter (noch) nicht der Fall ist haben die Fähigkeit, die der Skalierung Blitted bis Flächen oder nach unten, wie es bei anderen anspruchsvolleren Blitten Mechanismen ist. Sie müssen etwas für sich selbst herausfinden, wenn Sie Bilder skalieren möchten (z. B. verwenden Sie SDL_gfx).

Sie könnten SDL_gfx here finden. Deine eigene Blitting-Funktion zu schreiben ist nicht so schlecht, es könnte ein lustiges und nützliches Lernexperiment sein (obwohl du das Rad neu erfinden würdest). Die Verwendung von OpenGL ist ebenfalls eine Option, da Dinge wie Skalieren und Drehen in einem einzigen Funktionsaufruf durchgeführt werden könnten.

1

Der Vollständigkeit halber und da die Frage keine SDL-Version angibt, ist die Skalierung in SDL2 mithilfe der API-Methode SDL_RenderCopyEx möglich. Außer der grundlegenden SDL2-Bibliothek werden keine zusätzlichen Bibliotheken benötigt.

int SDL_RenderCopyEx(SDL_Renderer*   renderer, 
        SDL_Texture*   texture, 
        const SDL_Rect*  srcrect, 
        const SDL_Rect*  dstrect, 
        const double   angle, 
        const SDL_Point*  center, 
        const SDL_RendererFlip flip) 

durch die Größe der Einstellung dstrect man kann die Textur auf eine ganzzahlige Anzahl von Pixeln skalieren. Es ist auch möglich, die Textur gleichzeitig zu drehen und zu spiegeln.

Technisch skaliert das nicht eine Oberfläche, sondern skaliert eine Textur. Das Verfahren sollte jedoch so relevant sein, da Oberflächen fast immer in Texturen konvertiert werden, bevor das Rendern in SDL2-basierten Anwendungen stattfindet.

Referenz: https://wiki.libsdl.org/SDL_RenderCopyEx

Erstellen Sie Ihre Texturen wie gewohnt:

surface = IMG_Load(filePath); 
texture = SDL_CreateTextureFromSurface(renderer, surface); 

Und wenn es Zeit, es zu machen ist, rufen SDL_RenderCopyEx statt SDL_RenderCopy

4

Ich weiß, diese Antwort ist viel zu spät helfen Sie der Person, die es gebeten hat, aber ich entschied mich, dies zu schreiben, um jedem zu helfen, der auf diese Frage stolpert. In SDL 2.0 können Sie die Funktion SDL_BlitScaled() verwenden, um eine Oberfläche in ein Ziel zu skalieren SDL_Rect. Es gibt ein Tutorial von LazyFoo, das beschreibt, oder überprüfen Sie diese documentation.