c++ - 将 SDL2 箭头/WASD 键转换为玩家移动的最佳/最可靠方法是什么?

标签 c++ sdl-2 keyboard-events

我的问题是在 SDL2 中实现定向输入的最可靠方法是什么。

我当前代码的问题是说您想将播放器向左移动。按 a 会减少他的 x 值,一旦你释放 a 键,它就会停止减少 x 值。但是,如果您想向左移动然后立即向右移动,则播放器将停止一段时间,然后继续向右移动。

任何建议都会很有帮助。

我的键盘功能:

class KeyboardController : public Component {

public: 
TransformComponent* transform;

void init() override {
    transform = &entity->getComponent<TransformComponent>();
}

void update() override {

    if (MainGame::evnt.type == SDL_KEYDOWN) {
        switch (MainGame::evnt.key.keysym.sym)
        {
        case SDLK_w:
            transform->velocity.y = -1;

            break;
        case SDLK_a:
            transform->velocity.x = -1;

            break;
        case SDLK_s:
            transform->velocity.y = 1;

            break;
        case SDLK_d:
            transform->velocity.x = 1;

            break;
        }
    } 

    if (MainGame::evnt.type == SDL_KEYUP) {
        switch (MainGame::evnt.key.keysym.sym)
        {
        case SDLK_w:
            transform->velocity.y = 0;

            break;

        case SDLK_a:
            transform->velocity.x = 0;

            break;

        case SDLK_s:
            transform->velocity.y = 0;

            break;

        case SDLK_d:
            transform->velocity.x = 0;

            break;
        }
      }
   }
};

我的速度函数:

/* class */

Vector2D position;
Vector2D velocity;

/* other code */

void update() override {
    position.x += velocity.x * speed; //speed = 3
    position.y += velocity.y * speed;
}

最佳答案

与其根据事件立即改变速度,不如考虑添加额外的状态(一个数组),它会记住在任何给定时刻按下了哪些键。每当收到输入事件时,更新数组并根据该数组重新计算速度。

例如,根据您制作的游戏,您可能希望在同时按下左右键时让玩家停止移动。或者,方向键的 keydown 事件会让玩家立即开始朝那个方向移动,但您仍然需要跟踪何时没有更多的按钮被按下,以了解玩家何时应该停止移动。

关于c++ - 将 SDL2 箭头/WASD 键转换为玩家移动的最佳/最可靠方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46514676/

相关文章:

java - 如何能够从 doxygen 的函数内部提取注释?

c - SDL2 音频问题 C 编程(不是混音器)

ios - 如何从 Skype、Whats up 等第三方应用程序的自定义键盘读取文本?

java - 有没有办法在没有 JFrame 的情况下获取键盘事件?

c++ - 如何在 Windows 上修复 cmake find_package "Could NOT find SDL2"?

使用类方法调用 Javascript 事件监听器

随机数生成器的 C++11 线程安全

c++ - Boost.spirit (x3, boost 1.64) : how to implement this recursive rule correctly, 这可能吗?

c++ - 带有 D-Bus BlueZ 的基本 BLE 客户端

window - SDL2 在不给它焦点的情况下升起一个窗口