按下任意箭头键时更改函数内的变量

标签 c user-interface gtk signals

我是 c 和 c 中的 gui 新手。这就是我遇到的问题。 两个函数都可以独立正常工作,但是当我按下按键时,snake_move 函数不会改变它的键值。执行时窗口小部件甚至没有打开。 如果我不调用蛇移动,一切都会顺利,即 key_event 正在工作!如何更改代码,以便当我按任意箭头键时,snake_call 函数中的 key_val 发生变化??

提前致谢

//Detects the key and puts the value to new
static gboolean
key_event(GtkWidget *widget, GdkEventKey *event ,int* new) {
    if(strcmp(gdk_keyval_name (event->keyval),"Up")==0) {
        *new = 8;
        printf("%d\n",*new);
    } else if(strcmp(gdk_keyval_name (event->keyval),"Down")==0) {
        *new=2;
        printf("%d\n",*new);
    } else if(strcmp(gdk_keyval_name (event->keyval),"Right")==0) {
        *new=6;
        printf("%d\n",*new);
    } else if(strcmp(gdk_keyval_name (event->keyval),"Left")==0) {
        *new=4;
        printf("%d\n",*new);
    }
    return FALSE;
}
//Moves the snake by one bit in the direction specified by new (*new = 8 means up so on
void snake_loop(int**arr,int lenth,int*new,int*pos_x ,int *pos_y) {
    int x_pos,y_pos,key_value;
    x_pos=*pos_x ;y_pos =*pos_y;
    while(1) {
        key_value = *new;
        snake_move(arr ,&lenth ,key_value,&x_pos ,&y_pos);
        sleep(1);
    }
}  

最佳答案

你应该重新设计你的游戏逻辑:GTK+是一个事件驱动的系统,所以像snake_loop()中的循环一样这是一个很大的禁忌:关键事件处理代码永远不会被调用,因为执行陷入了永无止境的循环中。如果这个概念是新的,那么首先阅读事件驱动编程可能是有意义的。

您应该启动 GTK+ 主循环(使用 gtk_main() )并将代码放入根据系统事件调用的短期处理函数中。一个例子是发生的计时器事件,例如每秒一次:该计时器事件的处理函数可以更新蛇的位置。您可以使用g_timeout_add_seconds()设置计时器。

或者,您可以为游戏逻辑设置另一个线程,但这会更困难,并且到目前为止您所显示的任何内容都表明您不需要它。

关于按下任意箭头键时更改函数内的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26203071/

相关文章:

java - 在 Netbeans 中重新生成所有 Java Swing 页面的快速方法?

GTk (mm) 组合框的限制宽度

python - 如何在 pyGTK 中设置小部件的默认样式?

python - RuntimeError : Gtk couldn't be initialized. 如果要处理这种情况,请使用 Gtk.init_check()

c - 检测哪个字母最常见的程序

c - 如何使用 C 中的数组表示法访问 char *?

java - 平移时创建无限网格

java - 从另一个类添加到框架时为什么要扩展 JPanel?

c++ - 该递归函数如何工作?

循环时无法比较数组上的字符串