SDL学习(一) SDL对于bmp的基本处…

来源:互联网 发布:淘宝店铺手机怎么激活 编辑:程序博客网 时间:2024/06/06 14:11

最近因为学习Newton的编程需要所以需要接触一下SDL编程方式,一开始认为他只是一个管理媒体的简单插件库,后来才知其使用是非常广泛的,故觉得有必要先研究一下在网上搜索到http://lazyfoo.net/SDL_tutorials/index.php 这是一个官方推荐的教程,思路很清晰,觉得很适合初学者,自己也是根据此教程来写的学习笔记:

教程一 简单的在新建的窗口中输出图片的方式

代码:

SDL学习(一) <wbr>SDL对于bmp的基本处理

结果:

SDL学习(一) <wbr>SDL对于bmp的基本处理

教程二 优化表面装载和位图传送

  当然,首先要明确的是为什么要优化表面,举个例子来说,假如我现在有的底层surface是24像素位的,但是我的表层surface确是32像素位的,在急急忙忙blit的时候就无疑会降低速度,但是假如我在装载的时候就予以优化,那么相当于节约了很多的时间。

代码:

#include"SDL.h"
#include<string>
//窗口层显示宽高和像素位设置
const intSCREEN_WIDTH=640;
const int SCREEN_HEIGHT=480;
const int SCREEN_BPP=32;

//表面指针
SDL_Surface *message=NULL;
SDL_Surface *background=NULL;
SDL_Surface *screen=NULL;

 

//装载图像的函数
SDL_Surface *load_image(std::string filename)
{

 SDL_Surface*loadImage=NULL;
 //最优化以后的图像指针
 SDL_Surface *optimizedImage=NULL;
 loadImage=SDL_LoadBMP(filename.c_str());
 if(loadImage!=NULL)
 {//判断是否已经装载成功,如果成功就将旧版本图像做优化使其像素位适应当前的创库显示
  //创建最优化图像
    optimizedImage=SDL_DisplayFormat(loadImage);
   //注意要记得释放旧版本的图像
    SDL_FreeSurface(loadImage);
 }
   return optimizedImage;

}

//实现将源表面与目标表面做链接的函数
void apply_surface(int x,int y,SDL_Surface *source,SDL_Surface*destination)
{//x和y决定了源表面在目标表面的相对位置
 //建立一个矩形来存储偏移量,SDL_Rect是一个能代表一个矩形区域的数据类型,它有x,y的offset参数,还有其自身width和height
 SDL_Rect offset;
 //给矩形的偏移赋值,如此做的原因是SDL_BlitSurface函数仅仅接受通过SDL_Rect传过来的偏移量
 offset.x=x;
 offset.y=y;
 //链接源和目标表面
 SDL_BlitSurface(source,NULL,destination,&offset);
}
int main(int argc,char *argv[])
{
 if(SDL_Init(SDL_INIT_EVERYTHING==-1))
 {//当初始化失败的时候,SDL会返回-1,此时我们就要通过返回1的错误句柄来终止程序
  return1;
 }
 //创建屏幕
 screen=SDL_SetVideoMode(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_BPP,SDL_SWSURFACE);
 if(screen==NULL)
 {
  return 1;
 }
 //设置窗口标题
 SDL_WM_SetCaption("HelloWorld",NULL);
 message=load_image("D:/Users/lucy/Documents/VisualStudio 2008/Projects/SDLtest/hello.bmp");
 background=load_image("D:/Users/lucy/Documents/VisualStudio 2008/Projects/SDLtest/background.bmp");
 //在屏幕上应用背景,因为图片不够大所以只能够填满屏幕的一部分所以要四次调用链接函数将整个屏幕填满
  apply_surface(0,0,background,screen);
  apply_surface(320,0,background,screen);
  apply_surface(0,240,background,screen);
  apply_surface(320,240,background,screen);
  //将文字图片放到屏幕上,因为SDL与windows窗口一样将原点放在屏幕的左上角,并且x轴向右为正,y轴向下为正
 apply_surface(180,140,message,screen);
  //更新屏幕
 if(SDL_Flip(screen)==-1)
  {
  return 1;
  }
  SDL_Delay(5000);
  SDL_FreeSurface(message);
  SDL_FreeSurface(background);

  SDL_Quit();
  return 0;
 
}

运行结果:

SDL学习(一) <wbr>SDL对于bmp的基本处理
ps:由于SDL只能显式支持bmp图像的装载,所以后面要学习如何进行其余类型文件的装载。

原创粉丝点击