您的位置:首页 > 其它

第六课:对RenderClear的不同部分的显示

2014-12-25 21:50 363 查看
 这个标题可能不是怎么好,实在是想不出什么好的标题了,知道大家知道是怎么回事就可以了。

讲解:

const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
Clesson05::Clesson05()
{

}

Clesson05::~Clesson05()
{

}
/*
销毁资源
*/
void Clesson05::cleanup(SDL_Window* window)
{
SDL_DestroyWindow(window);
//SDL_QUIT();
}
/*
销毁资源
*/
void Clesson05::cleanup(SDL_Texture* image, SDL_Renderer* renderer, SDL_Window* window)
{
if(image)
{
SDL_DestroyTexture(image);
}
if(renderer)
{
SDL_DestroyRenderer(renderer);
}
if(window)
{
SDL_DestroyWindow(window);
}
}

/*
C++的标准输出
*/
void Clesson05::logSDLError(std::ostream &os, const std::string &msg){
os << msg << " error: " << SDL_GetError() << std::endl;
}
/*
创建一个SDL_Texture
*/
SDL_Texture* Clesson05::loadTexture(const std::string &file, SDL_Renderer *ren){
SDL_Texture *texture = IMG_LoadTexture(ren, file.c_str());
if (texture == nullptr){
logSDLError(std::cout, "LoadTexture");
}
return texture;
}
/*
截取dst中clip来进行绘制
*/
void Clesson05::renderTexture(SDL_Texture *tex, SDL_Renderer *ren, SDL_Rect dst, SDL_Rect *clip)
{
SDL_RenderCopy(ren, tex, clip, &dst);
}
/*
从ren什么位置截取clip大小,进行绘制
*/
void Clesson05::renderTexture(SDL_Texture *tex, SDL_Renderer *ren, int x, int y, SDL_Rect *clip)
{
SDL_Rect dst;
dst.x = x;
dst.y = y;
if (clip != nullptr){
dst.w = clip->w;
dst.h = clip->h;
}
else {
SDL_QueryTexture(tex, NULL, NULL, &dst.w, &dst.h);
}
renderTexture(tex, ren, dst, clip);
}

int Clesson05::Run(int argc, char* argv[]){
//初始化SDL,SDL_INIT_EVERYTHING,启动所有的子系统。
if (SDL_Init(SDL_INIT_EVERYTHING) != 0){
logSDLError(std::cout, "SDL_Init");
return 1;
}

//创建SDL的Window和Renderer
SDL_Window *window = SDL_CreateWindow("OAD工作室-截图图片的不同部分进行绘制", SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
if (window == nullptr){
logSDLError(std::cout, "CreateWindow");
SDL_Quit();
return 1;
}
SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (renderer == nullptr){
logSDLError(std::cout, "CreateRenderer");
cleanup(window);
SDL_Quit();
return 1;
}
//Load一个资源文件
std::string path(argv[1]);
const std::string resPath = path;
SDL_Texture *image = loadTexture(resPath + "image.png", renderer);
if (image == nullptr){
cleanup(image, renderer, window);
IMG_Quit();
SDL_Quit();
return 1;
}

//计算图片相对于Renderer中间的位置
int iW = 100, iH = 100;
int x = SCREEN_WIDTH / 2 - iW / 2;
int y = SCREEN_HEIGHT / 2 - iH / 2;

//对图片进行切片(也就是现实图片的不同的部分)
SDL_Rect clips[4];
for (int i = 0; i < 4; ++i){
clips[i].x = i / 2 * iW;
clips[i].y = i % 2 * iH;
clips[i].w = iW;
clips[i].h = iH;
}

int useClip = 0;

SDL_Event e;
bool quit = false;
while (!quit){
//Event Polling
while (SDL_PollEvent(&e)){
if (e.type == SDL_QUIT){
quit = true;
}
//根据不同的按键来显示不同的部分。
if (e.type == SDL_KEYDOWN){
switch (e.key.keysym.sym){
case SDLK_1:
useClip = 0;
break;
case SDLK_2:
useClip = 1;
break;
case SDLK_3:
useClip = 2;
break;
case SDLK_4:
useClip = 3;
break;
case SDLK_ESCAPE:
quit = true;
break;
default:
break;
}
}
}
//准备开始渲染
SDL_RenderClear(renderer);
//绘制Clips部分
renderTexture(image, renderer, x, y, &clips[useClip]);
//更新Render
SDL_RenderPresent(renderer);
}
//销毁,退出
cleanup(image, renderer, window);
IMG_Quit();
SDL_Quit();

return 0;
}代码我们会在教程完了以后整理一下,上传到CSDN上,有兴趣的可以直接看原作者的代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