SDL图片加载2

#include "SDL/SDL.h"
#include <string>

const int SCREEN_WIDTH = 800;
const int SCREEN_HEIGHT = 600;
const int SCREEN_BPP = 32;


//从硬盘中加载一张图片
SDL_Surface *load_image( std::string filename )
{
    SDL_Surface* loadedImage = NULL;
    SDL_Surface* optimizedImage = NULL;
    
    //加载硬盘中的图片,SDL_LoadBMP函数只支持BMP格式图片
    loadedImage = SDL_LoadBMP( filename.c_str() );
    
    //如果图片加载成功
    if( loadedImage != NULL )
    {
        //根据当前程序的设置,将图片信息转换成适合程序使用的格式,转换后会得到一张新图片
        //比如说程序里面用的是32位色,而图片本来是16位色,则需要将图片转换成32位色后才能在窗口中正常显示
        optimizedImage = SDL_DisplayFormat( loadedImage );
        
        //释放刚刚从硬盘加载的图片,加载的图片一定要注意释放,否则会造成内存泄漏
        SDL_FreeSurface( loadedImage );
    }

    return optimizedImage;
}

//将源图片粘贴到目的图片上,即将内存中的一块区域覆盖到另一块区域上
void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination )
{
    //源图片将要粘贴的位置,这个位置指目的区域上的位置
    //SDL的坐标原点在左上角,向右为X正方向,向下为Y正方向
    SDL_Rect offset;
    offset.x = x;
    offset.y = y;
    
    //第二个参数表示将源图片的哪部分粘贴过去,如果为NULL,表示全部
    //如果部分粘贴,则在第二个参数中指明取源图片的哪部分
    SDL_BlitSurface( source, NULL, destination, &offset);
}



int main( int argc, char* args[] )
{
    SDL_Surface *message = NULL;
    SDL_Surface *screen = NULL;

    /**
     * 初始化SDL环境,具体参数见SDL文档,这里初始化所有环境
     * 初始化所有环境的好处是开始时所有的环境都帮你初始化好,后面就不用担心相应的环境是否被初始化
     * 但缺点是有些SDL的功能你可能用不着,在这里把他初始化后会造成资源浪费
     * 由于是学习,所以为了方便,初始化所有环境
     */
    if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
    {
        return 1;
    }
    
    /**设置程序窗口属性,该函数会根据传入的参数创建窗口,返回一个screen
     * screen可以看成和窗口对应的一块内存区域,程序在这块内存区域中粘贴图片,做变换
     * 最后再将这块区域的数据贴到屏幕上去,这样就得到了游戏中的一幅画面,即一帧
     * SCREEN_WIDTH     窗口宽
     * SCREEN_HEIGHT    窗口高
     * SCREEN_BPP        存储一个像素用的位数,就是我们平时配置显示器时的"颜色质量",这里用32位
     * SDL_SWSURFACE    该参数可以配置是否全屏、窗口内容存储位置之类的东西,详细信息见SDL文档,这里设置为非全屏且窗口内容存储在内存中
     */
    screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );
    if( screen == NULL )
    {
        return 1;
    }
    
    //设置窗口标题和图标,这里暂时不设置图标
    SDL_WM_SetCaption( "Hello World", NULL );
    
    //加载要显示的图片,这里可以换成你想要显示的任何图片,不过只能是BMP格式的
    message = load_image( "E:\\code_picture\\javaeye.bmp" );

    //将要显示的图片粘贴到screen上的左上角去
    apply_surface( 0, 0, message, screen );

    //上面在screen上做的所有操作都是在内存中进行,下面是将screen内存中的内容贴到屏幕窗口中
    if( SDL_Flip( screen ) == -1 )
    {
        return 1;
    }

    //等待两秒,免得main函数马上运行完并退出,造成什么都看不到,你可以根据实际情况适当延长时间
    SDL_Delay( 2000 );
    
    //释放加载的图片
    SDL_FreeSurface( message );
    
    //释放窗口
    SDL_FreeSurface( screen );
    
    //退出SDL环境
    SDL_Quit();

    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值