【问题标题】:What is the best/most solid way to translate SDL2 arrow/WASD keys to player movement?将 SDL2 箭头/WASD 键转换为玩家移动的最佳/最可靠的方法是什么?
【发布时间】:2017-10-01 16:57:24
【问题描述】:

我的问题是在 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;
}

【问题讨论】:

  • 问题标题“如何在 SDL 中进行键盘输入”与问题内容“如何修复我的播放器速度计算中的错误”不匹配。此外,从这段代码中也不清楚在第一次和第二次update 调用中设置的velocity 是否指的是相同的速度,或者何时执行这些update 调用。给定的 sn-p 与Minimal, Complete, and Verifiable example 相差甚远。
  • @VTT 如果您能想到一个明显的方法来改进问题或答案,请继续编辑它!我自己采纳了你的建议。
  • @VTT 经典堆栈溢出大声笑

标签: c++ sdl-2 keyboard-events


【解决方案1】:

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

例如,根据您正在制作的游戏,您可能希望在同时按下左右键时让玩家停止移动。或者,方向键的 keydown 事件会使玩家立即开始朝该方向移动,但您仍需要跟踪何时不再按住按钮才能知道玩家何时应该停止移动。

【讨论】:

  • 肯定会试一试,看看它是否能解决我的问题。
猜你喜欢
  • 2016-05-29
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多