c++ - SDL 僵硬运动

标签 c++ sdl

我正在制作乒乓球游戏,lPad 是左垫,rPad 是右垫,但是当任何垫向上移动时以及当我松开向上按钮并按下垫停止一会儿然后然后下降,另一件事是在使用此设置按下两个控件(只有一个在移动)时我无法移动两个垫:

if(e.type == SDL_KEYDOWN) {
                    switch(e.key.keysym.sym) {

                    case SDLK_s:
                        lPad.y += 8;
                        if(lPad.y >= s.SCREEN_HEIGHT - lPad.getHeight()) {
                            lPad.y = s.SCREEN_HEIGHT - lPad.getHeight();
                        }
                        break;

                        case SDLK_w:
                        lPad.y -= 8;
                        if(lPad.y <= 0) {
                            lPad.y = 0;
                        }
                        break;

                        case SDLK_DOWN:
                        rPad.y += 8;
                        if(rPad.y >= s.SCREEN_HEIGHT - rPad.getHeight()) {
                            rPad.y = s.SCREEN_HEIGHT - rPad.getHeight();
                        }
                        break;

                        case SDLK_UP:
                        rPad.y -= 8;
                        if(rPad.y <= 0) {
                            rPad.y = 0;
                        }
                        break;

                        default:
                        break;
                    }
                }

知道如何解决这个问题并使其顺利进行吗?

最佳答案

最好使用SDL_GetKeyboardState(NULL) 作为获取输入的函数。这样,您可以同时获得键盘的整个状态,从而允许并行输入。如果您使用 while 循环,每个事件都将被单独捕获,因此会变得不稳定。

下面是一些关于如何使用它的示例代码:

  const auto * keys = SDL_GetKeyboardState(NULL);

  while(!done) {
    while(SDL_PollEvent(&e)) {
      if(e.type == SDL_QUIT) {
        done = true;
      }    
    }

    SDL_PumpEvents();

    if (keys[SDL_SCANCODE_UP]) {
      p1.set_speed(0, -60000 * delta.count());
    }
    if (keys[SDL_SCANCODE_DOWN]) {
      p1.set_speed(0, 60000 * delta.count());
    }
    if (keys[SDL_SCANCODE_LEFT]) {
      p1.set_speed(-60000 * delta.count(), 0);
    }
    if (keys[SDL_SCANCODE_RIGHT]) {
      p1.set_speed(60000 * delta.count(), 0);
    }

此外,我可以建议设置一个速度变量吗?使用像素不是缩放运动的好方法,因为它取决于屏幕的分辨率。使用基于时间步长的东西要稳健得多。

关于c++ - SDL 僵硬运动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33112758/

相关文章:

c++ - SDL 2.0 -> 传递了一个 NULL 互斥体

c++ - 让一个类的实例搜索另一个类中的数组

c++ - 是否有可能避免最终不会运行的c++模板函数部分出现错误?

c++ - 如何在 C++ 中访问和修改 std::queue 内的元素

c++ - 解码音频和视频并处理两个流——ffmpeg、sdl、opencv

c++ - 我是否应该确保在退出程序之前销毁 SDL 2.0 对象(渲染器、窗口、纹理等)?

visual-c++ - 无法找到#include "SDL.h"

c++ - 如何编写 C++ 控制台窗口程序

c++ - 计算数组值与其他数组中相同索引位置范围内的对应值

c++ - SDL:制作静态文本变量