我正在尝试编写一些单元测试方法。我想测试检查按键是否被按下或释放的方法。这是我的问题:
在带有C ++的SFML中是否可以模拟键盘上的随机按键?
或者我必须相信自己有效吗?
答案 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
无法提供我自己的代码,因为代码不是英文