【问题标题】:SFML/C++ Simulating user inputSFML/C++ 模拟用户输入
【发布时间】:2016-10-05 11:10:01
【问题描述】:


我正在尝试编写一些单元测试方法。我想测试检查键是否被按下或释放的方法。这是我的问题:

是否可以在 SFML 中使用 C++ 模拟键盘上的随机按键?

或者我只需要相信自己这行得通?

【问题讨论】:

  • 我至少可以知道我投反对票的原因是什么吗?
  • 有人投票是因为他们认为这个问题太宽泛了,但这里的情况并非如此,你问的是一个特定的库。
  • 至于你的问题,en.sfml-dev.org/forums/index.php?topic=14611.0 回答了一部分(无法全局模拟)
  • @coyotte508 感谢您的回答,所以我将不得不寻找一些外部工具来处理它。

标签: c++ sfml


【解决方案1】:

sf::Keyboard::isKeyPressed 的内部结构会使模拟变得困难,但如果您希望模拟 KeyPressed 或 KeyReleased 事件,我很确定以下应该可以工作:

const sf::Event simulateKeypress(sf::Keyboard::Key key, bool alt, bool control, bool shift, bool system)
{
    sf::Event::KeyEvent data;
    data.code = key;
    data.alt = alt;
    data.control = control;
    data.shift = shift;
    data.system = system;

    sf::Event event;
    event.type = sf::Event::KeyPressed;
    event.key = data;
    return event;
}

//your handler here
handleEvent(simulateKeypress(sf::Keyboard::Key::A, false, false, false, false));

我目前无法对此进行测试...如果它有效,那么您应该能够为其他事件制作类似的功能。

【讨论】:

  • 我想你刚刚解决了我的问题 :D 谢谢你,真的很有帮助:)
  • @JakubStasiak 很高兴听到它!我认为代码是正确的?祝你的计划好运。
【解决方案2】:

如果您使用自己的密钥管理器,当然可以。 带有 SDL 的 C 中的示例(但在带有 SFML 的 C++ 中完全相同,只需更改几个名称):

    typedef struct
    {
        char key[SDLK_LAST];
        int mousex,mousey;
        int mousexrel,mouseyrel;
        char mousebuttons[8];
            char quit;
    } Input;


 void UpdateEvents(Input* in)
{
    SDL_Event event;
    while(SDL_PollEvent(&event))
    {
        switch (event.type)
        {
        case SDL_KEYDOWN:
            in->key[event.key.keysym.sym]=1;
            break;
        case SDL_KEYUP:
            in->key[event.key.keysym.sym]=0;
            break;
        case SDL_MOUSEMOTION:
            in->mousex=event.motion.x;
            in->mousey=event.motion.y;
            in->mousexrel=event.motion.xrel;
            in->mouseyrel=event.motion.yrel;
            break;
        case SDL_MOUSEBUTTONDOWN:
            in->mousebuttons[event.button.button]=1;
            break;
        case SDL_MOUSEBUTTONUP:
            in->mousebuttons[event.button.button]=0;
            break;
        case SDL_QUIT:
            in->quit = 1;
            break;
        default:
            break;
        }
    }
}

int main()
{
    Input in;

    memset(&in,0,sizeof(in));
    while(!in.key[SDLK_ESCAPE] && !in.quit)
    {
        UpdateEvents(&in);
        if (in.mousebuttons[SDL_BUTTON_LEFT])
        {
            in.mousebuttons[SDL_BUTTON_LEFT] = 0;

        }       

        if (in.key[SDLK_UP] && in.key[SDLK_LEFT])
                {

                }

    }
    return 0;
}

编辑:找到 C++ SFML 的密钥管理器:https://github.com/dabbertorres/SwiftInputManager

不能给你我自己的代码,因为代码不是英文的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2011-10-09
    相关资源
    最近更新 更多