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

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

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

/* These are the flags which may be passed to SDL_Init() -- you should
   specify 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 命令来查看。在个人本本上结果以下 app

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

flags 常见取值有以下(能够取多个值)  less

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

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

这个函数,差很少了,不理解不要紧,知道用就会,我但是实实大的实用主义,当初用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();这样的函数,就乱费口水了,下面要讲一个重量级的函数。 ui

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。 spa

如今回过头去看sdl01.cpp 程序,SDL_Surface是否是填满了呢??       .net

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

那接下干什么呢?把代码写长一点,这不手痒了,还把代码贴上,若是不想动手的直接去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 loaded
    SDL_Surface* loadedImage = NULL;

    //The optimized image that will be used
    SDL_Surface* optimizedImage = NULL;

    loadedImage = SDL_LoadBMP( filename.c_str() );

    if( loadedImage != NULL ){
        //Create an optimized image
        optimizedImage = 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 offsets
    SDL_Rect offset;

    //Give the offsets to the rectangle
    offset.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;
    }

    //设置窗口 caption
    SDL_WM_SetCaption( "Hello World", NULL );

    message = load_image( "hello.bmp" );
    background = load_image( "background.bmp" );

    //Apply the background to the screen
    apply_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 screen
    apply_surface( 180, 140, message, screen );

    //显示到屏幕
    if( SDL_Flip( screen ) == -1 ){
        return 1;
    }

    //等待2S
    SDL_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足以体现咱们对代码,对事,对人的严谨。

相关文章
相关标签/搜索