SDL游戏开发教程02(显示图片)

    本节将介绍如何创建一个窗口并在上面贴一副图片,效果如下:


 

    显示图片是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被创建后默认是黑色。在后面的教程中,将会介绍到图片的缩放,由于图片缩放会造成图片的失真,所以尽量不要使用该功能。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值