GDK/GTK能识别同时按下的两个键吗?

GDK/GTK能识别同时按下的两个键吗?,gtk,gdk,Gtk,Gdk,所以我正试图开发一款平台风格的游戏,用C语言编写,并使用GTK作为我的图形工具包。现在我有一个程序在屏幕上放置三个块。其中两个是平台,第三个可以通过按左/右箭头键横向移动。(我还没有画任何精灵,所以现在我游戏中的英雄是一个蓝色矩形)。我还通过按“z”键实现了跳跃,您可以跳跃并在平台上着陆 然而,在跳跃时横向移动是相当困难的。我相信这是因为我的程序无法识别同时按下的两个键,所以你必须先松开左箭头或右箭头,按z,然后松开z,再按右箭头或左箭头,以便在空中横向移动。我希望能够按住左键或右键,同时按下z

所以我正试图开发一款平台风格的游戏,用C语言编写,并使用GTK作为我的图形工具包。现在我有一个程序在屏幕上放置三个块。其中两个是平台,第三个可以通过按左/右箭头键横向移动。(我还没有画任何精灵,所以现在我游戏中的英雄是一个蓝色矩形)。我还通过按“z”键实现了跳跃,您可以跳跃并在平台上着陆

然而,在跳跃时横向移动是相当困难的。我相信这是因为我的程序无法识别同时按下的两个键,所以你必须先松开左箭头或右箭头,按z,然后松开z,再按右箭头或左箭头,以便在空中横向移动。我希望能够按住左键或右键,同时按下z键,让英雄侧向跳跃

对于gdk密钥代码列表,请参考“gdk/gdkkeysyms.h”(在我的系统上位于/usr/include/gtk-3.0/gdk/gdkkeysyms.h),但没有给出同时使用两个密钥的任何指导。GTK/GDK能否识别同时按下两个键的事件(GDK、GTK,以两者中的哪个为准),我不清楚这两个键之间的界线在哪里,但我想这是另一个问题的主题?你将如何应用它?(对于单个键,您可以通过执行以下操作获得代码

key = event->keyval;
但我真的不知道这两把钥匙会是什么样子)


谢谢你的帮助

有两种情况需要注意

一些特殊的键称为修改键,它们会导致在
事件->状态中设置一个修改位
,因此您可以检查
例如,如果(事件->状态&GDK\u控制掩码)

只有少数常见的修改器以这种方式设置标志。对于其他按键,您需要自己跟踪单独的按下和释放事件,这将允许您确定当另一个按键到达时,一个按键是否仍被按下。 小部件信号为按键事件和按键释放事件


可能还有其他因素会给您带来麻烦,一个好的方法是创建一个小的单文件独立可编译测试用例来显示问题。您可以通过编写测试用例来解决这个问题,但如果没有,测试用例将帮助其他人帮助您。(因为他们可以用它来重现问题。)

键盘不是这样工作的:每个键都会生成一个单独的中断,这将生成一个单独的窗口系统事件,所以您必须自己保持状态

某些键实际上是特殊的,并充当其他键的修改器:Control、Shift、Alt是修改器,因此处理方式不同,即,如果按下这些键,其状态将与实际按下的键分开记录到事件数据结构中。然而,它们也将生成单独的关键事件

您只需保留按键记录,然后检查状态是否保持,例如:

static gboolean is_a_pressed = FALSE;
static gboolean is_b_pressed = FALSE;

static gboolean on_key_press (GtkWidget *w, GdkEvent *e)
{
  /* acquire key A */
  if (e->key.symbol == GDK_KEY_a)
    is_a_pressed = TRUE;

  /* acquire key B */
  if (e->key.symbol == GDK_KEY_b)
    is_b_pressed = TRUE;

  /* both keys have been pressed */
  if (is_a_pressed && is_b_pressed)
    do_something_amazing ();

  /* let the event propagate further */
  return GDK_EVENT_PROPAGATE;
}

static gboolean on_key_release (GtkWidget *w, GdkEvent *e)
{
  /* release key A */
  if (e->key.symbol == GDK_KEY_a)
    is_a_pressed = FALSE;

  /* release key B */
  if (e->key.symbol == GDK_KEY_b)
    is_b_pressed = FALSE;

  return GDK_EVENT_PROPAGATE;
}

谢谢我将尝试设置一个测试用例,看看是否可以让它识别按下的两个键。这听起来像你说的,如果一个键被按住,然后另一个键被按下,那么第二个键会产生另一个按键事件信号,我想这是真的,但我没有真正想过。因此,也许我可以尝试通过使用单独的变量跟踪每个按键的按下/释放状态来实现。在我给程序输入每个按键事件的下一次按键之前,使用一个名为“key”的变量。所以也许我需要'keyleft','keyright',和'keyz'变量…更新:是的,就是这样。我创建了变量来分别跟踪每个关键点,现在效果很好。谢谢