SFML/C++模拟用户输入

3


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

在C++中,使用SFML能否模拟键盘上的随机按键?

或者我只能相信这个方法本身有效吗?


我可以知道我被踩的原因吗? - Jakub Stasiak
有人投票认为问题太宽泛,但实际上这并不是这里的情况,你在询问一个特定的库。 - coyotte508
关于你的问题,http://en.sfml-dev.org/forums/index.php?topic=14611.0 回答了其中的一部分(无法全局模拟)。 - coyotte508
@coyotte508 感谢您的回答,那么我将不得不寻找一些外部工具来处理它。 - Jakub Stasiak
2个回答

3
sf::Keyboard::isKeyPressed 的内部实现会使模拟变得困难,但是如果您想要模拟 按键按下释放事件,我相信以下方法应该能够正常工作:
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 谢谢,真的很有帮助 :) - Jakub Stasiak
@JakubStasiak 很高兴听到这个消息!我想你的代码是正确的吧?祝你的程序好运。 - Conduit

1
如果您使用自己的密钥管理器,那么您就可以做到这一点。以下是使用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

无法提供我的代码,因为代码不是英文


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接