美文网首页
SDL 教程 04 : 按键按下

SDL 教程 04 : 按键按下

作者: wjundong | 来源:发表于2020-02-18 23:36 被阅读0次

示例代码

#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 格式的图片

相关文章

  • SDL 教程 04 : 按键按下

    示例代码 运行结果 注: 示例中的图片需要 bmp 格式的图片

  • 命题-第十一章-填空

    如图所示为4×4的矩阵式按键,其中绿色表示按键被按下,黑色表示按键未被按下。它的键值是______。 【答案】5【...

  • 键盘事件

    键盘事件 onkeydown 按键按下事件 onkeypress 按键产生字符事件 onkeyup 按键弹起事件 ...

  • vue 键盘

    键盘事件 属性描述DOMonkeydown某个键盘按键被按下。2onkeypress某个键盘按键被按下并松开。2o...

  • 非常棒的SDL中文教程

    SDL中文教程 - 游戏编程入门

  • 按下幸福的按键

    手机摄影/ 小zhu先生 花/ 开了 我/ 没有/ 缺席

  • 键盘控制物体的移动和旋转Horizontal Vertical

    物理引擎 GetKey按键按下期间返回true GetKeyDown按键按下的第一帧返回true GetKeyUp...

  • 键盘点击事件

    键盘点击事件 1、keyup 键盘按键松开后执行2、keydown 键盘按键按下时执行3、keypress 键盘按...

  • 9.自定义HOME按键

    9.1 问题 应用程序需要实现与按下物理HOME按键一样的功能。 9.2 解决方案 用户按下HOME按键的行为会发...

  • 简单笔记

    11.waitKey(X); 参数X:等待x ms,如果在此期间有按键按下,则立即结束并返回按下按键的 ASCII...

网友评论

      本文标题:SDL 教程 04 : 按键按下

      本文链接:https://www.haomeiwen.com/subject/othofhtx.html