QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 831|回复: 10

请教一个关于键盘事件的问题! 谢谢指教!

[复制链接]
发表于 2004-5-25 13:35:13 | 显示全部楼层 |阅读模式
在我的SDL程序中我设计的初衷是:
每单击一下空白键,就发射一个球!
但是由于人的动作相对于计算机反应的迟缓性!
常常键按下的时间是50ms的几倍(计算机对键的反应时间是50ms)
这样每当按一下键,就产生了几个空白键事件!
因此我的程序里,就出现了按一下空白键,发射了几个球的不正常现象!

所以,我想请教有这方面体验或经验的大哥们!
给一些解决办法或思路,以过滤多余的事件!
发表于 2004-5-25 16:13:37 | 显示全部楼层
做个毫秒级计时器,如果两个键盘事件的时间间隔小于某个时间就忽略。
回复

使用道具 举报

发表于 2004-5-25 21:46:12 | 显示全部楼层
把代码全帖出来,大家看看。
回复

使用道具 举报

发表于 2004-5-25 21:46:36 | 显示全部楼层
把代码全帖出来,大家看看。
回复

使用道具 举报

 楼主| 发表于 2004-5-25 22:28:42 | 显示全部楼层
代码这么多,
贴出来!够吓人的了!
回复

使用道具 举报

 楼主| 发表于 2004-5-26 00:34:19 | 显示全部楼层
我已经解决了这个问题,不过感觉很别扭!
下面是主程序的源代码!(代码中的方法是可以解决这个问题的,增加is_mov_ball
过滤键盘的多余事件)


int main(int argc,char* argv[]){
        int fir_emp_item=-1,i;// pointer to the first empty item in the table
        SDL_Event event;
        init_surface();
        /* the main handing procedure */
        while(1){
                draw_object(ball,ball_pos);
                if((is_mov_ball==2)&&num_ball_alive<MAX_BALLS)
                {
                        fir_emp_item++;
                        if((table[fir_emp_item].pid=fork())<0)
                                err_exit("fork()");
                        num_ball_alive++;
                        is_mov_ball=0;
                        table[fir_emp_item].status=ALIVE;
                        if(table[fir_emp_item].pid==0)   
                                child_handing();
                }
                if(table[fir_emp_item].pid>0){
                        SDL_PollEvent(&event);
                        switch(event.type){
                              case SDL_KEYDOWN:
                                if(event.key.keysym.sym==SDLK_ESCAPE){
                                        for(i=0;i<MAX_BALLS;i++){
                                                if(table.status==ALIVE)
                                                        kill(table.pid,SIGKILL);
                                                        wait(table.pid);
                                        }
                                        nor_exit();
                                }
                                       else if(event.key.keysym.sym==SDLK_SPACE&&is_mov_ball==0)
                                        is_mov_ball++;
                                else if(event.key.keysym.sym==SDLK_LEFT)
                                        pad_mov_lef=NO;
                                       else if(event.key.keysym.sym==SDLK_RIGHT)
                                        pad_mov_rig=YES;
                                else if(event.key.keysym.sym==SDLK_0)
                                        kill(table[0].pid,SIGKILL);
-----------------略
                                 break;
                        case SDL_KEYUP:
                                if(event.key.keysym.sym==SDLK_SPACE&&is_mov_ball==1)
                                        is_mov_ball++;
                                else if(event.key.keysym.sym==SDLK_LEFT)
                                        pad_mov_lef=NO;
                                else if(event.key.keysym.sym==SDLK_RIGHT)
                                        pad_mov_rig=NO;
                                break;
                        case SDL_QUIT:
                                for(i=0;i<MAX_BALLS;i++){
                                        if(table.status==ALIVE){
                                                kill(table.pid,SIGKILL);
                                                wait(table.pid);
                                        }
                                }
                                nor_exit();
                        }
-----------------略

                }
                       
        }

}
回复

使用道具 举报

发表于 2004-5-26 21:50:41 | 显示全部楼层
是个游戏么?代码给我一份,可发至[email protected]
回复

使用道具 举报

发表于 2004-5-26 23:01:08 | 显示全部楼层
我也要一分   [email protected]
回复

使用道具 举报

 楼主| 发表于 2004-5-26 23:10:46 | 显示全部楼层
呵呵!
那是什么游戏啊!
我这学期选了unix操作系统!
老师给了一个小作业!
当然,其实我也想做个游戏玩玩,可是哪有时间!
马上就要期末考试了,还要过六级,下半年还得考研!
真是忙得团团转!
如果,你们要,等完成了发给你!
本来已经搞定了,可是今天我修改一点,
没想到弄出了一点bug;
不知道是消息队列,还是共享内存出了问题!
回复

使用道具 举报

发表于 2004-5-27 23:31:59 | 显示全部楼层
其实小游戏根本用不着采用多进程,只需一个循环就能够满足需要了。
回复

使用道具 举报

 楼主| 发表于 2004-5-28 01:26:06 | 显示全部楼层
我知道!
但是这是老师的要求!
主要是检测对进程通信的理解和掌握!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-8 06:04 , Processed in 0.039023 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表