2011-11-06 69 views
5

Tôi đang tải tệp PNG (với một số vị trí trong suốt) vào ứng dụng SDL của mình.Lỗi trong suốt SDL_image PNG

Googling về cách để làm điều đó cung cấp cho tôi với mẫu mã này:

SDL_Surface *LoadImage(std::string filename) 
{ 
    SDL_Surface* loaded_image = 0, compatible_image = 0; 

    if (!filename.c_str()) 
     return 0; 

    loaded_image = IMG_Load(filename.c_str()); 

    if (!loaded_image) 
     return 0; 

    compatible_image = SDL_DisplayFormat(loaded_image); 

    SDL_FreeSurface(loaded_image); 

    return compatible_image; 
} 

Nhưng khi dòng compatible_image = SDL_DisplayFormat(loaded_image); được đạt tới, ứng dụng ngừng với một ngoại lệ uncatchable (thậm chí try { /* ... */ } catch (...) { /* ... */ } không giúp). Thay thế SDL_DisplayFormat() bằng SDL_DisplayFormatAlpha() cũng không giúp ích gì. Vì vậy, tôi chỉ cần loại bỏ các dòng ngoại lệ trowable và nhận được mã này làm việc để tải hình ảnh:

SDL_Surface *LoadImage(std::string filename) 
{ 
    if (!filename.c_str()) 
     return 0; 

    return IMG_Load(filename.c_str()); 
} 

Và tôi đã tìm thấy điều khó chịu như vậy: khi một số ma trùng lặp với phần minh bạch với nhau, hiện vật xuất hiện. Một cái gì đó như thế này:

normal state

artifacts appearing

Tôi sinh động của tôi "anh hùng" với thuật toán đơn giản này:

// SDL_Surface sprite = LoadImage("hero.bmp"); 
// hero.bmp contains animation frames followed one-by-one in a single line 
// spriteFrameCnt is a number of animation frames 
// spriteWidth and spriteHeight contain single frame params 

SDL_Rect srcRect; 
srcRect.x = spriteFrame * spriteWidth; 
srcRect.w = spriteWidth; 
srcRect.y = 0; 
srcRect.h = spriteHeight; 
spriteFrame = ++spriteFrame % spriteFrameCnt; 

SDL_BlitSurface(sprite, &srcRect, screen, &rcSprite); 

Làm thế nào điều này có thể được giải thích và cố định?

Trả lời

1

Tìm thấy giải pháp: khi một ô có các miếng trong suốt được vẽ và một hình vẽ khác được vẽ trên đầu trang đầu tiên, hiện vật xuất hiện. Chắc chắn họ sẽ, bởi vì không có gì nằm đằng sau sprite đầu tiên đó!

Việc sửa chữa đầu tiên và nhanh nhất là lấp đầy toàn bộ nền bằng một số màu trước khi có thêm bất kỳ phiên bản nào.

Cách thứ hai và đẹp nhất (trong trường hợp của tôi) là vẽ một số hình nền (cỏ như được hiển thị).

Dưới đây là kết quả:

first example

second example

Như bạn thấy, không có hiện vật xuất hiện. Làm tốt lắm, tôi! =)

1

Không chắc nếu đây là vấn đề, nhưng bạn nên chắc chắn rằng bạn đang gọi điện thoại SDL_Init trước SDL_DisplayFormat

+0

Vâng, bây giờ ngoại lệ không được ném. Cảm ơn bạn. Nhưng hiện vật đã không biến mất bất kể tôi thử như thế nào ... – shybovycha

6

Sử dụng SDL_DisplayFormatAlpha thay vì SDL_DisplayFormat. Nó bảo quản đúng độ trong suốt.

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