文档章节

8.SDL游戏开发:事件(二)

一一无念
 一一无念
发布于 2012/11/08 22:05
字数 1306
阅读 447
收藏 1

没上班日子无聊,没得上班又没钱的日子便是痛苦,在上海又换了个地,生活不容易,新地方还不错,上网用无线,下午准备接着写SDL系列,没想到的是B450上fedora12 无线网卡驱动没整上,然后我在XP和fedora12之间不停的开关机,最终驱动装上去(lsmod 看到了),但是无线网卡还是配置上,(iwconfig)竟然找不到设备(是不是真没装上)。看来得去好看看网卡驱动模块,然后回到XP上,在虚拟机上装了个fedora17,后来发现环境什么的都没搞好,gcc都没有^=^!但仍然挡不住我这颗火热的心。接着昨天的继续,在事件驱动中鼠标有两个事件,分别是SDL_MouseMotionEvent 和SDL_MouseButtonEvent,前者指是在整个显示屏上所占的位置(x,y)关于X,Y是如何定义的,可以这么理解,在显示器的左上方是原点,水平方向是X轴,垂直方向是Y轴。后者表示鼠标的点击(单击双击左击右击)事件,还有滚动事件,下面是关于两个事件的结构体。关于两者具体的解释请看结构体注释。

typedef struct{
  Uint8 type;     /* SDL_MOUSEMOTION */
  Uint8 state;    /* 当前鼠标的状态 */
  Uint16 x, y;    /* 鼠标此时XY的坐标*/
  Sint16 xrel, yrel; /*在X / Y方向的相对运动 */
} SDL_MouseMotionEvent;
typedef struct{
  Uint8 type; /* SDL_MOUSEBUTTONDOWN OR SDL_MOUSEBUTTONUP */
  Uint8 button; /* 当前鼠标的索引它们分别是SDL_BUTTON_LEFT SDL_BUTTON_MIDDLE, SDL_BUTTON_RIGHT */
  Uint8 state;   /* SDL_PRESSED OR SDL_RELEASED */
  Uint16 x, y;   /*记录鼠标按下或释放时X,Y时间,(翻译过来是这样,但是我也不确定)*/
} SDL_MouseButtonEvent;
大概就是这样,鼠标的事件就如此。从键盘到鼠标我都关注有几点值得注意的地方,其一是Uint8 type;其二都有Uint state;前者对应的宏还不一样,从字面意思就可知道是一种型号,所以当然不同啦,但不同之间有共性那就是有DOWN和UP,当面SDL_MOUSEMOTION有点特殊。其实也就是状态,一回事喽!所以也就有了接下来的这个例子,Key STATE;
#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include "SDL/SDL_ttf.h"
#include <string>

//Screen attributes
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;

//The surfaces
SDL_Surface *background = NULL;
SDL_Surface *up = NULL;
SDL_Surface *down = NULL;
SDL_Surface *left = NULL;
SDL_Surface *right = NULL;
SDL_Surface *screen = NULL;

//The event structure
SDL_Event event;

//The font
TTF_Font *font = NULL;

//The color of the font
SDL_Color textColor = { 0, 0, 0 };

SDL_Surface *load_image( std::string filename )
{
    //The image that's loaded
    SDL_Surface* loadedImage = NULL;


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

    //Load the image
    loadedImage = IMG_Load( filename.c_str() );

    //If the image loaded
    if( loadedImage != NULL )
    {
        //Create an optimized surface
        optimizedImage = SDL_DisplayFormat( loadedImage );

        //Free the old surface
        SDL_FreeSurface( loadedImage );

        //If the surface was optimized
        if( optimizedImage != NULL )
        {
            //Color key surface
            SDL_SetColorKey( optimizedImage, SDL_SRCCOLORKEY, SDL_MapRGB( optimizedImage->format, 0, 0xFF, 0xFF ) );
        }
    }

    //Return the optimized surface
    return optimizedImage;
}

