2008-11-30 73 views
8

擴展SDL表面的正確方法是什麼?我在網上找到了一個解釋,但它需要重新繪製像素逐個像素。似乎應該有某種方式通過SDL本地執行此操作,而不是像那樣重新繪製映像。我無法在涵蓋此內容的SDL文檔中找到任何內容。我可以通過修改曲面的寬度和高度來調整曲面的大小,但是曲面會被剪切。合適的方式來縮放SDL曲面而不剪切?

回答

7

SDL不支持縮放blitting。據SDL_BlitSurface文檔:

注:SDL阻擊器不(還) 具有縮放圖混合表面向上或向下喜歡它 與其它更復雜 塊傳輸機制的情況下 的能力。如果您想要縮放圖像 (例如,使用 SDL_gfx),您必須自行提供 數字。

你可以找到SDL_gfx here。編寫自己的blitting函數並不是那麼糟糕,它可能是一個有趣且有用的學習實驗(儘管你會重新發明輪子)。使用OpenGL也是一種選擇,因爲縮放和旋轉等功能可以在單個函數調用中完成。

1

爲了完整,並且由於該問題未指定SDL版本,因此可以使用API​​方法SDL_RenderCopyEx在SDL2中進行縮放。除了基本的SDL2庫之外,不需要額外的庫。

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) 

通過設置的一個dstrect大小可以縮放紋理像素的整數倍。也可以同時旋轉和翻轉紋理。

從技術上講,這不是縮放表面,而是縮放紋理。該過程應儘可能相關,但在基於SDL2的應用程序中進行渲染之前,表面幾乎總是會轉換爲紋理。

參考:https://wiki.libsdl.org/SDL_RenderCopyEx

像往常一樣創建紋理:

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

當它的時間來呈現它,呼籲SDL_RenderCopyEx代替SDL_RenderCopy

4

我知道這個答案是太晚協助提問的人,但我決定寫這個來幫助任何絆倒這個問題的人。在SDL 2.0中,您可以使用SDL_BlitScaled()函數將表面縮放爲目標SDL_Rect。有一個LazyFoo的教程描述了這個,或者查看這個documentation