2011-11-06 20 views
5

मैं अपने एसडीएल आवेदन में PNG फ़ाइल (कुछ पारदर्शी स्थानों के साथ) लोड हो रहा है कर रहा हूँ। यह मेरे लिए कैसे इस कोड नमूने के साथ प्रदान की क्या करने परSDL_image पीएनजी पारदर्शिता त्रुटि

Googling:

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; 
} 

लेकिन जब लाइन compatible_image = SDL_DisplayFormat(loaded_image); तक पहुँच जाता है, आवेदन एक uncatchable अपवाद के साथ रुकती है (यहां तक ​​कि try { /* ... */ } catch (...) { /* ... */ } मदद नहीं करता है)। SDL_DisplayFormat() को SDL_DisplayFormatAlpha() के साथ बदलने में भी मदद नहीं मिली। तो, मैं सिर्फ अपवाद-trowable लाइनों को हटा दिया है और इस कोड छवियों को लोड करने के लिए काम करना आरंभ:

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

    return IMG_Load(filename.c_str()); 
} 

और मैं इस तरह के अप्रिय बात मिल गया है: जब कुछ स्प्राइट एक दूसरे के पारदर्शी टुकड़े के साथ ओवरलैप हो, कलाकृतियों दिखाई देते हैं। कुछ इस तरह:

normal state

artifacts appearing

मैं इस सरल एल्गोरिथ्म के साथ मेरी "हीरो" एनिमेट कर रहा हूँ:

// 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); 

यह कैसे समझाया और उन्हें ठीक कर सकते हैं?

उत्तर

1

मिले एक समाधान: जब पारदर्शी टुकड़े के साथ एक टाइल तैयार की है और एक अन्य स्प्राइट पहले एक के शीर्ष पर तैयार की है, कलाकृतियों दिखाई देते हैं। निश्चित रूप से वे करेंगे, क्योंकि पहले स्प्राइट के पीछे कुछ भी नहीं है!

पहली और सबसे जल्दी ठीक किसी भी आगे blittings से पहले कुछ रंग के साथ पूरे पृष्ठभूमि को भरने के लिए है।

दूसरा और सबसे सुंदर तरीके से (मेरे मामले में) (घास दिखाया गया है) कुछ पृष्ठभूमि छवि आकर्षित करने के लिए है।

first example

second example

आप देख सकते हैं, कोई कलाकृतियों को प्रदर्शित होने:

यहाँ के परिणाम हैं। ठीक है, मैं! =)

1

सुनिश्चित नहीं हैं कि अगर इस समस्या है, लेकिन आप SDL_DisplayFormat

+0

हाँ, अब अपवाद throwed नहीं है। आपका धन्यवाद। लेकिन कलाकृतियों को दूर नहीं किया गया कोई फर्क नहीं पड़ता कि मैं कैसे कोशिश करता हूं ... – shybovycha

6

उपयोग SDL_DisplayFormatAlpha बजाय SDL_DisplayFormat से पहले सुनिश्चित करें कि आप SDL_Init कॉल कर रहे हैं बनाना चाहिए। यह पारदर्शिता को सही ढंग से संरक्षित करता है।

संबंधित मुद्दे