2011年5月29日 星期日

圖片的鏡射處理

鏡射應該是遊戲設計裡常會用到的方法。

但是很遺憾,SDL似乎是沒有這個方法…

沒有這個方法的話就自己寫一個吧。

相較於降低品質,鏡射容易多了,所以同樣的事我也不做贅述。

依然是只有PNG和BMP
/** 
* Srite :類型-(SDL_Surface *)SDL圖片底層Struct,對像圖片(想轉成BMP的圖) 
* type :只有PNG或不是PNG兩種,有興趣的在自己擴充吧
*/
SDL_Surface* Sprite_Convey2Mirror( SDL_Surface* Sprite ,string type)
{
    SDL_Surface* Mirror;
    if ( type == "PNG" )
        Mirror = SDL_DisplayFormatAlpha( Sprite );
    else
        Mirror = SDL_DisplayFormat( Sprite );

    SDL_Color rgb1;

    Uint32 rgb3;

    #pragma omp parallel for
    for ( int j = 0;j < Mirror ->h - 1;++j )
    {
        for ( int i = 0;i < Mirror ->w - 1;++i )
        {
            rgb1 = GetRGB( Sprite, i, j );

            if ( type == "PNG" )
            rgb3 = SDL_MapRGBA( Sprite ->format, rgb1.r, rgb1.g, rgb1.b, rgb1.unused ); //取得目標顏色RGBA,包含alpha
            else
            rgb3 = SDL_MapRGB( Sprite ->format, rgb1.r, rgb1.g, rgb1.b );//取得目標顏色,不包含alpha

            putpixel( Mirror, Sprite ->w - i, j, rgb3 ); //這裡就是整個Function的重點,反方向把顏色撲回去,這個函式之後我再解釋
        }
    }
    return Mirror;
}

降低圖片品質

這個Function,主要是把已經讀進記憶體的圖片再做一次降低品質。

或許有人會想問,為什麼這樣做?

32bit的圖片是比較漂亮沒錯。但是也大大拖慢了CPU的處理速度,轉成24bit之後效能會大大提升。

當然也有缺點,就是會變得比較醜…

當然SDL支援的圖片不是只有PNG跟BMP格式。

但在這個Porject裡我只有用到這兩個格式,如有需要用到TGA格式…就Google一下吧.
/** 
* Srite :類型-(SDL_Surface *)SDL圖片底層Struct,對像圖片(想轉成BMP的圖) 
* color :整張圖片的顏色 0 ~ 0xff , -1為關閉,PS:如果圖片不是單色請設成-1 
* fade :0xff,代表不做漸層效果
* **/
SDL_Surface* Sprite_Convey2Lowbilt(SDL_Surface* Sprite, int color ,int fade ,int colorkey)
{
    SDL_Surface * temp = SDL_DisplayFormatAlpha( Sprite ); //首先複製一分一樣的圖片
    SDL_Color rgb1;
    Uint32 rgb3;
    Uint8 a, r, g, b;
    #pragma omp parallel for

    for ( int j = 0;j < temp->h ;++j )
    {
        for ( int i = 0;i < temp->w;++i )
        {
            rgb1 = GetRGB( Sprite, i, j );

            if ( rgb1.unused != 0 && rgb1.unused > 64)  // rgb1.unused 是透明度 0 ~ 0xff 這裡只偵測到超過一半才執行半透明混色
            {
                a = fade == 0xff ? fade : ( rgb1.unused - rgb1.unused / 10 ) ;
                if(color!=-1)
                {
                    rgb3 = ( 0xff << 0x18 ) + color;
                }else
                {
                    fuzzy( &rgb1, &a, &r, &g, &b );//取得顏色函式,這個涵式我在另外解說
                    rgb3 = ( 0xff << 0x18 ) + ( r << 0x10 ) + ( g << 0x8 ) + ( b );
                }
            }
            else
                rgb3 = ( 0xff << 0x18 ) + colorkey;//如果透明度超過,則加入colorkey的顏色

            putpixel( temp, i, j, rgb3 );//把rgb存到指定的點,這個涵式我會在另外解說
        }
    }
    temp = SDL_DisplayFormat( temp );  //最後再Format一次,即大功告成
    return temp;
}

2011年5月28日 星期六

SDL 開發心得

Simple DirectMedia Layer

簡稱SDL

這是一個能夠跨平台(跨平台多媒體),穿梭於Windows語Linux之間的函式庫,功能與DirectX近乎一樣。

當然在Linux下執行的話,一定能夠節省很多的設備成本;但反之,則會增加人力、開發成本。

當初選擇SDL開發的原因,就是因為他能在Windows下進行Debug,因此也節省了很多開發時間。

畢竟專案的程式開發人員只有一個人,從無到有也是費了一番工夫。

而今事過境遷,這項開發工作也因為我的離開中止了。

雖然不保證程式完全沒問題,但是為了不忘記自己寫的程式。

在此整理一下自己寫過的程式。

嘛…說是完全自己開發的,是沒錯。

但是因為這是我出社會的第二個Project,所以程式的寫法還是很幼稚。

C至C++還是有段距離,而當時小弟我對OOP也不甚了解,所以就寫了很多指標…

可能看還是有點難,就連我自己都要稍微想一下了。

望請砲火不要太強阿…