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.
SDL unterstützt skaliertes Blitting nicht. Laut der Dokumentation von SDL_BlitSurface :
Hinweis: Der SDL-Blitter funktioniert (noch) nicht haben die Fähigkeit, die blitted Oberflächen oben oder unten wie es ist der Fall mit anderen höher entwickelten Blitting-Mechanismen. Sie müssen Finde etwas heraus für dich, wenn Sie möchten Bilder skalieren (z. B. verwenden SDL_gfx).
Sie finden SDL_gfx hier . 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önnen.
Ich weiß, dass diese Antwort viel zu spät ist, um der Person, die darum gebeten hat, zu helfen, aber ich habe beschlossen, dies zu schreiben, um jedem zu helfen, der über diese Frage stolpert. In SDL 2.0 Sie können die Funktion SDL_BlitScaled()
verwenden, um eine Fläche in eine Zielebene SDL_Rect
zu skalieren. Es gibt ein Tutorial von LazyFoo , das dies beschreibt, oder schaut euch das Dokumentation .
Der Vollständigkeit halber und weil die Frage keine SDL-Version angibt, ist die Skalierung in SDL2 mit der API-Methode SDL_RenderCopyEx
möglich. Außer der grundlegenden SDL2-Bibliothek werden keine zusätzlichen Bibliotheken benötigt.
Wenn Sie die Größe von dstrect
einstellen, können Sie die Textur auf eine ganze Zahl von Pixeln skalieren. Es ist auch möglich, die Textur gleichzeitig zu drehen und zu spiegeln.
Technisch betrachtet skaliert eine Oberfläche nicht, 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: Ссылка
Erstellen Sie Ihre Texturen wie gewohnt:
%Vor% Und wenn es Zeit ist, es zu rendern, rufen Sie SDL_RenderCopyEx
anstelle von SDL_RenderCopy