2008-11-30 23 views
8

cách thích hợp để mở rộng bề mặt SDL là gì? Tôi tìm thấy một lời giải thích trực tuyến nhưng nó yêu cầu vẽ lại pixel bề mặt theo pixel. Có vẻ như có một số cách để làm điều này một cách tự nhiên thông qua SDL thay vì vẽ lại hình ảnh như thế. Tôi đã không thể tìm thấy bất cứ điều gì trong tài liệu SDL bao gồm điều này. Tôi có thể thay đổi kích thước bề mặt mà không có bất kỳ vấn đề bằng cách sửa đổi bề rộng chiều rộng và chiều cao, nhưng bề mặt kết quả là cắt bớt.Cách thích hợp để mở rộng bề mặt SDL mà không bị cắt?

Trả lời

7

SDL không hỗ trợ chỉnh tỷ lệ. Theo tài liệu của SDL_BlitSurface:

Lưu ý: blitter SDL không (chưa) có khả năng mở rộng quy mô blitted bề mặt lên hoặc xuống như nó là trường hợp với phức tạp hơn cơ chế blitting khác. Bạn phải tìm ra điều gì đó cho chính mình nếu bạn muốn chia tỷ lệ hình ảnh (ví dụ: sử dụng SDL_gfx).

Bạn có thể tìm thấy SDL_gfx here. Viết hàm blitting của riêng bạn không phải là xấu, nó có thể là một thử nghiệm học tập thú vị và hữu ích (mặc dù bạn muốn được tái phát minh bánh xe). Sử dụng OpenGL cũng là một tùy chọn, vì các công cụ như mở rộng quy mô và xoay có thể được thực hiện trong một cuộc gọi chức năng duy nhất.

1

Để có đầy đủ và do câu hỏi không chỉ định phiên bản SDL, có thể mở rộng quy mô trong SDL2 bằng phương pháp API SDL_RenderCopyEx. Không có libs bổ sung ngoài libL2 cơ bản là cần thiết.

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) 

Bằng cách đặt kích thước là dstrect, người ta có thể chia tỷ lệ thành số nguyên pixel. Nó cũng có thể xoay và lật kết cấu cùng một lúc.

Về mặt kỹ thuật, điều này không phải là chia tỷ lệ bề mặt mà là thu nhỏ kết cấu. Quy trình này phải có liên quan mặc dù các bề mặt hầu như luôn được chuyển đổi thành kết cấu trước khi hiển thị diễn ra trong các ứng dụng dựa trên SDL2.

tham khảo: https://wiki.libsdl.org/SDL_RenderCopyEx

Tạo kết cấu của bạn như bình thường:

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

Và khi nó là thời gian để làm cho nó, gọi SDL_RenderCopyEx thay vì SDL_RenderCopy

4

Tôi biết câu trả lời này là quá muộn để hỗ trợ người đã hỏi, nhưng tôi quyết định viết điều này để giúp bất cứ ai tình cờ gặp câu hỏi này. Trong SDL 2.0 Bạn có thể sử dụng chức năng SDL_BlitScaled() để chia tỷ lệ bề mặt thành một mục tiêu SDL_Rect. Có hướng dẫn của LazyFoo mô tả điều này hoặc xem documentation này.

Các vấn đề liên quan