Chinaunix

标题: SDL系列教程(七):颜色码 [打印本页]

作者: whtonline    时间: 2006-05-26 11:12
标题: SDL系列教程(七):颜色码
SDL系列教程(七):颜色码
作者:akinggw

SDL_Surface结构中有一个部分叫颜色码。
颜色码是干什么用的呢?它就是指你不想在屏幕上显示的那个颜色。本篇教程讲解如何使用颜色码。
假如我们想把下面这幅人物图片:




显示在下面这幅背景上。




如果我们直接将人物放在背景上,将会得到下面的结果:



这看起来是不是很别扭,有没有办法将人物的蓝色背景驱除掉。
答案当然是有的。
讲到这里,我们不得不首先讲一下颜色,表示颜色的方法有很多,而我们这里使用的颜色是RGB格式。
RGB代表什么呢?
如果你学过美术就应该知道,任何色彩都是通过三种基本色彩按照不同比例配置而成的。而我们计算机的色彩也是通过三原色配置而成的,但计算机中使用的三原色和画图时所使用的不同。计算机所使用的是红(RED),绿(GREEN),蓝(BLUE)。
它们的每个值的范围都是一样的,用16进制表示,从0——FF。当三种颜色都为0时,表示白色,相反当三种颜色都为FF,表示黑色。
我们这里所使用的人物图片的背景颜色为(Red 0, Green 0, Blue FF)。应该是蓝色吧。
在这里我就不得不多说几句,在我们做游戏时,最好将颜色码设置成一种不常用的色彩,一般都设置成亮粉红色。

颜色码的设置还是在导入图象函数里:

/* 导入位图*/
SDL_Surface *load_image( char *filename )
{
    //将图象暂时存储在这里
    SDL_Surface* loadedImage = NULL;
   
    //存储最佳的图象
    SDL_Surface* optimizedImage = NULL;
//导入图象
    loadedImage =  IMG_Load( filename );
//如果导入图象不为空
    if( loadedImage != NULL )
    {
        //建立最佳的图象
        optimizedImage = SDL_DisplayFormat( loadedImage );
        
        //释放老的图象
        SDL_FreeSurface( loadedImage );

         if( optimizedImage != NULL )
        {
             //取得颜色码
            Uint32 colorkey = SDL_MapRGB( optimizedImage->format, 0, 0, 0xFF );
            //设置颜色码
            SDL_SetColorKey( optimizedImage, SDL_RLEACCEL | SDL_SRCCOLORKEY, colorkey );
        }

    }
//返回最佳的图象
    return optimizedImage;
}

我们在函数中主要加入了下面两句:
//取得颜色码
            Uint32 colorkey = SDL_MapRGB( optimizedImage->format, 0, 0xFF, 0xFF );
            //设置颜色码
            SDL_SetColorKey( optimizedImage, SDL_RLEACCEL | SDL_SRCCOLORKEY, colorkey );

前面一句是得到我们要设置的颜色码,并且颜色码要保持和屏幕相同的格式。后一句用于设置图片的颜色码。第一个参数说明我们使用颜色码的图片;第二个参数中SDL_RLEACCEL标志说明图片要加速显示,SDL_SRCCOLORKEY标志说明我们将这张图片放在另一张图片之上时,仍然使用颜色码;第三个参数是我们要设置的颜色码。
最后,我们重新将图象画到屏幕上。
    /*在屏幕上画图*/
apply_surface(0,0,background,screen,NULL);
  
apply_surface(x,y,demo,screen,NULL);

截图如下:






本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/19671/showart_118367.html




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2