2019独角兽企业重金招聘Python工程师标准>>>

接着上一篇讲,里面有几个值得研究的函数,尽管理API里已经说得很清楚了,调用SDL_Init()动态的加载和初始化SDL库。 该函数带有一组标记来表示哪部分需要激活:

SDL_INIT_AUDIO
SDL_INIT_VIDEO
SDL_INIT_CDROM
SDL_INIT_TIMER

在SDL。H  里有这么一段宏定义

/* These are the flags which may be passed to SDL_Init() -- you shouldspecify the subsystems which you will be using in your application.
*/
#define SDL_INIT_TIMER          0x00000001
#define SDL_INIT_AUDIO          0x00000010
#define SDL_INIT_VIDEO          0x00000020
#define SDL_INIT_CDROM          0x00000100
#define SDL_INIT_JOYSTICK       0x00000200
#define SDL_INIT_NOPARACHUTE    0x00100000      /* Don't catch fatal signals */
#define SDL_INIT_EVENTTHREAD    0x01000000      /* Not supported on all OS's */
#define SDL_INIT_EVERYTHING     0x0000FFFF

它可以同时初始和加载几个SDL库,使用如下方法 SDL_Init( SDL_INIT_AUDIO | SDL_INIT_VIDEO); 使用完毕最后调用SDL_Quit();接着关于使用 SDL_SetVideoMode()函数,函数原型如下

SDL_Surface *SDL_SetVideoMode(int width, int height, int bitsperpixel, Uint32 flags);

采用 SDL_SetVideoMode()来初始化屏幕。这个屏幕是特指SDL绘制的窗口,并不是指整个屏幕。

width,height是输出高和宽,bitsperpixel 就是指bpp.即每点像素数,取值 8,16,32,值越大,说明屏幕表现力越丰富。它取决于显示器或LCD的硬件性能。一般桌面显示器是32.嵌入式设备的bpp可以用fbset 命令来查看。在我的本本上结果如下

[root@localhost bluesky]# fbset
mode "1366x768"geometry 1366 768 1366 768 32timings 0 0 0 0 0 0 0rgba 8/16,8/8,8/0,0/0
endmode
[root@localhost bluesky]#

flags 常见取值有如下(可以取多个值)

SDL_SWSURFACE :                  数据区建立在系统内存之上
SDL_HWSURFACE:                 数据区建立在显存之上
SDL_FULLSCREEN:                   全屏模式
SDL_NOFRAME:                         取消边框和标题栏

SDL_DOUBLEBUF:                      硬件双缓冲,必须与SDL_HWSURFACE同时使用。                                                        /*还有其它一些值,就不一一例举*/

这个函数,差不多了,不理解没关系,知道用就会,我可是实实大的实用主义,当初用SDL完成一个项目,都还不知道SDL是什么意思?今天看条新闻说美国最大的悲剧,竟然是都不知道下一届领导人是谁?其实我们也不一样,知道了又怎么样,知之为知之,不知为不知,不知者无罪。                                                                                                         其实函数还没讲完,如果有看过Linux内核或Linux驱动的,我们需要一双犀利眼,眼前一亮

SDL_Surface

一定是一个结构体,是的这么简单的问题还说,直接上结构体来得快一点

Name
SDL_Surface -- Graphical Surface Structure
Structure Definition
typedef struct SDL_Surface {Uint32 flags;                           /* Read-only */SDL_PixelFormat *format;                /* Read-only */int w, h;                               /* Read-only */Uint16 pitch;                           /* Read-only */void *pixels;                           /* Read-write *//* clipping information */SDL_Rect clip_rect;                     /* Read-only *//* Reference count -- used when freeing surface */int refcount;                           /* Read-mostly *//* This structure also contains private fields not shown here */
} SDL_Surface;

暂放到这里,这个结构体总要填满的。接着讲SDL_LoadBMP();这样的函数,就乱费口水了,下面要讲一个重量级的函数。

int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect);