void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip = NULL )
{
    SDL_Rect offset;

    offset.x = x;
    offset.y = y;

    SDL_BlitSurface( source, clip, destination, &offset );
}

bool init()
{
    if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 ) {
        return false;
    }

    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;
    }

    //Initialize SDL_ttf
    if( TTF_Init() == -1 ) {
        return false;
    }

    //Set the window caption
    SDL_WM_SetCaption( "Press an Arrow Key", NULL );

    //If everything initialized fine
    return true;
}

bool load_files()
{
    //Load the background image
    background = load_image( "background.png" );

    //Open the font
    font = TTF_OpenFont( "lazy.ttf", 72 );

    //If there was a problem in loading the background
    if( background == NULL ) {
        return false;
    }

    //If there was an error in loading the font
    if( font == NULL ) {
        return false;
    }

    //If everything loaded fine
    return true;
}

void clean_up()
{
    //Free the surfaces
    SDL_FreeSurface( background );
    SDL_FreeSurface( up );
    SDL_FreeSurface( down );
    SDL_FreeSurface( left );
    SDL_FreeSurface( right );

    //Close the font
    TTF_CloseFont( font );

    //Quit SDL_ttf
    TTF_Quit();

    //Quit SDL
    SDL_Quit();
}

int main( int argc, char* args[] )
{
    //Quit flag
    bool quit = false;

   //Initialize
    if( init() == false ) {
        return 1;
    }

    //Load the files
    if( load_files() == false ) {
        return 1;
    }

    //Render the text
    up = TTF_RenderText_Solid( font, "Up", textColor );
    down = TTF_RenderText_Solid( font, "Down", textColor );
    left = TTF_RenderText_Solid( font, "Left", textColor );
    right = TTF_RenderText_Solid( font, "Right", textColor );

    //While the user hasn't quit
    while( quit == false ) {
        while( SDL_PollEvent( &event ) ) {
            if( event.type == SDL_QUIT ) {
                quit = true;
            }
        }
        apply_surface( 0, 0, background, screen );

        //得到所有键的状态
        Uint8 *keystates = SDL_GetKeyState( NULL );

        //If up is pressed
        if( keystates[ SDLK_UP ] )
        {
            apply_surface( ( SCREEN_WIDTH - up->w ) / 2, ( SCREEN_HEIGHT / 2 - up->h ) / 2, up, screen );
        }

        //进行判断
        if( keystates[ SDLK_DOWN ] )
        {
            apply_surface( ( SCREEN_WIDTH - down->w ) / 2, ( SCREEN_HEIGHT / 2 - down->h ) / 2 + ( SCREEN_HEIGHT / 2 ), down, screen );
        }

        //If left is pressed
        if( keystates[ SDLK_LEFT ] )
        {
            apply_surface( ( SCREEN_WIDTH / 2 - left->w ) / 2, ( SCREEN_HEIGHT - left->h ) / 2, left, screen );
        }

        //If right is pressed
        if( keystates[ SDLK_RIGHT ] )
        {
            apply_surface( ( SCREEN_WIDTH / 2 - right->w ) / 2 + ( SCREEN_WIDTH / 2 ), ( SCREEN_HEIGHT - right->h ) / 2, right, screen );
        }

        //Update the screen
        if( SDL_Flip( screen ) == -1 ) {
            return 1;
        }
    }   //End while quit

    //Clean up
    clean_up();

    return 0;
}
代码真没什么意思,里面有一个SDL_GetKeyState()函数,得到了整个键盘的当前信息状态。也就stata值返回给一个数组。整个数组里面的值是一组键盘定义的宏,是通用的。其次还可以使用SDL_GetMouseState()得到鼠标的当前状态信息。
到这个时候,事件也差不了吧!错了还差的远,还有事件同步,异步都没提到,以及系统事件,游戏手柄事件,窗口大小,窗口重绘,还有用户自定义事件,平台相关的系统事件,其中有一个退出事件,这个应该很清楚了吧,此外有组合键事件……

