繁体   English   中英

如何在sdl中同时使用键盘的两个键

[英]How to use two keys of keyboard simultaneously in sdl

我正在用 SDL 用 C 语言编写一个简单的游戏,我已经定义了玩家一控制它_例如_tank 用键盘的箭头键和玩家二控制它的坦克用键“W”、“A”、“S”,键盘的“D”。

我的问题是他们不能同时按下这些键。

我有一个名为“handle_events”的函数,它控制游戏无限时的事件,它的代码如下:

int handle_events(Tank* tank,Tank* tanker, Wall walls[]){
    SDL_Event event;
    while (SDL_PollEvent(&event)) {
        if (event.type == SDL_QUIT)
            return EXIT;
        if (event.type == SDL_KEYDOWN){
            if(event.key.keysym.sym==SDLK_UP){
                move_tank_forward(tank,colliding(tank,walls));
            }else if(event.key.keysym.sym==SDLK_DOWN){
                move_tank_back(tank,colliding(tank,walls));
            } else if(event.key.keysym.sym==SDLK_RIGHT || event.key.keysym.sym==SDLK_LEFT) {
                turn_tank(event.key.keysym.sym, tank);
            } else if(event.key.keysym.sym==SDLK_w){
                move_tank_forward(tanker,colliding(tanker,walls));
            } else if (event.key.keysym.sym==SDLK_s){
                move_tank_back(tanker,colliding(tanker,walls));
            } else if(event.key.keysym.sym==SDLK_d || event.key.keysym.sym==SDLK_a){
                turn_tank(event.key.keysym.sym, tanker);
            }

        }

我正在寻找一种让两个玩家可以同时玩的方式,因为现在如果两个玩家同时按下向上键和 w 键,他们都不能移动他们的坦克。

在 Windows 上,您可以使用GetAsyncKeyState()函数。

对于 Linux 上的等效项,请参阅此问题

看来您依赖于按键重复 - 操作系统/窗口系统的功能在一些初始暂停后以固定间隔重复上次按下的按键,例如,当您在文本编辑器中按住按键时,它会在一些延迟后开始填充该符号。 但是只重复最后一个键。

使用 SDL,您应该知道何时从键盘事件的repeat字段中repeat 但是,您几乎从不想根据按键事件进行长时间的移动。 使用你当前的方案,我可以非常快速地按下一个键,坦克会移动得更快,或者我可以修改我的操作系统重复间隔。 运动,如果应该是匀速的,应该取决于时间,而不是用户按下按钮的速度。 这就是为什么你只需要考虑“确定,按钮 A 按下, - 只要它按下,我就会尝试在每个固定的更新间隔向左旋转”,当你得到按键释放事件时 - 你放弃了这个意图.

正如 Danny_ds 所说,使用键状态数组而不是事件(主要是因为重复)通常更容易和健壮 - 使用 SDL,您可以通过SDL_GetKeyboardState获得它。 制作您的update_movements或任何函数,并每 N 毫秒调用一次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM