本节将介绍如何创建一个窗口并在上面贴一副图片,效果如下:
显示图片是2D游戏开发的基础,游戏开发的大部分工作是在处理用户的输入,然后调整显示在界面上的图片。这个例子就是完成最基本的功能:显示图片。由于没有消息循环和事件响应,窗口不能移动,只能用任务管理器关闭。
代码如下 :
#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;
}
上面的代码主要参考http://lazyfoo.net/SDL_tutorials/index.php ,只对其中的部分代码做了小小调整,如果看上面的注释没办法明白什么意思的话,可以参考这个链接里面的介绍。
如果你选择的图片大于窗口大小的话,将显示部分图片;如果选择的图片小于窗口大小的话,图片没有覆盖到的部分将显示黑色,这是因为screen被创建后默认是黑色。在后面的教程中,将会介绍到图片的缩放,由于图片缩放会造成图片的失真,所以尽量不要使用该功能。