• 事件驱动与状态驱动


    假设有这么一个场景,是用键盘的方向键去控制一个物体前进的方向,其中有down、up、right和left,大家很容易想到的是事件驱动,大概模型如下:

    /* Alien screen coordinates */
        int alien_x=0, alien_y=0;
     
        /* Main game loop */
        /* Check for events */
        while( SDL_PollEvent( &event ) ){
            switch( event.type ){
                /* Look for a keypress */
                case SDL_KEYDOWN:
                    /* Check the SDLKey values and move change the coords */
                    switch( event.key.keysym.sym ){
                        case SDLK_LEFT:
                            alien_x -= 1;
                            break;
                        case SDLK_RIGHT:
                            alien_x += 1;
                            break;
                        case SDLK_UP:
                            alien_y -= 1;
                            break;
                        case SDLK_DOWN:
                            alien_y += 1;
                            break;
                        default:
                            break;
                    }
                }
            }
        }

    但是,键盘事件只有在一个按键发生状态改变时才会发生,所以,上述的模型中,要移动100个距离,就要按100次键盘。为了避免这个问题,几乎所有游戏都是采用状态驱动的模型,如下:

    /* Alien screen coordinates */
        int alien_x=0, alien_y=0;
        int alien_xvel=0, alien_yvel=0;
        
        /* Main game loop */
        /* Check for events */
        while( SDL_PollEvent( &event ) ){
            switch( event.type ){
                /* Look for a keypress */
                case SDL_KEYDOWN:
                    /* Check the SDLKey values and move change the coords */
                    switch( event.key.keysym.sym ){
                        case SDLK_LEFT:
                            alien_xvel = -1;
                            break;
                        case SDLK_RIGHT:
                            alien_xvel =  1;
                            break;
                        case SDLK_UP:
                            alien_yvel = -1;
                            break;
                        case SDLK_DOWN:
                            alien_yvel =  1;
                            break;
                        default:
                            break;
                    }
                    break;
                /* We must also use the SDL_KEYUP events to zero the x */
                /* and y velocity variables. But we must also be       */
                /* careful not to zero the velocities when we shouldn't*/
                case SDL_KEYUP:
                    switch( event.key.keysym.sym ){
                        case SDLK_LEFT:
                            /* We check to make sure the alien is moving */
                            /* to the left. If it is then we zero the    */
                            /* velocity. If the alien is moving to the   */
                            /* right then the right key is still press   */
                            /* so we don't tocuh the velocity            */
                            if( alien_xvel < 0 )
                                alien_xvel = 0;
                            break;
                        case SDLK_RIGHT:
                            if( alien_xvel > 0 )
                                alien_xvel = 0;
                            break;
                        case SDLK_UP:
                            if( alien_yvel < 0 )
                                alien_yvel = 0;
                            break;
                        case SDLK_DOWN:
                            if( alien_yvel > 0 )
                                alien_yvel = 0;
                            break;
                        default:
                            break;
                    }
                    break;
                
                default:
                    break;
            }
        }
    
        /* Update the alien position */
        alien_x += alien_xvel;
        alien_y += alien_yvel;
  • 相关阅读:
    shell脚本学习001
    Discuz 代码分析 001 forum.php
    Oauth2.0 入门
    第一篇文章
    position的四个属性值: relative ,absolute ,fixed,static
    JQuery中stop([clearQueue],[goToEnd])介绍
    <meta>
    sublime 2中Package control安装和使用
    ios 状态码
    <video>和<audio>标签,对视频和音频的支持
  • 原文地址:https://www.cnblogs.com/littlethank/p/2575877.html
Copyright © 2020-2023  润新知