src指的是要进行blit的源surface,dst指的是blit这个surface要去的目的地——另外一个surface。这不SDL_Rect结构出来了吧!由于过于简单,        typedef struct{  Sint16  x,   y;      Uint16 w,  h;} SDL_Rect;                            因为显示器通常是矩形的,所以,矩形是计算机图形学中最基本的操作区域单元。这个结构很简单,x和y是矩形的左上角坐标。x从左到右增加;y从上到下增加。左上角的坐标就是(0,0)——SDL中就是这样的。w是矩形的宽,h是矩形的高。而对于整个函数来说,仅仅需要了解的是,如果srcrect为空指针,意味着整个源surface将被blit;如果dstrect为空指针,意味着源surface与目的surface的左上角重合(坐标(0,0))。        blit是个有渊源的词语,这个词的本意就是块(block)移动(transfer)的缩写blt,因为这个缩写缺少元音不好读,所以后来加上了i,就变成blit。      如果blit成功,则返回0;否则返回-1。

现在回过头去看sdl01.cpp 程序,SDL_Surface是不是填满了呢??

接着显示,暂停,释放,关闭就不多说了,函数太简单。

那接下干什么呢?把代码写长一点,这不手痒了,还把代码贴上,如果不想动手的直接去http://lazyfoo.net/SDL_tutorials/lesson02/index.php下,当然,做为好学生的你,动动手还是可以的。

#include "SDL/SDL.h"
#include <string>
//设置屏幕属性,此屏非彼屏
const int SCREEN_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 )
{//Temporary storage for the image that's loadedSDL_Surface* loadedImage = NULL;//The optimized image that will be usedSDL_Surface* optimizedImage = NULL;loadedImage = SDL_LoadBMP( filename.c_str() );if( loadedImage != NULL ){//Create an optimized imageoptimizedImage = SDL_DisplayFormat( loadedImage );SDL_FreeSurface( loadedImage );}return optimizedImage;
}void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination )
{//Make a temporary rectangle to hold the offsetsSDL_Rect offset;//Give the offsets to the rectangleoffset.x = x;offset.y = y;//块移表面SDL_BlitSurface( source, NULL, destination, &offset );
}int main( int argc, char* args[] )
{//初努化SDL子系统if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 ){return 1;}//设置屏幕属性screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );if( screen == NULL ){return 1;}//设置窗口 captionSDL_WM_SetCaption( "Hello World", NULL );message = load_image( "hello.bmp" );background = load_image( "background.bmp" );//Apply the background to the screenapply_surface( 0, 0, background, screen );apply_surface( 320, 0, background, screen );apply_surface( 0, 240, background, screen );apply_surface( 320, 240, background, screen );//Apply the message to the screenapply_surface( 180, 140, message, screen );//显示到屏幕if( SDL_Flip( screen ) == -1 ){return 1;}//等待2SSDL_Delay( 2000 );//释放表面SDL_FreeSurface( message );SDL_FreeSurface( background );SDL_Quit();return 0;
}

保存为sdl02.cpp ,然后

[bluesky@localhost sdl]$ g++ -o sdl02 sdl02.cpp -lSDL
[bluesky@localhost sdl]$ ./sdl02

先看效果,直接上图来的实在,

有图有真像,图不知道害死了多少人,那个谁和谁。这图不又把我又害了,出现如上一节一样的现象,慢慢来了,知道有这什么一回事就可以了。总有一天会解决的。

把代码写长一点,从其中的三个if可知是为安全起见,必竟人有失手,马有失蹄,计算机也出问题的时候,总得写个if足以体现我们对代码,对事,对人的严谨。

转载于:https://my.oschina.net/u/198124/blog/87190

