我已经开始将SFML用作我正在开发的代码编辑器的基本图形框架,唯一似乎无法完全正确使用的是键盘输入。
在QB64(类似于Visual Basic的语言)中,我习惯使用_keyhit命令(返回虚拟键码)或inkey $命令(直接返回当前按键的字符)来获取按键)。我正在寻找类似的C ++解决方案(不一定是跨平台的,可能很容易与SFML一起实现)
到目前为止,我一直在尝试使用_getch,它似乎不适用于Windows框架或SFML,也许我应该为此目的使用一些Windows.h例程,但是要从中判断我已经看到,那些检查特定的按键,不完全是我所需要的。 SFML框架提供了“ sf :: Keyboard :: isKeyPressed”,但是该框架还检查了特定的按键,而不是整个键盘,我还尝试从“ sf :: Keyboard”创建一个用作映射的数组: :key“枚举为ASCII字符,但并不令人信服,此外,这些键似乎“粘住”了,即使释放后,按下的键的字符也会不断被读取。
答案 0 :(得分:1)
如果您使用的是SFML,它实际上非常简单。您需要使用sf :: Event :: KeyEvent类(在本例中为struct)。
https://www.sfml-dev.org/documentation/2.5.0/structsf_1_1Event_1_1KeyEvent.php
尽管要抓住的地方是您必须从某件事中获取事件。通常,这是在SFML窗口中使用的。
//assuming your code is already set up for these items...
sf::Event Event;
while (window.GetEvent(Event))
{
if (Event.Type == sf::Event::KeyPressed)
{
//to get the key code, use Event.Key.Code
//your code
//for example
switch(Event.KeyEvent.Code)
{
case(sf::Keyboard::Key::Y):
//do stuff
break;
}
}
}
抬起头,自从我使用SFML以来已经有一段时间了,所以我不确定100%是否可以将它与switch语句一起使用。在==
语句中,与if-else if-else
进行比较也可以。
可能还有其他方法可以在没有窗口的情况下获取sf::Event
的定义。
否则,这很简单。
答案 1 :(得分:1)
如果您只是想检测按键kbhit()是一种功能。(Borland编译器家族,conio.h,但当我用Google搜索它时,它不是C ++标准的一部分)。 https://www.cprogramming.com/fod/kbhit.html
替代方法:在类似Unix的操作系统上,您可以使用ncurses模仿大多数conio行为(看看它是否对您有用) https://www.quora.com/With-which-function-can-I-replace-kbhit-in-C++-because-the-header-conio-h-doesnt-exist-in-linux
如果您正在寻找可以检测到按下哪个键的代码(例如,字母上方的数字键1和1或Esc或箭头键之类的东西)。此代码在 borland编译器上为我工作。
当您获取扫描代码(不是ascii)时,键盘上的每个键都是不同的(即使非ascii都有值)void getkey()
{
union REGS ii,oo;
while(!kbhit());
ii.h.ah=0;//service no for ascii and scan code
int86(22,&ii,&oo);
ascii=oo.h.al;
scan=oo.h.ah;
}
我在学校项目中使用了上面的代码,所以我不记得确切的源代码了,但是我认为它是GUI部分下的Yashwant Kanetkar的Let us C(后来被删除了,所以你是寻找2008年之前的出版物。
希望有帮助。