2014-10-05 40 views
0

Iam新增至c和gu中c。这是我的问题。 这两个函数都可以独立正常工作,但是当我按下按键时,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); 
    } 
} 

回答

0

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

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

或者,您可以为您的游戏逻辑创建另一个线程,但这更困难,而且您迄今为止所显示的任何内容都表明您需要该线程。