2.SDL游戏开发:把代码写长一点(一)相关推荐

  1. SDL游戏开发之一-SDL的简介

    本教程为一个长系列,旨在于从零开始边学习SDL边开发游戏. 一.什么是SDL? SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成.SDL提 ...

  2. SDL游戏开发系列第一话:Hello SDL

      各位读者朋友大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是http://qinyuanpei.com.从今天起博主将带领大家一起走进SDL游戏开发的世界,如果说此前的Unity3D游戏开 ...

  3. DirectX游戏开发之代码的框架简析

    DirectX游戏开发之代码的框架简析 此次学习过程中,主要参考的是大神"毛星云"的博客和DirectX 官方SDK,不少代码是在前两者的基础上略做修改. 在这两个上面你能够学得更 ...

  4. Silverlight C# 游戏开发:未写代码先设计

    本文只有两个主题: 1.游戏设计清晰的必要 2.循环逻辑的代码设计 游戏设计: 未写代码先设计,这是一个非常重要的建议,如果在写代码前还不知道要开发一个什么游戏,那么会遇上很多问题,这些问题包括: 代 ...

  5. SDL游戏开发之三-瓦片地图

    一.瓦片地图 1)瓦片地图简介 瓦片地图(Tiled Map),又称为瓷砖地图,是在游戏开发中经常使用到的技术,它是由少量的尺寸相同的.小的瓦片图片拼接而成的很大的地图.相对于使用一张张图片来绘制地图 ...

  6. (转载)Android游戏开发之旅一 长按Button原理

    (转载)http://www.android123.com.cn/androidkaifa/538.html 作者: Android开发网原创 时间: 2010-06-22 今天Android123开 ...

  7. 深入探索SDL游戏开发

    前言 欢迎来到小K的SDL专栏第二小节,本节将为大家带来基本窗口构成.渲染器.基本图形绘制.贴图.事件处理等的详细讲解,看完以后,希望对你有帮助 文章目录 前言 一.简单窗口 二.渲染器 三.基本图形 ...

  8. SDL游戏开发之四-卡马克卷轴

    上一篇实现了瓦片地图的绘制,但是单纯地使用上面的代码还是有些问题的,下面就来讨论一下单纯使用瓦片地图的局限性. 假设游戏的分辨率为960*720,瓦片地图的大小也是960*720,瓦片大小为32,那么 ...

  9. 第三人称游戏开发-常用代码(1)

    开发第三人称游戏,对于摄像机控制的一个简单代码..代码直接赋给摄像机,把游戏主角标签设为Player,摄像机就会自动找到主角并跟随. using UnityEngine; using System.C ...

最新文章

  1. 网站安全配置(Nginx)防止网站被攻击(包括使用了CDN加速之后的配置)
  2. 调用.NET XML Web Services返回数据集合一
  3. 今天的 IBM —— 一封来自 IBM 董事长、首席执行官 Arvind Krishna 的公开信
  4. vb.net与c#相互转换工具
  5. 在Windows上构建OpenJDK
  6. SVG-不是图片的图片
  7. java 根据类名示例化类_Java LocalDateTime类| atOffset()方法与示例
  8. 景色宜人的openeim001
  9. CentOS 7.6安装ZABBIX 4.4.0 + TimescaleDB
  10. 【转】现代浏览器的工作原理
  11. 信息量、信息熵、交叉熵、KL散度、JS散度、Wasserstein距离
  12. Mac电脑隔空投递怎么添加到菜单栏?
  13. Markdown 写作类软件 MWeb 和 Ulysses谁更好
  14. 挑战程序设计竞赛: Fence Repair
  15. c 语言鼠标钩子,线程钩子(鼠标钩子) | C/C++程序员之家
  16. 如何手工制作html网站地图,网站地图制作_sitemap自动生成方法详解
  17. 基于Python的飞机大战游戏系统设计与实现
  18. AD软件解决 Unknown Pin 和Failed to add class member 问题
  19. html日历菜鸟,Calendar(日历)
  20. 按键1按下数码管显示1,按键2按下数码管显示2,按键3按下8个LED灯实现流水灯效果;

热门文章

  1. ORACLE-osi分层模型.md
  2. 前后端分离业务逻辑常用封装函数(一)
  3. Ubuntu 16.04下Redis Cluster集群搭建(官方原始方案)
  4. 前端模块化,AMD与CMD的区别
  5. 简单的apache URL重写
  6. [C#]无边框窗体缩放的虚线框怎么实现
  7. 类型初始值设定项引发异常
  8. c语言求两者之间最小数,C语言课件第2章基本数据类型.ppt
  9. 在计算机技术中描述信息最小单位是,计算机二级考试单选题
  10. 浙江财经大学java试卷_2020年浙江财经大学社会保障考研真题试卷及试题答案,管理学考研试题下载...