SFML / C ++模拟用户输入

时间:2016-06-05 22:16:49

标签: c++ sfml


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

  

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

或者我必须相信自己有效吗?

2 个答案:

答案 0 :(得分:3)

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));

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

答案 1 :(得分:1)

如果您使用自己的密钥管理器,当然可以。 C语言与SDL中的一个例子(但在使用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

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