美文网首页
SDL 教程 10 : 去除色彩

SDL 教程 10 : 去除色彩

作者: wjundong | 来源:发表于2020-02-19 01:11 被阅读0次

    示例代码

    
    /**
     * Title: 视口
     * 在屏幕上渲染多个图像时,通常需要具有透明背景的图像。幸运的是,SDL提供了一种颜色去除的简单方法
     */
    
    #include <SDL2/SDL.h>
    #include <SDL2/SDL_image.h>
    #include <stdio.h>
    #include <string>
    
    const int SCREEN_WIDTH = 640;
    const int SCREEN_HEIGHT = 480;
    
    #define sdlerror() { printf("error in line %d %s\n", __LINE__, SDL_GetError()); exit(-1); }
    
    
    // Texture wrapper class
    class LTexture
    {
        public:
            // 构造函数,初始化变量
            LTexture()
            {
                mTexture = NULL;
                mWidth = 0;
                mHeight = 0;
            }
    
            ~LTexture()
            {
                free();
            }
    
            // 释放纹理
            void free()
            {
                if( mTexture != NULL )
                {
                    SDL_DestroyTexture( mTexture );
                    mTexture = NULL;
                    mWidth = 0;
                    mHeight = 0;
                }
            }
    
            // 从文件中加载图片作为纹理, 同时将纹理更新到渲染器
            void loadFromFile(const char *filename, SDL_Renderer *render)
            {
                // 先释放先前存在的纹理
                free();
                // 加载图片
                SDL_Surface* imageSurface = IMG_Load( filename );
                if(imageSurface == NULL) sdlerror();
                // 设置图层中抠掉的颜色值,本例子小人背景是青色,所以这里写了青色,小人的背景就没有了
                SDL_SetColorKey( imageSurface, SDL_TRUE, SDL_MapRGB( imageSurface->format, 0, 0xFF, 0xFF ) );
                // 从图片图层窗口纹理
                mTexture = SDL_CreateTextureFromSurface( render, imageSurface );
                // 获取图形尺寸
                mWidth = imageSurface->w;
                mHeight = imageSurface->h;
                SDL_FreeSurface( imageSurface );
            }
    
            // 在指定位置渲染该纹理
            void renderCopy( SDL_Renderer* render, int x, int y )
            {
                SDL_Rect renderQuad = { x, y, mWidth, mHeight };
                SDL_RenderCopy( render, mTexture, NULL, &renderQuad );
            }
    
            // 获取图形尺寸
            int getWidth();
            int getHeight();
    
        private:
            // 纹理数据
            SDL_Texture* mTexture;
            // 图形尺寸
            int mWidth;
            int mHeight;
    };
    
    
    int main(int argc, char *argv[])
    {
        // 初始化
        if(SDL_Init(SDL_INIT_VIDEO) < 0) sdlerror();
        if( !SDL_SetHint( SDL_HINT_RENDER_SCALE_QUALITY, "1" ) )
        {
            printf( "Warning: Linear texture filtering not enabled!" );
        }
        // 创建窗口和渲染器
        SDL_Window *window = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, 
            SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
        SDL_Renderer* render = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
        
        // 初始化 IMG 为 支持 PNG
        if(IMG_Init(IMG_INIT_PNG) != IMG_INIT_PNG) 
            sdlerror();
    
        //Clear screen
        SDL_SetRenderDrawColor( render, 0xFF, 0xFF, 0xFF, 0xFF );
        SDL_RenderClear( render );
    
        // 加载从文件纹理
        LTexture backgroundTexture, fooTexture;
        backgroundTexture.loadFromFile("background.png", render);
        fooTexture.loadFromFile("foo.png", render);
    
        // 将纹理拷贝到渲染器
        backgroundTexture.renderCopy( render, 0, 0 );
        fooTexture.renderCopy( render, 240, 190 );
    
        // 更新屏幕
        SDL_RenderPresent( render );
    
        SDL_Event event;
        while( SDL_PollEvent( &event ) != 0 || event.type != SDL_QUIT);
    
        SDL_DestroyRenderer( render );
        SDL_DestroyWindow(window);
        IMG_Quit();
        SDL_Quit();
        return 0;
    }
    

    运行结果

    运行结果.png

    示例中图片资源

    background.png foo.png

    相关文章

      网友评论

          本文标题:SDL 教程 10 : 去除色彩

          本文链接:https://www.haomeiwen.com/subject/ewdofhtx.html