2.SDL游戏开发:把代码写长一点(一)
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游戏开发:把代码写长一点(一)相关推荐
- SDL游戏开发之一-SDL的简介
本教程为一个长系列,旨在于从零开始边学习SDL边开发游戏. 一.什么是SDL? SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成.SDL提 ...
- SDL游戏开发系列第一话:Hello SDL
各位读者朋友大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是http://qinyuanpei.com.从今天起博主将带领大家一起走进SDL游戏开发的世界,如果说此前的Unity3D游戏开 ...
- DirectX游戏开发之代码的框架简析
DirectX游戏开发之代码的框架简析 此次学习过程中,主要参考的是大神"毛星云"的博客和DirectX 官方SDK,不少代码是在前两者的基础上略做修改. 在这两个上面你能够学得更 ...
- Silverlight C# 游戏开发:未写代码先设计
本文只有两个主题: 1.游戏设计清晰的必要 2.循环逻辑的代码设计 游戏设计: 未写代码先设计,这是一个非常重要的建议,如果在写代码前还不知道要开发一个什么游戏,那么会遇上很多问题,这些问题包括: 代 ...
- SDL游戏开发之三-瓦片地图
一.瓦片地图 1)瓦片地图简介 瓦片地图(Tiled Map),又称为瓷砖地图,是在游戏开发中经常使用到的技术,它是由少量的尺寸相同的.小的瓦片图片拼接而成的很大的地图.相对于使用一张张图片来绘制地图 ...
- (转载)Android游戏开发之旅一 长按Button原理
(转载)http://www.android123.com.cn/androidkaifa/538.html 作者: Android开发网原创 时间: 2010-06-22 今天Android123开 ...
- 深入探索SDL游戏开发
前言 欢迎来到小K的SDL专栏第二小节,本节将为大家带来基本窗口构成.渲染器.基本图形绘制.贴图.事件处理等的详细讲解,看完以后,希望对你有帮助 文章目录 前言 一.简单窗口 二.渲染器 三.基本图形 ...
- SDL游戏开发之四-卡马克卷轴
上一篇实现了瓦片地图的绘制,但是单纯地使用上面的代码还是有些问题的,下面就来讨论一下单纯使用瓦片地图的局限性. 假设游戏的分辨率为960*720,瓦片地图的大小也是960*720,瓦片大小为32,那么 ...
- 第三人称游戏开发-常用代码(1)
开发第三人称游戏,对于摄像机控制的一个简单代码..代码直接赋给摄像机,把游戏主角标签设为Player,摄像机就会自动找到主角并跟随. using UnityEngine; using System.C ...
最新文章
- 网站安全配置(Nginx)防止网站被攻击(包括使用了CDN加速之后的配置)
- 调用.NET XML Web Services返回数据集合一
- 今天的 IBM —— 一封来自 IBM 董事长、首席执行官 Arvind Krishna 的公开信
- vb.net与c#相互转换工具
- 在Windows上构建OpenJDK
- SVG-不是图片的图片
- java 根据类名示例化类_Java LocalDateTime类| atOffset()方法与示例
- 景色宜人的openeim001
- CentOS 7.6安装ZABBIX 4.4.0 + TimescaleDB
- 【转】现代浏览器的工作原理
- 信息量、信息熵、交叉熵、KL散度、JS散度、Wasserstein距离
- Mac电脑隔空投递怎么添加到菜单栏?
- Markdown 写作类软件 MWeb 和 Ulysses谁更好
- 挑战程序设计竞赛: Fence Repair
- c 语言鼠标钩子,线程钩子(鼠标钩子) | C/C++程序员之家
- 如何手工制作html网站地图,网站地图制作_sitemap自动生成方法详解
- 基于Python的飞机大战游戏系统设计与实现
- AD软件解决 Unknown Pin 和Failed to add class member 问题
- html日历菜鸟,Calendar(日历)
- 按键1按下数码管显示1,按键2按下数码管显示2,按键3按下8个LED灯实现流水灯效果;
热门文章
- ORACLE-osi分层模型.md
- 前后端分离业务逻辑常用封装函数(一)
- Ubuntu 16.04下Redis Cluster集群搭建(官方原始方案)
- 前端模块化,AMD与CMD的区别
- 简单的apache URL重写
- [C#]无边框窗体缩放的虚线框怎么实现
- 类型初始值设定项引发异常
- c语言求两者之间最小数,C语言课件第2章基本数据类型.ppt
- 在计算机技术中描述信息最小单位是,计算机二级考试单选题
- 浙江财经大学java试卷_2020年浙江财经大学社会保障考研真题试卷及试题答案,管理学考研试题下载...