昨晚写到这里,本来准备发表的,但是发表不成功,所以今天上午倒腾到现在总算搞把fedora 无线上网搞点,只不过是换到fedroa17,用上去感觉还不错,至少字体,界面好看多了。有一点小小欣喜。U盘安装fedora DVD版本(到时候我也把整个安装过程遇到的问题和大家一起分享下。

© 著作权归作者所有

一一无念
粉丝 58
博文 36
码字总数 18408
作品 0
长沙
私信 提问
【北京】北京荣唐科技有限公司招聘技术开发人员

一、 FLASH+AS3 游戏高级开发工程师(2人) 工作职责: 从事SNS平台上flash webgame游戏开发 职位描述: 1. 至少1年以上FLASH+AS3游戏项目开发经验 2. 对as3的事件机制有深入认识,具有良好编...

frendy
2012/04/12
592
7
Unity社交功能开发——移动端输入法回车事件响应

一、叙叙旧 最近工作比较忙好久没有更新博客了,笔者并没有忘记博客也没有忘记大家。游戏大概下月初就上线了,我会逐渐把做过的研究过的事情都分享出来。 二、回车事件 今天就先分享下Unity...

tj134679258
2016/06/11
0
0
开发微信小程序的必备技能图谱

今天被微信小程序彻底刷屏了,哎呀,JS开发者坐等涨工资吧。 小程序是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或者搜一下即可打开应用。也体现了“用...

Yomut
2016/09/23
144
0
北京网页游戏公司年薪20万招聘主程序(java/flex)

职位一:java服务端主程序 岗位职责: 负责设计游戏功能架构、模块划分;对于难点提出相应的解决方案,负责核心系统设计与研发。 任职要求: 4年以上java开发经验,2年以上游戏服务端开发经验...

boweihr
2011/08/10
1K
8
3D引擎的一般组件

一、 3D引擎的一般组件 1、 光影计算 2、 动画技术 3、 物理系统 4、 实时渲染 5、 人机交互 6、 网络接口 二、 3D引擎层次结构 第一层: 数学库:提供通用数学运算库(如三角函数、快速近似...

Matrix4X4
2012/08/06
138
0

没有更多内容

加载失败,请刷新页面

加载更多

安全组和云防火墙的区别

前言 熟悉云平台的朋友可能都会注意到这样一个事情:无论公有云还是私有云,创建虚拟机的时候都需要选择安全组,来对虚拟机进行安全防护;有的云平台在VPC里,还能选择防火墙,ZStack在3.6版...

ZStack社区版
32分钟前
3
0
教育性app开发的重要性和好处

在这个精通技术的世界中,流行的app主导着无聊的教育系统。当我们将技术和教育结合在一起时,它将带来当代以及强大的学习资源。因此,将教育移动app集成到您的学习过程中,并根据自己的信念把...

a429011717
33分钟前
3
0
IE6/7/8如何兼容CSS3属性

本文转载于:专业的前端网站➩IE6/7/8如何兼容CSS3属性 最近在工作中总是要求IE8兼容CSS3属性,在网上搜了搜主要是引入了一个htc文件(ie-css3.htc或者PIE.htc。个人认为这两个文件的作用差不...

前端老手
48分钟前
4
0
手把手教你ALLEGRO的约束规则的设置教程!

约束规则的设置 分三步, 定义规则(一、基本约束规则设置:1、线间距设置;2、线宽设置;3、设置过孔;4、区域约束规则设置;5、设置阻抗;6、设置走线的长度范围;7、设置等长:7.1、不过电阻的NET 等...

demyar
50分钟前
5
0
完美解决H5滚动滑动穿透方案:不使用系统滚动

网上有很多黑科技解决这个问题,都不是从根本去解决,例如通过js控制弹出时html加上position:fixed; 弹窗关闭后再去掉该样式,总觉得不太对,像是打补丁。 今天终于找到了滚动穿透的原因和完...

未来cc
55分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部