SDL 教程 04 : 按键按下

2020-02-18  本文已影响0人  wjundong

示例代码

#include <SDL2/SDL.h>

const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;

// 图层枚举
enum KeyPressSurfaces
{
    KEY_PRESS_SURFACE_DEFAULT,
    KEY_PRESS_SURFACE_UP,
    KEY_PRESS_SURFACE_DOWN,
    KEY_PRESS_SURFACE_LEFT,
    KEY_PRESS_SURFACE_RIGHT,
    KEY_PRESS_SURFACE_TOTAL
};

int main(int argc, char const *argv[])
{

    SDL_Window *window = NULL;
    SDL_Surface *screenSurface;
    

    // 初始化 SDL, 创建窗口
    if(SDL_Init(SDL_INIT_VIDEO) < 0)
    {
        printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
        exit(-1);
    }
    else
    {
        window = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, 
            SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
        if(window == NULL)
        {
            printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
            exit(-1);
        }
        else
        {
            screenSurface = SDL_GetWindowSurface( window );
        }
    }

    // 加载文件
    SDL_Surface *tab[5];
    tab[0] = SDL_LoadBMP("image/press.bmp");
    tab[1] = SDL_LoadBMP("image/up.bmp");
    tab[2] = SDL_LoadBMP("image/down.bmp");
    tab[3] = SDL_LoadBMP("image/left.bmp");
    tab[4] = SDL_LoadBMP("image/right.bmp");
    for(int i=0; i<5; i++)
    {
        if(tab[i] == NULL)
        {
            printf("Failed to load image!");
            exit(1);
        }
    }

    SDL_Event event;
    bool quit = false;
    SDL_Surface *currentSurface = tab[KEY_PRESS_SURFACE_DEFAULT];

    // 事件处理
    while (quit == false)
    {
        while(SDL_PollEvent(&event) != 0)
        {
            if(event.type == SDL_QUIT)
            {
                quit = true;
            }
            // 有按键按下
            else if (event.type == SDL_KEYDOWN)
            {
                /**
                 * SDL事件内部是有很多事件类型,key 是其中一个, key 里面是一个SDL Keysym,
                 * 它包含有关按下的键的信息。该Keysym包含识别所按键的SDL密钥码
                 * 如您所见,此代码的作用是根据按下的键设置图层。如果要了解其他键的其他键代码,请参阅SDL文档。
                 */ 
                switch (event.key.keysym.sym)
                {
                case SDLK_UP:
                    currentSurface = tab[KEY_PRESS_SURFACE_UP];
                    break;
                case SDLK_DOWN:
                    currentSurface = tab[KEY_PRESS_SURFACE_DOWN];
                    break;
                case SDLK_LEFT:
                    currentSurface = tab[KEY_PRESS_SURFACE_LEFT];
                    break;
                case SDLK_RIGHT:
                    currentSurface = tab[KEY_PRESS_SURFACE_RIGHT];
                    break;                
                default:
                    currentSurface = tab[KEY_PRESS_SURFACE_DEFAULT];
                    break;
                }
            }
            
        }
        // 充填图片图层
        SDL_BlitSurface( currentSurface, NULL, screenSurface, NULL );
        SDL_UpdateWindowSurface( window );
        SDL_Delay(1000 / 60);
    }

    SDL_DestroyWindow( window );
    SDL_Quit();
    return 0;
}

运行结果


运行结果.png

注: 示例中的图片需要 bmp 格式的图片

上一篇 下一篇

猜你喜欢

热点阅读