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

时间:2014-10-05 13:37:33

标签: c user-interface gtk signals

我是c和gu的新人。这是我的问题。 这两个函数都是独立运行的,但是当我按下按键时,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);
    }
}  

1 个答案:

答案 0 :(得分:0)

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

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

或者你可以为你的游戏逻辑设置另一个线程,但这更难,你到目前为止所展示的内容都没有表明你需要它。