SDL 教程 10 : 去除色彩

2020-02-19  本文已影响0人  wjundong

示例代码


/**
 * 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
上一篇下一篇

猜你喜欢

热点阅读