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