Lesson 5 优化表面加载和拉伸图像

直到现在我们已经传送了我们的原始图像,因为我们只显示一个图像,因此它不重要。当你制作一个游戏的时候,传送原始图像会导致不必要的速度下降。我们将转换他们到一种速度更高的格式
SDL2 对SDL的表面也有一个新的拉伸功能,它允许你一个图像缩放到不同的大小,在
这个教程中我们将把一个图像缩放到他的一半还有拉伸这个图像到一个完整大小

SDL_Surface* loadSurface(string path){
    //最终优化的图像
    SDL_Surface* optimizedSurface = nullptr;

    //加载指定路径图像
    SDL_Surface* loadedSurface = SDL_LoadBMP(path.c_str());
    if(loadedSurface == nullptr){
        printf("Unable to load the image:%s!,SDL_Error:%s\n",
               path.c_str(), SDL_GetError());
    }
/*
回到我们的图像加载函数,我们要做一些修改来让表面图像进行转换,顶部的功能差不多,加载图片就像原来的图片一样,但是我们声明一个图像指向最后一个优化的图像
*/
else{
        //convert surface to screen
        optimizedSurface = SDL_ConvertSurface(loadedSurface, gScreenSurface->format,0);
        if(optimizedSurface == nullptr){
            printf("Unable to optimized the image:%s!SDL_Error:%s\n",
                   path.c_str(), SDL_GetError());
        }
        //释放原先的外观指针
        SDL_FreeSurface(loadedSurface);
    }
    return optimizedSurface;
}
/*
如果图像在原来的表面成功,我们优化外观的加载
当加载位图的时候,它通常以24位位图格式加载,因为大多数是24位的,大多数。如果不是全部,现在默认是不是24位显示,如果我们以位块传输图像24位到32位,SDL 按照位块转换每一个单位时间
因此我们需要转换它们到一个相同的格式当加载一个图像的时候,可以用SDL_ConvertSurface 实现,我们要做的就是转换合适的格式到屏幕上
需要注意的一点,SDL_ConvertSurface 返回一个原始格式的副本,原来加载的图像仍然是在内存中,这就意味着我们需要释放原来的内寻空间,否则内存中就会有两份拷贝
图像加载完成后,我们返回一个最后优化的图像
顺便说一下,SDL_ConvertSurface 的最后一个参数应该是0,如果你的编译器警告的话,你可以在更改最后一个参数的值为 0
*/
               //应用拉伸的图像
                SDL_Rect stretchRect;
                stretchRect.x = 0;
                stretchRect.y = 0;
                stretchRect.w = SCREEN_WIDTH;
                stretchRect.h = SCREEN_HEIGHT;
                SDL_BlitScaled(gStretchedSurface, NULL,
                               gScreenSurface, &stretchRect);
/*
SDL2 有一个新的专用函数转换图像到一个不同的大小:SDL_BlitScaled,就像传输图像之前,SDL_BlitScaled传输源表面到目的表面,它还需要使用SDL_Rect来定义传送图片的位置和大小
如果我们想把一个图像小于屏幕,或者屏幕的大小,你可以改变目的 宽度/高度 大小到 屏幕的 宽度/高度
*/ 
程序的完整代码和媒体文件下载地址(这个二维码是我博客的地址,修改图片后缀为 .rar就可以解压,因为我不知道csdn在哪上传文件):右键另存为优化后的代码右键另存为
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值