SDL教程5——事件驱动编程

以前你可能是使用命令行通过cin和cout来实现编程,这节,我们将介绍怎么在SDL中使用事情驱动编程。简单的说,事件就是某些事情发生了,诸如按键按下、鼠标移动、窗口大小改变等,我们通过捕获这些事件,来实现我们自己的功能。

首先,我们需要在程序中建立一个SDL事件句柄:

SDL_Event event;

然后我们主程序中设置一个while循环,循环获取我们想要事件:

while(quit == false)
{
    while(SDL_Poll(&event))
    {
        if(event.type == SDL_QUIT)
        {
            //Quit the program
            quit == ture;
        }
    }
}

此处我们只捕获程序退出事件,SDL_Poll自动帮我们从消息队列中获取事件,然后存放在event中。

我们对某些程序模块进行了一些细分,增加了一些初始化子函数和清理工作子函数,完整代码如下:

#include "SDL.h"
#include "SDL_image.h"
#include <string>
 
//The  attributes of the screen
const int SCREEN_WIDTH = 600;
const int SCREEN_HEIGHT = 450;
const int SCREEN_BPP = 32;
 
//The surfaces that will be usede
SDL_Surface *image = NULL;
SDL_Surface *screen = NULL;                  
 
//The event struct that will be used
SDL_Event event;
 
SDL_Surface *load_image(std::string filename)
{
    //The image that's loaded
    SDL_Surface *loadedImage = NULL;
 
    //The optimized image that will be used
    SDL_Surface *optimizedImage = NULL;
    
    //Loaded the image using SDL_image
    loadedImage = IMG_Load(filename.c_str());
 
    //If the image loaded
    if(loadedImage != NULL)
    {
        //Create an optimized image
        optimizedImage = SDL_DisplayFormat(loadedImage);
 
        //Free the old image
        SDL_FreeSurface(loadedImage);
    }
 
    //Return the optimized image
    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 offset to the rectangle
    offset.x = x;
    offset.y = y;
 
    //Blit the surface
    SDL_BlitSurface(source,NULL,destination,&offset);
}
 
bool init()
{
    //Initialize all SDL_subsystems
    if(SDL_Init(SDL_INIT_EVERYTHING) == -1)
    {
        return false;
    }
    
    //Set up the screen
    screen = SDL_SetVideoMode(SCREEN_WIDTH,SCREEN_HEIGHT,
                                SCREEN_BPP,SDL_SWSURFACE);
    
    //If there was an error in setting up the screen
    if(screen == NULL)
    {
        return false;
    }
 
    //Set the window caption
    SDL_WM_SetCaption("Event test",NULL);
 
    //If everything initialized fine
    return true;
}
 
bool load_files()
{
    //Load the image
    image = load_image("test_png.png");
 
    //If there was an error in loading the image
    if(image == NULL)
    {
        return false;
    }
 
    //If everything loaded fine
    return true;
}
 
void clean_up()
{
    //Free the image
    SDL_FreeSurface(image);
    
    //Quit SDL
    SDL_Quit();
}
int main(int argc,char *argv[])
{
    //Make sure the program waits for a quit
    bool quit = false;
 
    //Initialize
    if(init() == false)
    {
        return 1;
    }
 
    //Load the files
    if(load_files() == false)
    {
        return 1;
    }
 
    //Apply the surface to the screen
    apply_surface(0,0,image,screen);
 
    //Update the screen
    if(SDL_Flip(screen) == -1)
    {
        return 1;
    }
    
    //While the user hasn't quit
    while(quit == false)
    {
        //While there's an event to handle
        while(SDL_PollEvent(&event))
        {
            if(event.type == SDL_QUIT)
            {
                //Quit the program
                quit = true;
            }
        }
    }
    //Free the surface and quit SDL
    clean_up();
    
    return 0;
}
posted @ 2013-02-23 13:31  阿Q程序员  阅读(475)  评论(0编辑  收藏  举报